Ejemplo n.º 1
0
 /**
  * Add data about the query and its parameters to the semantic data of
  * the given parser. The $queryKey is a string key that uniquely
  * identifies the query; this is difficult to create in a stable way
  * from the processed query object and parameters, but easy to get from
  * the raw user input.
  *
  * @param string $queryKey
  * @param SMWQuery $query
  * @param array $params
  * @param Parser $parser
  *
  * @since 1.8
  */
 public static function addQueryData($queryKey, SMWQuery $query, array $params, Parser $parser)
 {
     $mainSemanticData = SMWParseData::getSMWData($parser);
     $subject = $mainSemanticData->getSubject();
     $diSubWikiPage = new SMWDIWikiPage($subject->getDBkey(), $subject->getNamespace(), $subject->getInterwiki(), "_QUERY" . $queryKey);
     $semanticData = new SMWContainerSemanticData($diSubWikiPage);
     $description = $query->getDescription();
     // Add query string
     $propertyDi = new SMWDIProperty('_ASKST');
     $valueDi = new SMWDIBlob($description->getQueryString());
     $semanticData->addPropertyObjectValue($propertyDi, $valueDi);
     // Add query size
     $propertyDi = new SMWDIProperty('_ASKSI');
     $valueDi = new SMWDINumber($description->getSize());
     $semanticData->addPropertyObjectValue($propertyDi, $valueDi);
     // Add query depth
     $propertyDi = new SMWDIProperty('_ASKDE');
     $valueDi = new SMWDINumber($description->getDepth());
     $semanticData->addPropertyObjectValue($propertyDi, $valueDi);
     // Add query format
     $propertyDi = new SMWDIProperty('_ASKFO');
     $valueDi = new SMWDIString($params['format']->getValue());
     $semanticData->addPropertyObjectValue($propertyDi, $valueDi);
     $propertyDi = new SMWDIProperty('_ASK');
     $subObjectDi = new SMWDIContainer($semanticData);
     SMWParseData::getSMWData($parser)->addPropertyObjectValue($propertyDi, $subObjectDi);
 }
Ejemplo n.º 2
0
 private function newDiContainer($subject, $property, $errorMsg)
 {
     $containerSemanticData = new ContainerSemanticData($subject);
     if ($property !== null) {
         $containerSemanticData->addPropertyObjectValue(new DIProperty('_ERRP'), $property->getDiWikiPage());
     }
     $containerSemanticData->addPropertyObjectValue(new DIProperty('_ERRT'), new DIBlob($errorMsg));
     return new DIContainer($containerSemanticData);
 }
 protected function parseUserValueOrQuery($value, $queryMode)
 {
     if ($value === '') {
         $this->addError(wfMessage('smw_novalues')->text());
         if ($queryMode) {
             return new SMWThingDescription();
         } else {
             return;
         }
     }
     if ($queryMode) {
         $subdescriptions = array();
     } elseif (is_null($this->m_contextPage)) {
         $semanticData = SMWContainerSemanticData::makeAnonymousContainer();
     } else {
         $subobjectName = '_' . hash('md4', $value, false);
         // md4 is probably fastest of PHP's hashes
         $subject = new SMWDIWikiPage($this->m_contextPage->getDBkey(), $this->m_contextPage->getNamespace(), $this->m_contextPage->getInterwiki(), $subobjectName);
         $semanticData = new SMWContainerSemanticData($subject);
     }
     // #664 / T17732
     $value = str_replace("\\;", "-3B", $value);
     // Bug 21926 / T23926
     // Values that use html entities are encoded with a semicolon
     $value = htmlspecialchars_decode($value, ENT_QUOTES);
     $values = preg_split('/[\\s]*;[\\s]*/u', trim($value));
     $valueIndex = 0;
     // index in value array
     $propertyIndex = 0;
     // index in property list
     $empty = true;
     foreach ($this->getPropertyDataItems() as $diProperty) {
         if (!array_key_exists($valueIndex, $values)) {
             break;
             // stop if there are no values left
         }
         $values[$valueIndex] = str_replace("-3B", ";", $values[$valueIndex]);
         if ($queryMode) {
             // special handling for supporting query parsing
             $comparator = SMW_CMP_EQ;
             self::prepareValue($values[$valueIndex], $comparator);
         }
         // generating the DVs:
         if ($values[$valueIndex] === '' || $values[$valueIndex] == '?') {
             // explicit omission
             $valueIndex++;
         } else {
             $dataValue = \SMW\DataValueFactory::getInstance()->newPropertyObjectValue($diProperty, $values[$valueIndex]);
             if ($dataValue->isValid()) {
                 // valid DV: keep
                 if ($queryMode) {
                     $subdescriptions[] = new SMWSomeProperty($diProperty, new SMWValueDescription($dataValue->getDataItem(), $dataValue->getProperty(), $comparator));
                 } else {
                     $semanticData->addPropertyObjectValue($diProperty, $dataValue->getDataItem());
                 }
                 $valueIndex++;
                 $empty = false;
             } elseif (count($values) - $valueIndex == count($this->m_diProperties) - $propertyIndex) {
                 // too many errors: keep this one to have enough slots left
                 if (!$queryMode) {
                     $semanticData->addPropertyObjectValue($diProperty, $dataValue->getDataItem());
                 }
                 $this->addError($dataValue->getErrors());
                 ++$valueIndex;
             }
         }
         ++$propertyIndex;
     }
     if ($empty) {
         $this->addError(wfMessage('smw_novalues')->text());
     }
     if ($queryMode) {
         switch (count($subdescriptions)) {
             case 0:
                 return new SMWThingDescription();
             case 1:
                 return reset($subdescriptions);
             default:
                 return new SMWConjunction($subdescriptions);
         }
     } else {
         $this->m_dataitem = new SMWDIContainer($semanticData);
     }
 }
 protected function parseUserValue($value)
 {
     if ($value === '') {
         $this->addError(wfMessage('smw_novalues')->text());
         return;
     }
     if (is_null($this->m_contextPage)) {
         $semanticData = SMWContainerSemanticData::makeAnonymousContainer();
     } else {
         $subobjectName = '_' . hash('md4', $value, false);
         // md4 is probably fastest of PHP's hashes
         $subject = new SMWDIWikiPage($this->m_contextPage->getDBkey(), $this->m_contextPage->getNamespace(), $this->m_contextPage->getInterwiki(), $subobjectName);
         $semanticData = new SMWContainerSemanticData($subject);
     }
     $values = $this->getValuesFromString($value);
     $valueIndex = 0;
     // index in value array
     $propertyIndex = 0;
     // index in property list
     $empty = true;
     foreach ($this->getPropertyDataItems() as $diProperty) {
         if (!array_key_exists($valueIndex, $values) || $this->getErrors() !== array()) {
             break;
             // stop if there are no values left
         }
         $values[$valueIndex] = str_replace("-3B", ";", $values[$valueIndex]);
         // generating the DVs:
         if ($values[$valueIndex] === '' || $values[$valueIndex] == '?') {
             // explicit omission
             $valueIndex++;
         } else {
             $dataValue = \SMW\DataValueFactory::getInstance()->newPropertyObjectValue($diProperty, $values[$valueIndex]);
             if ($dataValue->isValid()) {
                 // valid DV: keep
                 $semanticData->addPropertyObjectValue($diProperty, $dataValue->getDataItem());
                 $valueIndex++;
                 $empty = false;
             } elseif (count($values) - $valueIndex == count($this->m_diProperties) - $propertyIndex) {
                 $semanticData->addPropertyObjectValue($diProperty, $dataValue->getDataItem());
                 $this->addError($dataValue->getErrors());
                 ++$valueIndex;
             }
         }
         ++$propertyIndex;
     }
     if ($empty && $this->getErrors() === array()) {
         $this->addError(wfMessage('smw_novalues')->text());
     }
     $this->m_dataitem = new SMWDIContainer($semanticData);
 }