/** * Add wikibase_item parser output property * * @param Title $title * @param ParserOutput $out */ public function updateItemIdProperty(Title $title, ParserOutput $out) { $itemId = $this->getItemIdForTitle($title); if ($itemId) { $out->setProperty('wikibase_item', $itemId->getSerialization()); $usageAccumulator = new ParserOutputUsageAccumulator($out); $usageAccumulator->addSiteLinksUsage($itemId); } else { $out->unsetProperty('wikibase_item'); } }
private function assertUsageTracking(ItemId $id, $aspect, ParserOutput $parserOutput) { $usageAcc = new ParserOutputUsageAccumulator($parserOutput); $usages = $usageAcc->getUsages(); $expected = new EntityUsage($id, $aspect); $usageIdentities = array_map(function (EntityUsage $usage) { return $usage->getIdentityString(); }, $usages); $expectedIdentities = array($expected->getIdentityString()); $this->assertEquals($expectedIdentities, array_values($usageIdentities)); }
/** * @param array[]|null $usages * @param string $timestamp * * @return ParserOutput */ private function newParserOutput(array $usages = null, $timestamp) { $output = new ParserOutput(); $output->setTimestamp($timestamp); if ($usages) { $acc = new ParserOutputUsageAccumulator($output); foreach ($usages as $u) { $acc->addUsage($u); } } return $output; }
/** * @param Parser $parser * @param PPFrame $frame * @param array $args * * @return array Wikitext */ public function runPropertyParserFunction(Parser $parser, PPFrame $frame, array $args) { $propertyLabelOrId = $frame->expand($args[0]); unset($args[0]); // Create a child frame, so that we can access arguments by name. $childFrame = $frame->newChild($args, $parser->getTitle()); $entityId = $this->getEntityIdForStatementListProvider($parser, $childFrame, $args); if ($entityId === null) { return $this->buildResult(''); } $renderer = $this->rendererFactory->newRendererFromParser($parser); $rendered = $renderer->render($entityId, $propertyLabelOrId); $result = $this->buildResult($rendered); // Track usage of "other" (that is, not label/title/sitelinks) data from the item. $usageAcc = new ParserOutputUsageAccumulator($parser->getOutput()); $usageAcc->addOtherUsage($entityId); return $result; }
/** * Triggered when a new rendering of a page is committed to the ParserCache. * Implemented to update usage tracking information via UsageUpdater. * * @param ParserOutput $parserOutput * @param Title $title */ public function doParserCacheSaveComplete(ParserOutput $parserOutput, Title $title) { $usageAcc = new ParserOutputUsageAccumulator($parserOutput); // Note: ParserOutput::getTimestamp() is unreliable and "sometimes" contains an old timestamp. // Note: getTouched() returns false if $title doesn't exist. $touched = $title->getTouched(); if (!$touched || count($usageAcc->getUsages()) === 0) { // no usages or no title, bail out return; } // Add or touch any usages present in the new rendering. // This allows us to track usages in each user language separately, for multilingual sites. // NOTE: Since parser cache updates may be triggered by page views (in a new language), // schedule the usage updates in the job queue, to avoid writing to the database // during a GET request. //TODO: Before posting a job, check slave database. If no changes are needed, skip update. $addUsagesForPageJob = AddUsagesForPageJob::newSpec($title, $usageAcc->getUsages(), $touched); $enqueueJob = EnqueueJob::newFromLocalJobs($addUsagesForPageJob); $this->jobScheduler->lazyPush($enqueueJob); }
/** * @dataProvider allowDataAccessInUserLanguageProvider */ public function testNewRenderer_usageTracking($allowDataAccessInUserLanguage) { $parser = $this->getParser('en', 'es', true); $rendererFactory = $this->getStatementGroupRendererFactory($allowDataAccessInUserLanguage); $renderer = $rendererFactory->newRendererFromParser($parser); $usageAccumulator = new ParserOutputUsageAccumulator($parser->getOutput()); $this->assertEquals("Kittens!", $renderer->render(new ItemId('Q1'), 'P1')); $usages = $usageAccumulator->getUsages(); if ($allowDataAccessInUserLanguage) { $this->assertArrayHasKey('Q7#L.es', $usages); } else { $this->assertArrayHasKey('Q7#L.en', $usages); } $this->assertArrayHasKey('Q7#T', $usages); }
private function assertUsageTracking(ItemId $id, $aspect, ParserOutput $parserOutput) { $usageAcc = new ParserOutputUsageAccumulator($parserOutput); $usage = $usageAcc->getUsages(); $expected = new EntityUsage($id, $aspect); $this->assertContains($expected, $usage, '', false, false); }