/** * Update the store to contain the given data, without taking any * subobject data into account. * * @since 1.8 * @param SMWSemanticData $data */ protected function doFlatDataUpdate(SMWSemanticData $data) { $subject = $data->getSubject(); if ($this->store->canUseUpdateFeature(SMW_TRX_UPDATE)) { $this->store->getConnection()->beginTransaction(__METHOD__); } // Take care of redirects $redirects = $data->getPropertyValues(new SMWDIProperty('_REDI')); if (count($redirects) > 0) { $redirect = end($redirects); // at most one redirect per page $this->updateRedirects($subject->getDBkey(), $subject->getNamespace(), $redirect->getDBkey(), $redirect->getNameSpace()); // Stop here: // * no support for annotations on redirect pages // * updateRedirects takes care of deleting any previous data $this->store->getConnection()->commitTransaction(__METHOD__); return; } else { $this->updateRedirects($subject->getDBkey(), $subject->getNamespace()); } // Take care of the sortkey $sortkeyDataItems = $data->getPropertyValues(new SMWDIProperty('_SKEY')); $sortkeyDataItem = end($sortkeyDataItems); if ($sortkeyDataItem instanceof SMWDIBlob) { $sortkey = $sortkeyDataItem->getString(); } else { // default sortkey $sortkey = $subject->getSortKey(); } // #649 Be consistent about how sortkeys are stored therefore always // normalize even for usages like {{DEFAULTSORT: Foo_bar }} $sortkey = str_replace('_', ' ', $sortkey); // Always make an ID; this also writes sortkey and namespace data $sid = $this->store->getObjectIds()->makeSMWPageID($subject->getDBkey(), $subject->getNamespace(), $subject->getInterwiki(), $subject->getSubobjectName(), true, $sortkey, true); // Take care of all remaining property table data list($deleteRows, $insertRows, $newHashes) = $this->preparePropertyTableUpdates($sid, $data); $this->writePropertyTableUpdates($sid, $deleteRows, $insertRows, $newHashes); if ($redirects === array() && $subject->getSubobjectName() === '') { $dataItemFromId = $this->store->getObjectIds()->getDataItemForId($sid); // If for some reason the internal redirect marker is still set but no // redirect annotations are known then do update the interwiki field if ($dataItemFromId !== null && $dataItemFromId->getInterwiki() === SMW_SQL3_SMWREDIIW) { $this->store->getObjectIds()->updateInterwikiField($sid, $subject); } } // Update caches (may be important if jobs are directly following this call) $this->setSemanticDataCache($sid, $data); $this->store->getConnection()->commitTransaction(__METHOD__); // TODO Make overall diff SMWSemanticData containers and return them. // This can only be done here, since the $deleteRows/$insertRows // alone do not have enough information to compute this later (sortkey // and redirects may also change). }