/** * @see LoggedUpdateMaintenance::doDBUpdates * * @return bool */ public function doDBUpdates() { if (!defined('WB_VERSION')) { $this->output("You need to have Wikibase enabled in order to use this maintenance script!\n\n"); exit; } $reporter = new ObservableMessageReporter(); $reporter->registerReporterCallback(array($this, 'report')); $table = new PropertyInfoTable(false); $wikibaseRepo = WikibaseRepo::getDefaultInstance(); $entityLookup = $wikibaseRepo->getEntityLookup(); $propertyInfoBuilder = $wikibaseRepo->newPropertyInfoBuilder(); $builder = new PropertyInfoTableBuilder($table, $entityLookup, $propertyInfoBuilder); $builder->setReporter($reporter); $builder->setBatchSize((int) $this->getOption('batch-size', 100)); $builder->setRebuildAll($this->getOption('rebuild-all', false)); $builder->setFromId((int) $this->getOption('start-row', 1)); $n = $builder->rebuildPropertyInfo(); $this->output("Done. Updated {$n} property info entries.\n"); return true; }
public function testRebuildPropertyInfo() { $table = new PropertyInfoTable(false); $this->resetPropertyInfoTable($table); $properties = $this->initProperties(); $propertyIds = array_keys($properties); // NOTE: We use the EntityStore from WikibaseRepo in initProperties, // so we should also use the EntityLookup from WikibaseRepo. $wikibaseRepo = WikibaseRepo::getDefaultInstance(); $entityLookup = $wikibaseRepo->getEntityLookup('uncached'); $propertyInfoBuilder = new PropertyInfoBuilder(new PropertyId('P1630')); $builder = new PropertyInfoTableBuilder($table, $entityLookup, $propertyInfoBuilder); $builder->setBatchSize(3); // rebuild all ---- $builder->setFromId(0); $builder->setRebuildAll(true); $builder->rebuildPropertyInfo(); $this->assertTableHasProperties($properties, $table); // make table incomplete ---- $propId1 = new PropertyId($propertyIds[0]); $table->removePropertyInfo($propId1); // rebuild from offset, with no effect ---- $builder->setFromId($propId1->getNumericId() + 1); $builder->setRebuildAll(false); $builder->rebuildPropertyInfo(); $info = $table->getPropertyInfo($propId1); $this->assertNull($info, "rebuild missing from offset should have skipped this"); // rebuild all from offset, with no effect ---- $builder->setFromId($propId1->getNumericId() + 1); $builder->setRebuildAll(false); $builder->rebuildPropertyInfo(); $info = $table->getPropertyInfo($propId1); $this->assertNull($info, "rebuild all from offset should have skipped this"); // rebuild missing ---- $builder->setFromId(0); $builder->setRebuildAll(false); $builder->rebuildPropertyInfo(); $this->assertTableHasProperties($properties, $table); // rebuild again ---- $builder->setFromId(0); $builder->setRebuildAll(false); $c = $builder->rebuildPropertyInfo(); $this->assertEquals(0, $c, "There should be nothing left to rebuild"); }
/** * Wrapper for invoking PropertyInfoTableBuilder from DatabaseUpdater * during a database update. * * @param DatabaseUpdater $updater */ public static function rebuildPropertyInfo(DatabaseUpdater $updater) { $reporter = new ObservableMessageReporter(); $reporter->registerReporterCallback(function ($msg) use($updater) { $updater->output("..." . $msg . "\n"); }); $table = new PropertyInfoTable(false); $wikibaseRepo = WikibaseRepo::getDefaultInstance(); $contentCodec = $wikibaseRepo->getEntityContentDataCodec(); $propertyInfoBuilder = $wikibaseRepo->newPropertyInfoBuilder(); $wikiPageEntityLookup = new WikiPageEntityRevisionLookup($contentCodec, new WikiPageEntityMetaDataLookup($wikibaseRepo->getEntityIdParser()), false); $cachingEntityLookup = new CachingEntityRevisionLookup($wikiPageEntityLookup, new HashBagOStuff()); $entityLookup = new RevisionBasedEntityLookup($cachingEntityLookup); $builder = new PropertyInfoTableBuilder($table, $entityLookup, $propertyInfoBuilder); $builder->setReporter($reporter); $builder->setUseTransactions(false); $updater->output('Populating ' . $table->getTableName() . "\n"); $builder->rebuildPropertyInfo(); }