public function testAddDependenciesFromQueryResultWhereObjectIdIsYetUnknownWhichRequiresToCreateTheIdOnTheFly() { $idTable = $this->getMockBuilder('\\stdClass')->setMethods(array('getIDFor', 'makeSMWPageID'))->getMock(); $idTable->expects($this->any())->method('getIDFor')->will($this->returnValue(0)); $idTable->expects($this->any())->method('makeSMWPageID')->will($this->returnValue(1001)); $connection = $this->getMockBuilder('\\SMW\\MediaWiki\\Database')->disableOriginalConstructor()->getMock(); $connection->expects($this->once())->method('delete')->with($this->equalTo(\SMWSQLStore3::QUERY_LINKS_TABLE), $this->equalTo(array('s_id' => 42))); $insert[] = array('s_id' => 42, 'o_id' => 1001); $connection->expects($this->once())->method('insert')->with($this->equalTo(\SMWSQLStore3::QUERY_LINKS_TABLE), $this->equalTo($insert)); $connectionManager = $this->getMockBuilder('\\SMW\\ConnectionManager')->disableOriginalConstructor()->getMock(); $connectionManager->expects($this->any())->method('getConnection')->will($this->returnValue($connection)); $store = $this->getMockBuilder('\\SMW\\SQLStore\\SQLStore')->disableOriginalConstructor()->setMethods(array('getObjectIds'))->getMockForAbstractClass(); $store->setConnectionManager($connectionManager); $store->expects($this->any())->method('getObjectIds')->will($this->returnValue($idTable)); $instance = new DependencyLinksTableUpdater($store); $instance->clear(); $instance->addToUpdateList(42, array(DIWikiPage::newFromText('Bar', SMW_NS_PROPERTY))); $instance->doUpdate(); }
/** * This method is called from the `SMW::Store::AfterQueryResultLookupComplete` hook * to resolve and update dependencies fetched from an embedded query and its * QueryResult object. * * @since 2.3 * * @param QueryResult|string $queryResult */ public function doUpdateDependenciesFrom($queryResult) { if (!$this->canUpdateDependencies($queryResult)) { return null; } $start = microtime(true); $subject = $queryResult->getQuery()->getContextPage(); $hash = $queryResult->getQuery()->getQueryId(); $sid = $this->dependencyLinksTableUpdater->getId($subject, $hash); if ($this->canSuppressUpdateOnSkewFactorFor($sid, $subject)) { return wfDebugLog('smw', __METHOD__ . " suppressed (skewed time) for SID " . $sid . "\n"); } $dependencyLinksTableUpdater = $this->dependencyLinksTableUpdater; $queryResultDependencyListResolver = $this->queryResultDependencyListResolver; $deferredCallableUpdate = ApplicationFactory::getInstance()->newDeferredCallableUpdate(function () use($subject, $sid, $hash, $queryResult, $dependencyLinksTableUpdater, $queryResultDependencyListResolver) { $dependencyList = $queryResultDependencyListResolver->getDependencyListFrom($queryResult); // Add extra dependencies which we only get "late" after the QueryResult // object as been resolved by the ResultPrinter, this is done to // avoid having to process the QueryResult recursively on its own // (which would carry a performance penalty) $dependencyListByLateRetrieval = $queryResultDependencyListResolver->getDependencyListByLateRetrievalFrom($queryResult); if ($dependencyList === array() && $dependencyListByLateRetrieval === array()) { return wfDebugLog('smw', 'No dependency list available ' . $hash); } // SID < 0 means the storage update/process has not been finalized // (new object hasn't been registered) if ($sid < 1 || ($sid = $dependencyLinksTableUpdater->getId($subject, $hash)) < 1) { $sid = $dependencyLinksTableUpdater->createId($subject, $hash); } $dependencyLinksTableUpdater->addToUpdateList($sid, $dependencyList); $dependencyLinksTableUpdater->addToUpdateList($sid, $dependencyListByLateRetrieval); $dependencyLinksTableUpdater->doUpdate(); }); $deferredCallableUpdate->setOrigin(__METHOD__); $deferredCallableUpdate->markAsPending($this->isCommandLineMode); $deferredCallableUpdate->enabledDeferredUpdate(true); $deferredCallableUpdate->pushToUpdateQueue(); wfDebugLog('smw', __METHOD__ . ' procTime (sec): ' . round(microtime(true) - $start, 7)); return true; }