Skip to content

Commit bd691e6

Browse files
author
aude
committed
Split code in importEntities execute method
also improve error handling/formatting, and move QueryRunner obj construction to factory.
1 parent 0cdf20d commit bd691e6

File tree

5 files changed

+155
-63
lines changed

5 files changed

+155
-63
lines changed

WikibaseImport.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
require_once __DIR__ . '/vendor/autoload.php';
66
}
77

8-
wfLoadExtension( 'WikibaseImport' );
8+
wfLoadExtension( 'WikibaseImport', __DIR__ . '/extension.json' );
99
} else {
1010
die( 'WikibaseImport requires MediaWiki 1.25+' );
1111
}

maintenance/importEntities.php

Lines changed: 74 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22

33
namespace Wikibase\Import\Maintenance;
44

5-
use Asparagus\QueryBuilder;
6-
use Asparagus\QueryExecuter;
75
use Exception;
6+
use MediaWiki\MediaWikiServices;
87
use Psr\Log\LoggerInterface;
8+
use RuntimeException;
99
use Wikibase\Import\Console\ImportOptions;
10+
use Wikibase\Import\EntityId\EntityIdListBuilder;
1011
use Wikibase\Import\EntityId\EntityIdListBuilderFactory;
1112
use Wikibase\Import\EntityImporterFactory;
1213
use Wikibase\Import\LoggerFactory;
13-
use Wikibase\Import\QueryRunner;
1414
use Wikibase\Import\PropertyIdLister;
1515
use Wikibase\Repo\WikibaseRepo;
1616

@@ -28,6 +28,11 @@ class ImportEntities extends \Maintenance {
2828
*/
2929
private $logger;
3030

31+
/**
32+
* @var ImportOptions
33+
*/
34+
private $importOptions;
35+
3136
public function __construct() {
3237
parent::__construct();
3338

@@ -44,45 +49,46 @@ private function addOptions() {
4449

4550
public function execute() {
4651
$this->logger = LoggerFactory::newLogger( 'wikibase-import', $this->mQuiet );
52+
$this->importOptions = $this->extractOptions();
4753

48-
$importOptions = $this->extractOptions();
54+
try {
55+
$importMode = $this->getImportMode();
56+
$entityIdListBuilder = $this->newEntityIdListBuilder( $importMode );
4957

50-
$entityIdListBuilderFactory = $this->newEntityIdListBuilderFactory();
58+
$input = $this->getInputForMode( $importMode );
59+
$ids = $entityIdListBuilder->getEntityIds( $input );
5160

52-
foreach ( $this->getValidOptions() as $option ) {
53-
if ( $importOptions->hasOption( $option ) ) {
54-
$entityIdListBuilder = $entityIdListBuilderFactory->newEntityIdListBuilder(
55-
$option
56-
);
57-
58-
if ( $option === 'all-properties' ) {
59-
$input = 'all-properties';
60-
} else {
61-
$input = $importOptions->getOption( $option );
62-
}
63-
64-
break;
65-
}
61+
$entityImporter = $this->newEntityImporter();
62+
$entityImporter->importEntities( $ids );
63+
}
64+
catch ( Exception $ex ) {
65+
$this->error( $ex->getMessage() );
6666
}
6767

68-
if ( !isset( $entityIdListBuilder ) ) {
69-
$this->logger->error( 'ERROR: No valid import option was provided' );
68+
$this->logger->info( 'Done' );
69+
}
7070

71-
return;
72-
} else {
73-
try {
74-
$ids = $entityIdListBuilder->getEntityIds( $input );
71+
/**
72+
* @inheritdoc
73+
*/
74+
protected function error( $err, $die = 0 ) {
75+
$err = "\033[31mERROR:\033[0m $err";
7576

76-
$entityImporter = $this->newEntityImporter();
77-
$entityImporter->importEntities( $ids );
78-
} catch ( Exception $ex ) {
79-
$this->logger->error( $ex->getMessage() );
80-
}
77+
$this->logger->error( $err );
78+
$this->maybeHelp( true );
79+
}
8180

82-
$this->logger->info( 'Done' );
83-
}
81+
/**
82+
* @return array
83+
*/
84+
private function getValidOptions() {
85+
return [ 'entity', 'file', 'all-properties', 'query', 'range' ];
8486
}
8587

88+
/**
89+
* @return ImportOptions
90+
* @throws RuntimeException
91+
*/
8692
private function extractOptions() {
8793
$options = [];
8894

@@ -91,42 +97,65 @@ private function extractOptions() {
9197
}
9298

9399
if ( empty( $options ) ) {
94-
$this->maybeHelp( true );
100+
throw new RuntimeException( 'No valid import mode option provided' );
95101
}
96102

97103
return new ImportOptions( $options );
98104
}
99105

100-
private function getValidOptions() {
101-
return [ 'entity', 'file', 'all-properties', 'query', 'range' ];
106+
/**
107+
* @return string
108+
* @throws RuntimeException
109+
*/
110+
private function getImportMode() {
111+
foreach ( $this->getValidOptions() as $option ) {
112+
if ( $this->importOptions->hasOption( $option ) ) {
113+
return $option;
114+
}
115+
}
116+
117+
throw new RuntimeException( 'No valid import option was provided' );
102118
}
103119

104-
private function newEntityIdListBuilderFactory() {
105-
$queryRunner = new QueryRunner(
106-
new QueryBuilder( $this->getConfig()->get( 'WBImportQueryPrefixes' ) ),
107-
new QueryExecuter( $this->getConfig()->get( 'WBImportQueryUrl' ) )
108-
);
120+
/**
121+
* @param string $mode
122+
* @return mixed
123+
*/
124+
private function getInputForMode( $mode ) {
125+
if ( $mode === 'all-properties' ) {
126+
return 'all-properties';
127+
} else {
128+
return $this->importOptions->getOption( $mode );
129+
}
130+
}
109131

110-
return new EntityIdListBuilderFactory(
132+
/**
133+
* @param string $importMode
134+
* @return EntityIdListBuilder
135+
*/
136+
private function newEntityIdListBuilder( $importMode ) {
137+
$entityIdListBuilderFactory = new EntityIdListBuilderFactory(
111138
WikibaseRepo::getDefaultInstance()->getEntityIdParser(),
112139
new PropertyIdLister(),
113-
$queryRunner,
140+
$this->getConfig()->get( 'WBImportQueryPrefixes' ),
141+
$this->getConfig()->get( 'WBImportQueryUrl' ),
114142
$this->getConfig()->get( 'WBImportSourceApi' )
115143
);
144+
145+
return $entityIdListBuilderFactory->newEntityIdListBuilder( $importMode );
116146
}
117147

118148
private function newEntityImporter() {
119149
$entityImporterFactory = new EntityImporterFactory(
120150
WikibaseRepo::getDefaultInstance()->getStore()->getEntityStore(),
121-
wfGetLB(),
151+
MediaWikiServices::getInstance()->getDBLoadBalancer(),
122152
$this->logger,
123153
$this->getConfig()->get( 'WBImportSourceApi' )
124154
);
125155

126156
return $entityImporterFactory->newEntityImporter();
127157
}
128-
129158
}
130159

131-
$maintClass = "Wikibase\Import\Maintenance\ImportEntities";
160+
$maintClass = ImportEntities::class;
132161
require_once RUN_MAINTENANCE_IF_MAIN;

src/EntityId/EntityIdListBuilderFactory.php

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
namespace Wikibase\Import\EntityId;
44

5+
use Asparagus\QueryBuilder;
6+
use Asparagus\QueryExecuter;
57
use InvalidArgumentException;
68
use Wikibase\DataModel\Entity\EntityIdParser;
79
use Wikibase\Import\PropertyIdLister;
@@ -20,9 +22,14 @@ class EntityIdListBuilderFactory {
2022
private $propertyIdLister;
2123

2224
/**
23-
* @var QueryRunner
25+
* @var array
2426
*/
25-
private $queryRunner;
27+
private $queryPrefixes;
28+
29+
/**
30+
* @var string
31+
*/
32+
private $queryUrl;
2633

2734
/**
2835
* @var string
@@ -32,18 +39,18 @@ class EntityIdListBuilderFactory {
3239
/**
3340
* @param EntityIdParser $idParser
3441
* @param PropertyIdLister $propertyIdLister
35-
* @param QueryRunner $queryRunner
42+
* @param array $queryPrefixes
43+
* @param string $queryUrl
3644
* @param string $apiUrl
3745
*/
3846
public function __construct(
39-
EntityIdParser $idParser,
40-
PropertyIdLister $propertyIdLister,
41-
QueryRunner $queryRunner,
42-
$apiUrl
47+
EntityIdParser $idParser, PropertyIdLister $propertyIdLister, array $queryPrefixes,
48+
$queryUrl, $apiUrl
4349
) {
4450
$this->idParser = $idParser;
4551
$this->propertyIdLister = $propertyIdLister;
46-
$this->queryRunner = $queryRunner;
52+
$this->queryPrefixes = $queryPrefixes;
53+
$this->queryUrl = $queryUrl;
4754
$this->apiUrl = $apiUrl;
4855
}
4956

@@ -71,10 +78,7 @@ public function newEntityIdListBuilder( $mode ) {
7178
}
7279

7380
private function newAllPropertiesEntityIdListBuilder() {
74-
return new AllPropertiesEntityIdListBuilder(
75-
$this->propertyIdLister,
76-
$this->apiUrl
77-
);
81+
return new AllPropertiesEntityIdListBuilder( $this->propertyIdLister, $this->apiUrl );
7882
}
7983

8084
private function newFileEntityIdListBuilder() {
@@ -86,10 +90,12 @@ private function newIndividualEntityIdListBuilder() {
8690
}
8791

8892
private function newQueryEntityIdListBuilder() {
89-
return new QueryEntityIdListBuilder(
90-
$this->idParser,
91-
$this->queryRunner
92-
);
93+
return new QueryEntityIdListBuilder( $this->idParser, $this->newQueryRunner() );
94+
}
95+
96+
private function newQueryRunner() {
97+
return new QueryRunner( new QueryBuilder( $this->queryPrefixes ),
98+
new QueryExecuter( $this->queryUrl ) );
9399
}
94100

95101
private function newRangeEntityIdListBuilder() {

src/LoggerFactory.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,14 @@ public static function newLogger( $loggerName, $quietMode ) {
2525
throw new InvalidArgumentException( '$quietMode must be boolean' );
2626
}
2727

28-
$formatter = new LineFormatter( "[%datetime%]: %message%\n" );
28+
// unused
29+
$dateTimeFormatter = new LineFormatter( "[%datetime%]: %message%\n" );
2930

3031
if ( $quietMode === true ) {
3132
$handler = new NullHandler();
3233
} else {
34+
$formatter = new LineFormatter( "%message%\n");
35+
3336
$handler = new StreamHandler( 'php://stdout' );
3437
$handler->setFormatter( $formatter );
3538
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php
2+
3+
namespace Wikibase\Import\Tests;
4+
5+
use Monolog\Logger;
6+
use Monolog\Handler\NullHandler;
7+
use Wikibase\DataModel\Entity\ItemId;
8+
use Wikibase\DataModel\Entity\PropertyId;
9+
use Wikibase\Import\EntityImporterFactory;
10+
use Wikibase\Repo\WikibaseRepo;
11+
12+
/**
13+
* @group WikibaseImport
14+
*/
15+
class ApiEntityLookupIntegrationTest extends \PHPUnit_Framework_TestCase {
16+
17+
public function testGetEntity() {
18+
$apiEntityLookup = $this->getApiEntityLookup();
19+
$item = $apiEntityLookup->getEntity( new ItemId( 'Q60' ) );
20+
21+
$this->assertInstanceOf( 'Wikibase\DataModel\Entity\Item', $item );
22+
$this->assertSame(
23+
'New York City',
24+
$item->getFingerprint()->getLabel( 'en' )->getText(),
25+
'English label is New York City'
26+
);
27+
28+
$statements = $item->getStatements()->getByPropertyId( new PropertyId( 'P17' ) );
29+
30+
foreach ( $statements as $statement ) {
31+
$mainSnakValue = $statement->getMainSnak()->getDataValue();
32+
$this->assertEquals( 'Q30', $mainSnakValue->getEntityId()->getSerialization() );
33+
}
34+
}
35+
36+
private function getApiEntityLookup() {
37+
$entityImporterFactory = new EntityImporterFactory(
38+
WikibaseRepo::getDefaultInstance()->getStore()->getEntityStore(),
39+
wfGetLB(),
40+
$this->newLogger(),
41+
'https://www.wikidata.org/w/api.php'
42+
);
43+
44+
return $entityImporterFactory->getApiEntityLookup();
45+
}
46+
47+
private function newLogger() {
48+
$logger = new Logger( 'wikibase-import' );
49+
$logger->pushHandler( new NullHandler() );
50+
51+
return $logger;
52+
}
53+
54+
}

0 commit comments

Comments
 (0)