/**
  * 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);
 }