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