public function testDisabledSubcategoryLookup() { $store = $this->getMockBuilder('\\SMW\\Store')->disableOriginalConstructor()->getMockForAbstractClass(); $cache = $this->getMockBuilder('\\Onoi\\Cache\\Cache')->disableOriginalConstructor()->getMock(); $cache->expects($this->never())->method('contains')->will($this->returnValue(false)); $instance = new PropertyHierarchyLookup($store, $cache); $instance->setSubcategoryDepth(0); $this->assertFalse($instance->hasSubcategoryFor(DIWikiPage::newFromText('Foo', NS_CATEGORY))); }
/** * @since 2.2 * * @return QueryEngine */ public function newMasterQueryEngine() { $engineOptions = new EngineOptions(); $propertyHierarchyLookup = new PropertyHierarchyLookup($this->store, $this->applicationFactory->newCacheFactory()->newFixedInMemoryCache(500)); $propertyHierarchyLookup->setSubcategoryDepth($this->applicationFactory->getSettings()->get('smwgQSubcategoryDepth')); $propertyHierarchyLookup->setSubpropertyDepth($this->applicationFactory->getSettings()->get('smwgQSubpropertyDepth')); $circularReferenceGuard = new CircularReferenceGuard('sparql-query'); $circularReferenceGuard->setMaxRecursionDepth(2); $compoundConditionBuilder = new CompoundConditionBuilder($engineOptions); $compoundConditionBuilder->setCircularReferenceGuard($circularReferenceGuard); $compoundConditionBuilder->setPropertyHierarchyLookup($propertyHierarchyLookup); $queryEngine = new QueryEngine($this->store->getConnection('sparql'), $compoundConditionBuilder, new QueryResultFactory($this->store), $engineOptions); return $queryEngine; }
private function doMatchSubproperty(&$subjects, DIProperty $property) { $subproperties = $this->propertyHierarchyLookup->findSubpropertListFor($property); foreach ($subproperties as $subproperty) { $this->doMatchProperty($subjects, new DIProperty($subproperty->getDBKey())); } }
private function doMatchSubproperty(&$subjects, $subject, DIProperty $property) { $subproperties = array(); // Using the DBKey as short-cut, as we don't expect to match sub-properties for // pre-defined properties instead it should be sufficient for user-defined // properties to rely on the normalized DBKey (e.g Has_page) if (!isset($subjects[$subject->getHash()]) && !isset($this->propertyDependencyExemptionlist[$subject->getDBKey()])) { $subproperties = $this->propertyHierarchyLookup->findSubpropertListFor($property); } foreach ($subproperties as $subproperty) { if (isset($this->propertyDependencyExemptionlist[$subproperty->getDBKey()])) { continue; } $subjects[$subproperty->getHash()] = $subproperty; $this->doMatchProperty($subjects, new DIProperty($subproperty->getDBKey())); } }
private function registerCallbackHandlersByConstructedInstance($callbackLoader) { /** * @var BlobStore */ $callbackLoader->registerCallback('BlobStore', function ($namespace, $cacheType = null, $ttl = 0) use($callbackLoader) { $callbackLoader->registerExpectedReturnType('BlobStore', '\\Onoi\\BlobStore\\BlobStore'); $cacheFactory = $callbackLoader->load('CacheFactory'); $blobStore = new BlobStore($namespace, $cacheFactory->newMediaWikiCompositeCache($cacheType)); $blobStore->setNamespacePrefix($cacheFactory->getCachePrefix()); $blobStore->setExpiryInSeconds($ttl); $blobStore->setUsageState($cacheType !== CACHE_NONE && $cacheType !== false); return $blobStore; }); /** * @var CachedQueryResultPrefetcher */ $callbackLoader->registerCallback('CachedQueryResultPrefetcher', function ($cacheType = null) use($callbackLoader) { $callbackLoader->registerExpectedReturnType('CachedQueryResultPrefetcher', '\\SMW\\CachedQueryResultPrefetcher'); $settings = $callbackLoader->load('Settings'); $cacheType = $cacheType === null ? $settings->get('smwgQueryResultCacheType') : $cacheType; $cachedQueryResultPrefetcher = new CachedQueryResultPrefetcher($callbackLoader->load('Store'), $callbackLoader->singleton('QueryFactory'), $callbackLoader->create('BlobStore', CachedQueryResultPrefetcher::CACHE_NAMESPACE, $cacheType, $settings->get('smwgQueryResultCacheLifetime')), $callbackLoader->singleton('TransientStatsdCollector', CachedQueryResultPrefetcher::STATSD_ID)); $cachedQueryResultPrefetcher->setLogger($callbackLoader->singleton('MediaWikiLogger')); $cachedQueryResultPrefetcher->setNonEmbeddedCacheLifetime($settings->get('smwgQueryResultNonEmbeddedCacheLifetime')); return $cachedQueryResultPrefetcher; }); /** * @var CachedPropertyValuesPrefetcher */ $callbackLoader->registerCallback('CachedPropertyValuesPrefetcher', function ($cacheType = null, $ttl = 604800) use($callbackLoader) { $callbackLoader->registerExpectedReturnType('CachedPropertyValuesPrefetcher', '\\SMW\\CachedPropertyValuesPrefetcher'); $cachedPropertyValuesPrefetcher = new CachedPropertyValuesPrefetcher($callbackLoader->load('Store'), $callbackLoader->load('BlobStore', CachedPropertyValuesPrefetcher::CACHE_NAMESPACE, $cacheType, $ttl)); return $cachedPropertyValuesPrefetcher; }); /** * @var TransientStatsdCollector */ $callbackLoader->registerCallback('TransientStatsdCollector', function ($id) use($callbackLoader) { $callbackLoader->registerExpectedReturnType('TransientStatsdCollector', '\\SMW\\TransientStatsdCollector'); // Explicitly use the DB to access a SqlBagOstuff instance $cacheType = CACHE_DB; $ttl = 0; $transientStatsdCollector = new TransientStatsdCollector($callbackLoader->create('BlobStore', TransientStatsdCollector::CACHE_NAMESPACE, $cacheType, $ttl), $id); return $transientStatsdCollector; }); /** * @var PropertySpecificationLookup */ $callbackLoader->registerCallback('PropertySpecificationLookup', function () use($callbackLoader) { $callbackLoader->registerExpectedReturnType('PropertySpecificationLookup', '\\SMW\\PropertySpecificationLookup'); $propertySpecificationLookup = new PropertySpecificationLookup($callbackLoader->singleton('CachedPropertyValuesPrefetcher'), $callbackLoader->singleton('InMemoryPoolCache')->getPoolCacheById(PropertySpecificationLookup::POOLCACHE_ID)); // Uses the language object selected in user preferences. It is one // of two global language objects $propertySpecificationLookup->setLanguageCode(Localizer::getInstance()->getUserLanguage()->getCode()); return $propertySpecificationLookup; }); /** * @var PropertyHierarchyLookup */ $callbackLoader->registerCallback('PropertyHierarchyLookup', function () use($callbackLoader) { $callbackLoader->registerExpectedReturnType('PropertyHierarchyLookup', '\\SMW\\PropertyHierarchyLookup'); $propertyHierarchyLookup = new PropertyHierarchyLookup($callbackLoader->load('Store'), $callbackLoader->singleton('InMemoryPoolCache')->getPoolCacheById(PropertyHierarchyLookup::POOLCACHE_ID)); $propertyHierarchyLookup->setSubcategoryDepth($callbackLoader->load('Settings')->get('smwgQSubcategoryDepth')); $propertyHierarchyLookup->setSubpropertyDepth($callbackLoader->load('Settings')->get('smwgQSubpropertyDepth')); return $propertyHierarchyLookup; }); /** * @var PropertyLabelFinder */ $callbackLoader->registerCallback('PropertyLabelFinder', function () use($callbackLoader) { $callbackLoader->registerExpectedReturnType('PropertyLabelFinder', '\\SMW\\PropertyLabelFinder'); $extraneousLanguage = Localizer::getInstance()->getExtraneousLanguage(); $propertyLabelFinder = new PropertyLabelFinder($callbackLoader->load('Store'), $extraneousLanguage->getPropertyLabels(), $extraneousLanguage->getCanonicalPropertyLabels()); return $propertyLabelFinder; }); /** * @var TransitionalDiffStore */ $callbackLoader->registerCallback('TransitionalDiffStore', function () use($callbackLoader) { $callbackLoader->registerExpectedReturnType('TransitionalDiffStore', '\\SMW\\SQLStore\\TransitionalDiffStore'); $cacheFactory = $callbackLoader->load('CacheFactory'); $cacheType = null; $transitionalDiffStore = new TransitionalDiffStore($cacheFactory->newMediaWikiCompositeCache($cacheType), $cacheFactory->getCachePrefix()); $transitionalDiffStore->setLogger($callbackLoader->singleton('MediaWikiLogger')); return $transitionalDiffStore; }); }
private function addCallbackHandlers($basePath, $globalVars) { $eventHandler = EventHandler::getInstance(); $applicationFactory = ApplicationFactory::getInstance(); $propertyHierarchyLookup = new PropertyHierarchyLookup($applicationFactory->getStore(), $applicationFactory->newCacheFactory()->newFixedInMemoryCache(500)); $propertyHierarchyLookup->setSubcategoryDepth($applicationFactory->getSettings()->get('smwgQSubcategoryDepth')); $propertyHierarchyLookup->setSubpropertyDepth($applicationFactory->getSettings()->get('smwgQSubpropertyDepth')); /** * Hook: ParserAfterTidy to add some final processing to the fully-rendered page output * * @see https://www.mediawiki.org/wiki/Manual:Hooks/ParserAfterTidy */ $this->handlers['ParserAfterTidy'] = function (&$parser, &$text) { $parserAfterTidy = new ParserAfterTidy($parser, $text); return $parserAfterTidy->process(); }; /** * Hook: Called by BaseTemplate when building the toolbox array and * returning it for the skin to output. * * @see https://www.mediawiki.org/wiki/Manual:Hooks/BaseTemplateToolbox */ $this->handlers['BaseTemplateToolbox'] = function ($skinTemplate, &$toolbox) { $baseTemplateToolbox = new BaseTemplateToolbox($skinTemplate, $toolbox); return $baseTemplateToolbox->process(); }; /** * Hook: Allows extensions to add text after the page content and article * metadata. * * @see https://www.mediawiki.org/wiki/Manual:Hooks/SkinAfterContent */ $this->handlers['SkinAfterContent'] = function (&$data, $skin = null) { $skinAfterContent = new SkinAfterContent($data, $skin); return $skinAfterContent->process(); }; /** * Hook: Called after parse, before the HTML is added to the output * * @see https://www.mediawiki.org/wiki/Manual:Hooks/OutputPageParserOutput */ $this->handlers['OutputPageParserOutput'] = function (&$outputPage, $parserOutput) { $outputPageParserOutput = new OutputPageParserOutput($outputPage, $parserOutput); return $outputPageParserOutput->process(); }; /** * Hook: Add changes to the output page, e.g. adding of CSS or JavaScript * * @see https://www.mediawiki.org/wiki/Manual:Hooks/BeforePageDisplay */ $this->handlers['BeforePageDisplay'] = function (&$outputPage, &$skin) { $beforePageDisplay = new BeforePageDisplay($outputPage, $skin); return $beforePageDisplay->process(); }; /** * Hook: InternalParseBeforeLinks is used to process the expanded wiki * code after <nowiki>, HTML-comments, and templates have been treated. * * @see https://www.mediawiki.org/wiki/Manual:Hooks/InternalParseBeforeLinks */ $this->handlers['InternalParseBeforeLinks'] = function (&$parser, &$text) { $internalParseBeforeLinks = new InternalParseBeforeLinks($parser, $text); return $internalParseBeforeLinks->process(); }; /** * Hook: NewRevisionFromEditComplete called when a revision was inserted * due to an edit * * @see https://www.mediawiki.org/wiki/Manual:Hooks/NewRevisionFromEditComplete */ $this->handlers['NewRevisionFromEditComplete'] = function ($wikiPage, $revision, $baseId, $user) { $newRevisionFromEditComplete = new NewRevisionFromEditComplete($wikiPage, $revision, $baseId, $user); return $newRevisionFromEditComplete->process(); }; /** * Hook: TitleMoveComplete occurs whenever a request to move an article * is completed * * @see https://www.mediawiki.org/wiki/Manual:Hooks/TitleMoveComplete */ $this->handlers['TitleMoveComplete'] = function (&$oldTitle, &$newTitle, &$user, $oldId, $newId) { $titleMoveComplete = new TitleMoveComplete($oldTitle, $newTitle, $user, $oldId, $newId); return $titleMoveComplete->process(); }; /** * Hook: ArticlePurge executes before running "&action=purge" * * @see https://www.mediawiki.org/wiki/Manual:Hooks/ArticlePurge */ $this->handlers['ArticlePurge'] = function (&$wikiPage) { $articlePurge = new ArticlePurge(); return $articlePurge->process($wikiPage); }; /** * Hook: ArticleDelete occurs whenever the software receives a request * to delete an article * * @see https://www.mediawiki.org/wiki/Manual:Hooks/ArticleDelete */ $this->handlers['ArticleDelete'] = function (&$wikiPage, &$user, &$reason, &$error) { $articleDelete = new ArticleDelete($wikiPage, $user, $reason, $error); return $articleDelete->process(); }; /** * Hook: LinksUpdateConstructed called at the end of LinksUpdate() construction * * @see https://www.mediawiki.org/wiki/Manual:Hooks/LinksUpdateConstructed */ $this->handlers['LinksUpdateConstructed'] = function ($linksUpdate) { $linksUpdateConstructed = new LinksUpdateConstructed($linksUpdate); return $linksUpdateConstructed->process(); }; /** * Hook: Add extra statistic at the end of Special:Statistics * * @see https://www.mediawiki.org/wiki/Manual:Hooks/SpecialStatsAddExtra */ $this->handlers['SpecialStatsAddExtra'] = function (&$extraStats) use($globalVars) { $specialStatsAddExtra = new SpecialStatsAddExtra($extraStats, $globalVars['wgVersion'], $globalVars['wgLang']); return $specialStatsAddExtra->process(); }; /** * Hook: For extensions adding their own namespaces or altering the defaults * * @Bug 34383 * @see https://www.mediawiki.org/wiki/Manual:Hooks/CanonicalNamespaces */ $this->handlers['CanonicalNamespaces'] = function (&$list) { $list = $list + NamespaceManager::getCanonicalNames(); return true; }; /** * @see https://www.mediawiki.org/wiki/Manual:Hooks/FileUpload * * @since 1.9.1 */ $this->handlers['FileUpload'] = function ($file, $reupload) { $fileUpload = new FileUpload($file, $reupload); return $fileUpload->process(); }; /** * @see https://www.mediawiki.org/wiki/Manual:Hooks/ResourceLoaderGetConfigVars */ $this->handlers['ResourceLoaderGetConfigVars'] = function (&$vars) { $resourceLoaderGetConfigVars = new ResourceLoaderGetConfigVars($vars); return $resourceLoaderGetConfigVars->process(); }; /** * @see https://www.mediawiki.org/wiki/Manual:Hooks/GetPreferences */ $this->handlers['GetPreferences'] = function ($user, &$preferences) { $getPreferences = new GetPreferences($user, $preferences); return $getPreferences->process(); }; /** * @see https://www.mediawiki.org/wiki/Manual:Hooks/SkinTemplateNavigation */ $this->handlers['SkinTemplateNavigation'] = function (&$skinTemplate, &$links) { $skinTemplateNavigation = new SkinTemplateNavigation($skinTemplate, $links); return $skinTemplateNavigation->process(); }; /** * @see https://www.mediawiki.org/wiki/Manual:Hooks/LoadExtensionSchemaUpdates */ $this->handlers['LoadExtensionSchemaUpdates'] = function ($databaseUpdater) { $extensionSchemaUpdates = new ExtensionSchemaUpdates($databaseUpdater); return $extensionSchemaUpdates->process(); }; /** * @see https://www.mediawiki.org/wiki/Manual:Hooks/ResourceLoaderTestModules */ $this->handlers['ResourceLoaderTestModules'] = function (&$testModules, &$resourceLoader) use($basePath, $globalVars) { $resourceLoaderTestModules = new ResourceLoaderTestModules($resourceLoader, $testModules, $basePath, $globalVars['IP']); return $resourceLoaderTestModules->process(); }; /** * @see https://www.mediawiki.org/wiki/Manual:Hooks/ExtensionTypes */ $this->handlers['ExtensionTypes'] = function (&$extTypes) { $extensionTypes = new ExtensionTypes($extTypes); return $extensionTypes->process(); }; /** * @see https://www.mediawiki.org/wiki/Manual:Hooks/TitleIsAlwaysKnown */ $this->handlers['TitleIsAlwaysKnown'] = function ($title, &$result) { $titleIsAlwaysKnown = new TitleIsAlwaysKnown($title, $result); return $titleIsAlwaysKnown->process(); }; /** * @see https://www.mediawiki.org/wiki/Manual:Hooks/BeforeDisplayNoArticleText */ $this->handlers['BeforeDisplayNoArticleText'] = function ($article) { $beforeDisplayNoArticleText = new BeforeDisplayNoArticleText($article); return $beforeDisplayNoArticleText->process(); }; /** * @see https://www.mediawiki.org/wiki/Manual:Hooks/ArticleFromTitle */ $this->handlers['ArticleFromTitle'] = function (&$title, &$article) { $articleFromTitle = new ArticleFromTitle($title, $article); return $articleFromTitle->process(); }; /** * @see https://www.mediawiki.org/wiki/Manual:Hooks/TitleIsMovable */ $this->handlers['TitleIsMovable'] = function ($title, &$isMovable) { $titleIsMovable = new TitleIsMovable($title, $isMovable); return $titleIsMovable->process(); }; /** * @see https://www.mediawiki.org/wiki/Manual:Hooks/EditPage::showEditForm:initial */ $this->handlers['EditPage::showEditForm:initial'] = function ($editPage, $output = null) use($applicationFactory) { // 1.19 hook interface is missing the output object if (!$output instanceof \OutputPage) { $output = $GLOBALS['wgOut']; } $htmlFormRenderer = $applicationFactory->newMwCollaboratorFactory()->newHtmlFormRenderer($editPage->getTitle(), $output->getLanguage()); $editPageForm = new EditPageForm($editPage, $htmlFormRenderer); return $editPageForm->process(); }; $this->handlers['SMW::Store::dropTables'] = function ($verbose) use($eventHandler) { $eventHandler->getEventDispatcher()->dispatch('blobstore.drop'); return true; }; $this->handlers['SMW::SQLStore::AfterDataUpdateComplete'] = function ($store, $semanticData, $compositePropertyTableDiffIterator) use($applicationFactory) { $embeddedQueryDependencyLinksStore = new EmbeddedQueryDependencyLinksStore($store); $embeddedQueryDependencyLinksStore->setEnabledState($applicationFactory->getSettings()->get('smwgEnabledQueryDependencyLinksStore')); $embeddedQueryDependencyLinksStore->pruneOutdatedTargetLinks($compositePropertyTableDiffIterator); $httpRequestFactory = new HttpRequestFactory(); $deferredRequestDispatchManager = new DeferredRequestDispatchManager($httpRequestFactory->newSocketRequest()); $deferredRequestDispatchManager->setEnabledHttpDeferredJobRequestState($applicationFactory->getSettings()->get('smwgEnabledHttpDeferredJobRequest')); $deferredRequestDispatchManager->dispatchJobRequestFor('SMW\\ParserCachePurgeJob', $semanticData->getSubject()->getTitle(), $embeddedQueryDependencyLinksStore->buildParserCachePurgeJobParametersFrom($compositePropertyTableDiffIterator)); return true; }; $this->handlers['SMW::Store::AfterQueryResultLookupComplete'] = function ($store, &$result) use($applicationFactory, $propertyHierarchyLookup) { $embeddedQueryDependencyListResolver = new EmbeddedQueryDependencyListResolver($store, $propertyHierarchyLookup); $embeddedQueryDependencyListResolver->setQueryResult($result); $embeddedQueryDependencyListResolver->setPropertyDependencyDetectionBlacklist($applicationFactory->getSettings()->get('smwgPropertyDependencyDetectionBlacklist')); $embeddedQueryDependencyLinksStore = new EmbeddedQueryDependencyLinksStore($store); $embeddedQueryDependencyLinksStore->setEnabledState($applicationFactory->getSettings()->get('smwgEnabledQueryDependencyLinksStore')); $embeddedQueryDependencyLinksStore->addDependencyList($embeddedQueryDependencyListResolver); return true; }; $this->registerParserFunctionHooks($applicationFactory); }