public function testGetPropertyValues() { $instance = new SemanticData(DIWikiPage::newFromTitle(Title::newFromText(__METHOD__))); $this->assertInstanceOf('SMW\\DIWikiPage', $instance->getSubject()); $this->assertEmpty($instance->getPropertyValues(new DIProperty('Foo', true))); $this->assertEmpty($instance->getPropertyValues(new DIProperty('Foo'))); }
private function compareWithKey($propertyKey) { if ($this->hasDiff()) { return; } $property = new DIProperty($propertyKey); $newValues = $this->semanticData->getPropertyValues($property); $oldValues = $this->store->getPropertyValues($this->semanticData->getSubject(), $property); $this->notifyDispatcher(!$this->isEqual($oldValues, $newValues)); }
/** * @since 2.4 * * @param SemanticData $semanticData * * @return string */ public static function createFromSemanticData(SemanticData $semanticData) { $hash = array(); $hash[] = $semanticData->getSubject()->getSerialization(); foreach ($semanticData->getProperties() as $property) { $hash[] = $property->getKey(); foreach ($semanticData->getPropertyValues($property) as $di) { $hash[] = $di->getSerialization(); } } foreach ($semanticData->getSubSemanticData() as $data) { $hash[] = $data->getHash(); } sort($hash); return md5(implode('#', $hash)); }
/** * Removes data from the given SMWSemanticData. * If the subject of the data that is to be removed is not equal to the * subject of this SMWSemanticData, it will just be ignored (nothing to * remove). Likewise, removing data that is not present does not change * anything. * * @since 1.8 * * @param SemanticData $semanticData */ public function removeDataFrom(SemanticData $semanticData) { if (!$this->mSubject->equals($semanticData->getSubject())) { return; } foreach ($semanticData->getProperties() as $property) { $values = $semanticData->getPropertyValues($property); foreach ($values as $dataItem) { $this->removePropertyObjectValue($property, $dataItem); } } foreach ($semanticData->getSubSemanticData() as $semData) { $this->removeSubSemanticData($semData); } }
/** * Creates the HTML table displaying the data of one subject. * * @param[in] $data SMWSemanticData The data to be displayed * @param[in] $left bool Should properties be displayed on the left side? * @param[in] $incoming bool Is this an incoming? Or an outgoing? * * @return string A string containing the HTML with the factbox */ private function displayData(SemanticData $data, $left = true, $incoming = false) { // Some of the CSS classes are different for the left or the right side. // In this case, there is an "i" after the "smwb-". This is set here. $ccsPrefix = $left ? 'smwb-' : 'smwb-i'; $html = "<table class=\"{$ccsPrefix}factbox\" cellpadding=\"0\" cellspacing=\"0\">\n"; $diProperties = $data->getProperties(); $noresult = true; foreach ($diProperties as $key => $diProperty) { $dvProperty = DataValueFactory::getInstance()->newDataValueByItem($diProperty, null); if ($dvProperty->isVisible()) { $dvProperty->setCaption($this->getPropertyLabel($dvProperty, $incoming)); $proptext = $dvProperty->getShortHTMLText(smwfGetLinker()) . "\n"; } elseif ($diProperty->getKey() == '_INST') { $proptext = smwfGetLinker()->specialLink('Categories'); } elseif ($diProperty->getKey() == '_REDI') { $proptext = smwfGetLinker()->specialLink('Listredirects', 'isredirect'); } else { continue; // skip this line } $head = '<th>' . $proptext . "</th>\n"; $body = "<td>\n"; $values = $data->getPropertyValues($diProperty); if ($incoming && count($values) >= $this->incomingValuesCount) { $moreIncoming = true; array_pop($values); } else { $moreIncoming = false; } $first = true; foreach ($values as $di) { if ($first) { $first = false; } else { $body .= ', '; } if ($incoming) { $dv = DataValueFactory::getInstance()->newDataValueByItem($di, null); } else { $dv = DataValueFactory::getInstance()->newDataValueByItem($di, $diProperty); } // For a redirect, disable the DisplayTitle to show the original (aka source) page if ($diProperty->getKey() == '_REDI') { $dv->setOption('smwgDVFeatures', $dv->getOptionBy('smwgDVFeatures') & ~SMW_DV_WPV_DTITLE); } $body .= "<span class=\"{$ccsPrefix}value\">" . $this->displayValue($dvProperty, $dv, $incoming) . "</span>\n"; } // Added in 2.3 // link to the remaining incoming pages if ($moreIncoming && \Hooks::run('SMW::Browse::BeforeIncomingPropertyValuesFurtherLinkCreate', array($diProperty, $this->subject->getDataItem(), &$body))) { $body .= \Html::element('a', array('href' => \SpecialPage::getSafeTitleFor('SearchByProperty')->getLocalURL(array('property' => $dvProperty->getWikiValue(), 'value' => $this->subject->getWikiValue()))), wfMessage('smw_browse_more')->text()); } $body .= "</td>\n"; // display row $html .= "<tr class=\"{$ccsPrefix}propvalue\">\n" . ($left ? $head . $body : $body . $head) . "</tr>\n"; $noresult = false; } // end foreach properties if ($noresult) { $html .= "<tr class=\"smwb-propvalue\"><th>   </th><td><em>" . wfMessage($incoming ? 'smw_browse_no_incoming' : 'smw_browse_no_outgoing')->escaped() . "</em></td></tr>\n"; } $html .= "</table>\n"; return $html; }
private function checkForRequiredRedirectUpdate(SemanticData $semanticData) { // Check only during online-mode so that when a user operates Special:MovePage // or #redirect the same process is applied if (!$this->enabledWithUpdateJobs) { return $semanticData; } $redirects = $semanticData->getPropertyValues(new DIProperty('_REDI')); if ($redirects !== array() && !$semanticData->getSubject()->equals(end($redirects))) { return $this->handleYetUnknownRedirectTarget($semanticData, end($redirects)); } return $semanticData; }
private function assertThatSemanticDataIsIndeedEmpty(SemanticData $semanticData) { $property = new DIProperty('_SKEY'); foreach ($semanticData->getPropertyValues($property) as $dataItem) { $semanticData->removePropertyObjectValue($property, $dataItem); } return $semanticData->isEmpty(); }
/** * Renders table content for a given SMWSemanticData object * * @since 1.9 * * @param SMWSemanticData $semanticData */ protected function getTableContent(SemanticData $semanticData) { Profiler::In(__METHOD__); // Do exclude some tags from processing otherwise the display // can become distorted due to unresolved/open tags (see Bug 23185) $excluded = array('table', 'tr', 'th', 'td', 'dl', 'dd', 'ul', 'li', 'ol', 'b', 'sup', 'sub'); $attributes = array(); foreach ($semanticData->getProperties() as $propertyDi) { $propertyDv = $this->dataValueFactory->newDataItemValue($propertyDi, null); if (!$propertyDi->isShown()) { // showing this is not desired, hide continue; } elseif ($propertyDi->isUserDefined()) { // User defined property (@note the preg_replace is a slight // hack to ensure that the left column does not get too narrow) $propertyDv->setCaption(preg_replace('/[ ]/u', ' ', $propertyDv->getWikiValue(), 2)); $attributes['property'] = array('class' => 'smwpropname'); $attributes['values'] = array('class' => 'smwprops'); } elseif ($propertyDv->isVisible()) { // Predefined property $attributes['property'] = array('class' => 'smwspecname'); $attributes['values'] = array('class' => 'smwspecs'); } else { // predefined, internal property // @codeCoverageIgnoreStart continue; // @codeCoverageIgnoreEnd } $valuesHtml = array(); foreach ($semanticData->getPropertyValues($propertyDi) as $dataItem) { $dataValue = $this->dataValueFactory->newDataItemValue($dataItem, $propertyDi); $dataValue->setServiceLinksRenderState(false); if ($dataValue->isValid()) { $valuesHtml[] = Sanitizer::removeHTMLtags($dataValue->getLongWikiText(true), null, array(), array(), $excluded) . $dataValue->getInfolinkText(SMW_OUTPUT_WIKI); } } // Invoke table content $this->tableBuilder->addCell($propertyDv->getShortWikiText(true), $attributes['property']); $this->tableBuilder->addCell($this->messageBuilder->listToCommaSeparatedText($valuesHtml), $attributes['values']); $this->tableBuilder->addRow(); } Profiler::Out(__METHOD__); }
/** * Create an array of rows to insert into property tables in order to * store the given SMWSemanticData. The given $sid (subject page id) is * used directly and must belong to the subject of the data container. * Sortkeys are ignored since they are not stored in a property table * but in the ID table. * * The returned array uses property table names as keys and arrays of * table rows as values. Each table row is an array mapping column * names to values. * * @note Property tables that do not use ids as subjects are ignored. * This just excludes redirects that are handled differently anyway; * it would not make a difference to include them here. * * @since 1.8 * * @param integer $sid * @param SemanticData $semanticData * * @return array */ private function mapToInsertValueFormat($sid, SemanticData $semanticData) { $updates = array(); $subject = $semanticData->getSubject(); $propertyTables = $this->store->getPropertyTables(); foreach ($semanticData->getProperties() as $property) { $tableId = $this->store->findPropertyTableID($property); // not stored in a property table, e.g., sortkeys if ($tableId === null) { continue; } // "Notice: Undefined index" if (!isset($propertyTables[$tableId])) { throw new RuntimeException("Unable to find a property table for " . $property->getKey()); } $propertyTable = $propertyTables[$tableId]; // not using subject ids, e.g., redirects if (!$propertyTable->usesIdSubject()) { continue; } $insertValues = array('s_id' => $sid); if (!$propertyTable->isFixedPropertyTable()) { $insertValues['p_id'] = $this->store->getObjectIds()->makeSMWPropertyID($property); } foreach ($semanticData->getPropertyValues($property) as $dataItem) { if ($dataItem instanceof DIError) { // ignore error values continue; } if (!array_key_exists($propertyTable->getName(), $updates)) { $updates[$propertyTable->getName()] = array(); } $dataItemValues = $this->store->getDataItemHandlerForDIType($dataItem->getDIType())->getInsertValues($dataItem); // Ensure that the sortkey is a string if (isset($dataItemValues['o_sortkey'])) { $dataItemValues['o_sortkey'] = (string) $dataItemValues['o_sortkey']; } // Make sure to build a unique set without duplicates which could happen // if an annotation is made to a property that has a redirect pointing // to the same p_id $insertValues = array_merge($insertValues, $dataItemValues); $insertValuesHash = md5(implode('#', $insertValues)); $updates[$propertyTable->getName()][$insertValuesHash] = $insertValues; } } // Special handling of Concepts if ($subject->getNamespace() === SMW_NS_CONCEPT && $subject->getSubobjectName() == '') { $this->fetchConceptTableInserts($sid, $updates); } return $updates; }