/** * 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); }
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); }