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;
 }