public function testGetPagesUsing()
 {
     $q3 = new ItemId('Q3');
     $q4 = new ItemId('Q4');
     $q6 = new ItemId('Q6');
     $u3s = new EntityUsage($q3, EntityUsage::SITELINK_USAGE);
     $u3l = new EntityUsage($q3, EntityUsage::LABEL_USAGE, 'de');
     $u4l = new EntityUsage($q4, EntityUsage::LABEL_USAGE, 'de');
     $u4t = new EntityUsage($q4, EntityUsage::TITLE_USAGE);
     $this->putUsages(23, array($u3s, $u3l, $u4l), '20150102030405');
     $this->putUsages(42, array($u4l, $u4t), '20150102030405');
     $pages = $this->lookup->getPagesUsing(array($q6));
     Assert::assertEmpty(iterator_to_array($pages));
     $pages = $this->lookup->getPagesUsing(array($q3));
     $this->assertSamePageEntityUsages(array(23 => new PageEntityUsages(23, array($u3s, $u3l))), iterator_to_array($pages), 'Pages using Q3');
     $pages = $this->lookup->getPagesUsing(array($q4, $q3), array(EntityUsage::makeAspectKey(EntityUsage::LABEL_USAGE, 'de')));
     $this->assertSamePageEntityUsages(array(23 => new PageEntityUsages(23, array($u3l, $u4l)), 42 => new PageEntityUsages(42, array($u4l))), iterator_to_array($pages), 'Pages using "label" on Q4 or Q3');
     $pages = $this->lookup->getPagesUsing(array($q3), array(EntityUsage::ALL_USAGE));
     Assert::assertEmpty(iterator_to_array($pages), 'Pages using "all" on Q3');
     $pages = $this->lookup->getPagesUsing(array($q4), array(EntityUsage::SITELINK_USAGE));
     Assert::assertEmpty(iterator_to_array($pages), 'Pages using "sitelinks" on Q4');
     $pages = $this->lookup->getPagesUsing(array($q3, $q4), array(EntityUsage::TITLE_USAGE, EntityUsage::SITELINK_USAGE));
     Assert::assertCount(2, iterator_to_array($pages), 'Pages using "title" or "sitelinks" on Q3 or Q4');
     $this->putUsages(23, array(), '20150102030405');
 }
 /**
  * Returns the page updates implied by the given the change.
  *
  * @param EntityChange $change
  *
  * @return Traversable of PageEntityUsages
  */
 private function getAffectedPages(EntityChange $change)
 {
     $entityId = $change->getEntityId();
     $changedAspects = $this->getChangedAspects($change);
     $usages = $this->usageLookup->getPagesUsing(array($entityId), array_merge($changedAspects, array(EntityUsage::ALL_USAGE)));
     // @todo: use iterators throughout!
     $usages = iterator_to_array($usages, true);
     $usages = $this->transformAllPageEntityUsages($usages, $entityId, $changedAspects);
     if ($change instanceof ItemChange && in_array(EntityUsage::TITLE_USAGE, $changedAspects)) {
         $siteLinkDiff = $change->getSiteLinkDiff();
         $namesFromDiff = $this->getPagesReferencedInDiff($siteLinkDiff);
         $titlesFromDiff = $this->getTitlesFromTexts($namesFromDiff);
         $usagesFromDiff = $this->makeVirtualUsages($titlesFromDiff, $entityId, array(EntityUsage::SITELINK_USAGE));
         //FIXME: we can't really merge if $usages is an iterator, not an array.
         //TODO: Inject $usagesFromDiff "on the fly" while streaming other usages.
         //NOTE: $usages must pass through mergeUsagesInto for re-indexing
         $mergedUsages = array();
         $this->mergeUsagesInto($usages, $mergedUsages);
         $this->mergeUsagesInto($usagesFromDiff, $mergedUsages);
         $usages = $mergedUsages;
     }
     return new ArrayIterator($usages);
 }