public function testDispatchParserCachePurgeJob() { $httpRequest = $this->getMockBuilder('\\Onoi\\HttpRequest\\SocketRequest')->disableOriginalConstructor()->getMock(); $httpRequest->expects($this->once())->method('ping')->will($this->returnValue(true)); $instance = new DeferredRequestDispatchManager($httpRequest); $instance->reset(); $instance->isEnabledHttpDeferredRequest(true); $parameters = array('idlist' => '1|2'); $title = DIWikiPage::newFromText(__METHOD__)->getTitle(); $this->assertTrue($instance->scheduleParserCachePurgeJobWith($title, $parameters)); }
private function registerHooksForInternalUse(ApplicationFactory $applicationFactory, DeferredRequestDispatchManager $deferredRequestDispatchManager) { $queryDependencyLinksStoreFactory = new QueryDependencyLinksStoreFactory(); $queryDependencyLinksStore = $queryDependencyLinksStoreFactory->newQueryDependencyLinksStore($applicationFactory->getStore()); $transitionalDiffStore = $applicationFactory->singleton('TransitionalDiffStore'); /** * @see https://www.semantic-mediawiki.org/wiki/Hooks#SMW::SQLStore::AfterDataUpdateComplete */ $this->handlers['SMW::SQLStore::AfterDataUpdateComplete'] = function ($store, $semanticData, $compositePropertyTableDiffIterator) use($queryDependencyLinksStoreFactory, $queryDependencyLinksStore, $deferredRequestDispatchManager, $transitionalDiffStore) { // When in commandLine mode avoid deferred execution and run a process // within the same transaction $deferredRequestDispatchManager->isCommandLineMode($store->getOptions()->has('isCommandLineMode') ? $store->getOptions()->get('isCommandLineMode') : $GLOBALS['wgCommandLineMode']); $queryDependencyLinksStore->setStore($store); $subject = $semanticData->getSubject(); $slot = $transitionalDiffStore->createSlotFrom($compositePropertyTableDiffIterator); $queryDependencyLinksStore->pruneOutdatedTargetLinks($subject, $compositePropertyTableDiffIterator); $entityIdListRelevanceDetectionFilter = $queryDependencyLinksStoreFactory->newEntityIdListRelevanceDetectionFilter($store, $compositePropertyTableDiffIterator); $jobParameters = $queryDependencyLinksStore->buildParserCachePurgeJobParametersFrom($entityIdListRelevanceDetectionFilter); $deferredRequestDispatchManager->scheduleParserCachePurgeJobWith($subject->getTitle(), $jobParameters); $fulltextSearchTableFactory = new FulltextSearchTableFactory(); $textByChangeUpdater = $fulltextSearchTableFactory->newTextByChangeUpdater($store); $textByChangeUpdater->pushUpdates($compositePropertyTableDiffIterator, $deferredRequestDispatchManager, $slot); // Since we cannot predict as to when the slot is used and by whom, // schedule a job to ensure to be the last in-line to clean-up // any remaining slots for this transaction $deferredRequestDispatchManager->scheduleChronologyPurgeJobWith($subject->getTitle(), array('slot:id' => $slot)); return true; }; /** * @see https://www.semantic-mediawiki.org/wiki/Hooks#SMW::Store::AfterQueryResultLookupComplete */ $this->handlers['SMW::Store::AfterQueryResultLookupComplete'] = function ($store, &$result) use($queryDependencyLinksStore, $applicationFactory) { $queryDependencyLinksStore->setStore($store); $queryDependencyLinksStore->doUpdateDependenciesFrom($result); $applicationFactory->singleton('CachedQueryResultPrefetcher')->recordStats(); return true; }; }