Completed
Push — master ( aa47cc...29c144 )
by
unknown
05:31
created

ConstraintReportFactory::__construct()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 31
Code Lines 29

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 31
rs 8.8571
c 0
b 0
f 0
cc 1
eloc 29
nc 1
nop 14

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php
2
3
namespace WikibaseQuality\ConstraintReport;
4
5
use Config;
6
use DataValues\DataValueFactory;
7
use IBufferingStatsdDataFactory;
8
use MediaWiki\MediaWikiServices;
9
use TitleParser;
10
use Wikibase\DataModel\Entity\EntityIdParser;
11
use Wikibase\DataModel\Services\Lookup\EntityLookup;
12
use Wikibase\DataModel\Services\Lookup\PropertyDataTypeLookup;
13
use Wikibase\Lib\Store\EntityNamespaceLookup;
14
use Wikibase\Lib\Store\Sql\WikiPageEntityMetaDataAccessor;
15
use Wikibase\Lib\Store\Sql\WikiPageEntityMetaDataLookup;
16
use Wikibase\Lib\Units\UnitConverter;
17
use Wikibase\Rdf\RdfVocabulary;
18
use Wikibase\Repo\WikibaseRepo;
19
use WikibaseQuality\ConstraintReport\Api\CachingResultsSource;
20
use WikibaseQuality\ConstraintReport\Api\CheckingResultsSource;
21
use WikibaseQuality\ConstraintReport\Api\ResultsCache;
22
use WikibaseQuality\ConstraintReport\Api\ResultsSource;
23
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\CitationNeededChecker;
24
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\EntityTypeChecker;
25
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\IntegerChecker;
26
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\NoBoundsChecker;
27
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\AllowedUnitsChecker;
28
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\NoneOfChecker;
29
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\ReferenceChecker;
30
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\SingleBestValueChecker;
31
use WikibaseQuality\ConstraintReport\ConstraintCheck\Context\ContextCursorDeserializer;
32
use WikibaseQuality\ConstraintReport\ConstraintCheck\Context\ContextCursorSerializer;
33
use WikibaseQuality\ConstraintReport\ConstraintCheck\DelegatingConstraintChecker;
34
use WikibaseQuality\ConstraintReport\ConstraintCheck\Helper\ConstraintParameterParser;
35
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\CommonsLinkChecker;
36
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\FormatChecker;
37
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\OneOfChecker;
38
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\QualifierChecker;
39
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\RangeChecker;
40
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\TypeChecker;
41
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\ConflictsWithChecker;
42
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\QualifiersChecker;
43
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\TargetRequiredClaimChecker;
44
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\ItemChecker;
45
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\MandatoryQualifiersChecker;
46
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\ValueTypeChecker;
47
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\SymmetricChecker;
48
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\InverseChecker;
49
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\DiffWithinRangeChecker;
50
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\SingleValueChecker;
51
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\MultiValueChecker;
52
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\UniqueValueChecker;
53
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\ValueOnlyChecker;
54
use WikibaseQuality\ConstraintReport\ConstraintCheck\ConstraintChecker;
55
use WikibaseQuality\ConstraintReport\ConstraintCheck\Helper\ConnectionCheckerHelper;
56
use WikibaseQuality\ConstraintReport\ConstraintCheck\Helper\RangeCheckerHelper;
57
use WikibaseQuality\ConstraintReport\ConstraintCheck\Helper\SparqlHelper;
58
use WikibaseQuality\ConstraintReport\ConstraintCheck\Helper\TypeCheckerHelper;
59
use Wikibase\DataModel\Services\Statement\StatementGuidParser;
60
use WikibaseQuality\ConstraintReport\ConstraintCheck\Message\ViolationMessageDeserializer;
61
use WikibaseQuality\ConstraintReport\ConstraintCheck\Message\ViolationMessageSerializer;
62
use WikibaseQuality\ConstraintReport\ConstraintCheck\Result\CheckResultDeserializer;
63
use WikibaseQuality\ConstraintReport\ConstraintCheck\Result\CheckResultSerializer;
64
65
/**
66
 * Factory for {@link DelegatingConstraintChecker}
67
 * and {@link ConstraintRepository}.
68
 *
69
 * @license GPL-2.0-or-later
70
 */
71
class ConstraintReportFactory {
72
73
	// services created by this factory
74
75
	/**
76
	 * @var DelegatingConstraintChecker|null
77
	 */
78
	private $delegatingConstraintChecker;
79
80
	/**
81
	 * @var ConstraintChecker[]|null
82
	 */
83
	private $constraintCheckerMap;
84
85
	/**
86
	 * @var ConstraintRepository|null
87
	 */
88
	private $constraintRepository;
89
90
	/**
91
	 * @var CheckResultSerializer|null
92
	 */
93
	private $checkResultSerializer;
94
95
	/**
96
	 * @var CheckResultDeserializer|null
97
	 */
98
	private $checkResultDeserializer;
99
100
	/**
101
	 * @var WikiPageEntityMetaDataAccessor|null
102
	 */
103
	private $wikiPageEntityMetaDataAccessor;
104
105
	/**
106
	 * @var ResultsSource|null
107
	 */
108
	private $resultsSource;
109
110
	// services used by this factory
111
112
	/**
113
	 * @var EntityLookup
114
	 */
115
	private $lookup;
116
117
	/**
118
	 * @var PropertyDataTypeLookup
119
	 */
120
	private $propertyDataTypeLookup;
121
122
	/**
123
	 * @var StatementGuidParser
124
	 */
125
	private $statementGuidParser;
126
127
	/**
128
	 * @var Config
129
	 */
130
	private $config;
131
132
	/**
133
	 * @var ConstraintParameterParser
134
	 */
135
	private $constraintParameterParser;
136
137
	/**
138
	 * @var ViolationMessageSerializer
139
	 */
140
	private $violationMessageSerializer;
141
142
	/**
143
	 * @var ViolationMessageDeserializer
144
	 */
145
	private $violationMessageDeserializer;
146
147
	/**
148
	 * @var RdfVocabulary
149
	 */
150
	private $rdfVocabulary;
151
152
	/**
153
	 * @var EntityIdParser
154
	 */
155
	private $entityIdParser;
156
157
	/**
158
	 * @var TitleParser
159
	 */
160
	private $titleParser;
161
162
	/**
163
	 * @var UnitConverter|null
164
	 */
165
	private $unitConverter;
166
167
	/**
168
	 * @var DataValueFactory
169
	 */
170
	private $dataValueFactory;
171
172
	/**
173
	 * @var EntityNamespaceLookup
174
	 */
175
	private $entityNamespaceLookup;
176
177
	/**
178
	 * @var IBufferingStatsdDataFactory
179
	 */
180
	private $dataFactory;
181
182
	/**
183
	 * Returns the default instance.
184
	 * IMPORTANT: Use only when it is not feasible to inject an instance properly.
185
	 *
186
	 * @return self
187
	 */
188
	public static function getDefaultInstance() {
189
		static $instance = null;
190
191
		if ( $instance === null ) {
192
			$wikibaseRepo = WikibaseRepo::getDefaultInstance();
193
			$config = MediaWikiServices::getInstance()->getMainConfig();
194
			$titleParser = MediaWikiServices::getInstance()->getTitleParser();
195
			$violationMessageDeserializer = new ViolationMessageDeserializer(
196
				$wikibaseRepo->getEntityIdParser(),
197
				$wikibaseRepo->getDataValueFactory()
198
			);
199
			$instance = new self(
200
				$wikibaseRepo->getEntityLookup(),
201
				$wikibaseRepo->getPropertyDataTypeLookup(),
202
				$wikibaseRepo->getStatementGuidParser(),
203
				$config,
204
				new ConstraintParameterParser(
205
					$config,
206
					$wikibaseRepo->getBaseDataModelDeserializerFactory(),
207
					$wikibaseRepo->getConceptBaseUris()
208
				),
209
				new ViolationMessageSerializer(),
210
				$violationMessageDeserializer,
211
				$wikibaseRepo->getRdfVocabulary(),
212
				$wikibaseRepo->getEntityIdParser(),
213
				$titleParser,
214
				$wikibaseRepo->getUnitConverter(),
215
				$wikibaseRepo->getDataValueFactory(),
216
				$wikibaseRepo->getEntityNamespaceLookup(),
217
				MediaWikiServices::getInstance()->getStatsdDataFactory()
218
			);
219
		}
220
221
		return $instance;
222
	}
223
224
	public function __construct(
225
		EntityLookup $lookup,
226
		PropertyDataTypeLookup $propertyDataTypeLookup,
227
		StatementGuidParser $statementGuidParser,
228
		Config $config,
229
		ConstraintParameterParser $constraintParameterParser,
230
		ViolationMessageSerializer $violationMessageSerializer,
231
		ViolationMessageDeserializer $violationMessageDeserializer,
232
		RdfVocabulary $rdfVocabulary,
233
		EntityIdParser $entityIdParser,
234
		TitleParser $titleParser,
235
		UnitConverter $unitConverter = null,
236
		DataValueFactory $dataValueFactory,
237
		EntityNamespaceLookup $entityNamespaceLookup,
238
		IBufferingStatsdDataFactory $dataFactory
239
	) {
240
		$this->lookup = $lookup;
241
		$this->propertyDataTypeLookup = $propertyDataTypeLookup;
242
		$this->statementGuidParser = $statementGuidParser;
243
		$this->config = $config;
244
		$this->constraintParameterParser = $constraintParameterParser;
245
		$this->violationMessageSerializer = $violationMessageSerializer;
246
		$this->violationMessageDeserializer = $violationMessageDeserializer;
247
		$this->rdfVocabulary = $rdfVocabulary;
248
		$this->entityIdParser = $entityIdParser;
249
		$this->titleParser = $titleParser;
250
		$this->unitConverter = $unitConverter;
251
		$this->dataValueFactory = $dataValueFactory;
252
		$this->entityNamespaceLookup = $entityNamespaceLookup;
253
		$this->dataFactory = $dataFactory;
254
	}
255
256
	/**
257
	 * @return DelegatingConstraintChecker
258
	 */
259
	public function getConstraintChecker() {
260
		if ( $this->delegatingConstraintChecker === null ) {
261
			$this->delegatingConstraintChecker = new DelegatingConstraintChecker(
262
				$this->lookup,
263
				$this->getConstraintCheckerMap(),
264
				new CachingConstraintLookup( $this->getConstraintRepository() ),
265
				$this->constraintParameterParser,
266
				$this->statementGuidParser,
267
				ConstraintsServices::getLoggingHelper(),
268
				$this->config->get( 'WBQualityConstraintsCheckQualifiers' ),
269
				$this->config->get( 'WBQualityConstraintsCheckReferences' ),
270
				$this->config->get( 'WBQualityConstraintsPropertiesWithViolatingQualifiers' )
271
			);
272
		}
273
274
		return $this->delegatingConstraintChecker;
275
	}
276
277
	/**
278
	 * @return ConstraintChecker[]
279
	 */
280
	private function getConstraintCheckerMap() {
281
		if ( $this->constraintCheckerMap === null ) {
282
			$connectionCheckerHelper = new ConnectionCheckerHelper();
283
			$rangeCheckerHelper = new RangeCheckerHelper( $this->config, $this->unitConverter );
284
			if ( $this->config->get( 'WBQualityConstraintsSparqlEndpoint' ) !== '' ) {
285
				$sparqlHelper = new SparqlHelper(
286
					$this->config,
287
					$this->rdfVocabulary,
288
					$this->entityIdParser,
289
					$this->propertyDataTypeLookup,
290
					MediaWikiServices::getInstance()->getMainWANObjectCache(),
291
					$this->violationMessageSerializer,
292
					$this->violationMessageDeserializer,
293
					$this->dataFactory
294
				);
295
			} else {
296
				$sparqlHelper = null;
297
			}
298
			$typeCheckerHelper = new TypeCheckerHelper(
299
				$this->lookup,
300
				$this->config,
301
				$sparqlHelper,
302
				$this->dataFactory
303
			);
304
305
			$this->constraintCheckerMap = [
306
				$this->config->get( 'WBQualityConstraintsConflictsWithConstraintId' )
307
					=> new ConflictsWithChecker(
308
						$this->lookup,
309
						$this->constraintParameterParser,
310
						$connectionCheckerHelper
311
					),
312
				$this->config->get( 'WBQualityConstraintsItemRequiresClaimConstraintId' )
313
					=> new ItemChecker(
314
						$this->lookup,
315
						$this->constraintParameterParser,
316
						$connectionCheckerHelper
317
					),
318
				$this->config->get( 'WBQualityConstraintsValueRequiresClaimConstraintId' )
319
					=> new TargetRequiredClaimChecker(
320
						$this->lookup,
321
						$this->constraintParameterParser,
322
						$connectionCheckerHelper
323
					),
324
				$this->config->get( 'WBQualityConstraintsSymmetricConstraintId' )
325
					=> new SymmetricChecker(
326
						$this->lookup,
327
						$connectionCheckerHelper
328
					),
329
				$this->config->get( 'WBQualityConstraintsInverseConstraintId' )
330
					=> new InverseChecker(
331
						$this->lookup,
332
						$this->constraintParameterParser,
333
						$connectionCheckerHelper
334
					),
335
				$this->config->get( 'WBQualityConstraintsUsedAsQualifierConstraintId' )
336
					=> new QualifierChecker(),
337
				$this->config->get( 'WBQualityConstraintsAllowedQualifiersConstraintId' )
338
					=> new QualifiersChecker(
339
						$this->constraintParameterParser
340
					),
341
				$this->config->get( 'WBQualityConstraintsMandatoryQualifierConstraintId' )
342
					=> new MandatoryQualifiersChecker(
343
						$this->constraintParameterParser
344
					),
345
				$this->config->get( 'WBQualityConstraintsRangeConstraintId' )
346
					=> new RangeChecker(
347
						$this->propertyDataTypeLookup,
348
						$this->constraintParameterParser,
349
						$rangeCheckerHelper
350
					),
351
				$this->config->get( 'WBQualityConstraintsDifferenceWithinRangeConstraintId' )
352
					=> new DiffWithinRangeChecker(
353
						$this->constraintParameterParser,
354
						$rangeCheckerHelper,
355
						$this->config
356
					),
357
				$this->config->get( 'WBQualityConstraintsTypeConstraintId' )
358
					=> new TypeChecker(
359
						$this->lookup,
360
						$this->constraintParameterParser,
361
						$typeCheckerHelper,
362
						$this->config
363
					),
364
				$this->config->get( 'WBQualityConstraintsValueTypeConstraintId' )
365
					=> new ValueTypeChecker(
366
						$this->lookup,
367
						$this->constraintParameterParser,
368
						$typeCheckerHelper,
369
						$this->config
370
					),
371
				$this->config->get( 'WBQualityConstraintsSingleValueConstraintId' )
372
					=> new SingleValueChecker( $this->constraintParameterParser ),
373
				$this->config->get( 'WBQualityConstraintsMultiValueConstraintId' )
374
					=> new MultiValueChecker( $this->constraintParameterParser ),
375
				$this->config->get( 'WBQualityConstraintsDistinctValuesConstraintId' )
376
					=> new UniqueValueChecker(
377
						$sparqlHelper
378
					),
379
				$this->config->get( 'WBQualityConstraintsFormatConstraintId' )
380
					=> new FormatChecker(
381
						$this->constraintParameterParser,
382
						$this->config,
383
						$sparqlHelper
384
					),
385
				$this->config->get( 'WBQualityConstraintsCommonsLinkConstraintId' )
386
					=> new CommonsLinkChecker(
387
						$this->constraintParameterParser,
388
						$this->titleParser
389
					),
390
				$this->config->get( 'WBQualityConstraintsOneOfConstraintId' )
391
					=> new OneOfChecker(
392
						$this->constraintParameterParser
393
					),
394
				$this->config->get( 'WBQualityConstraintsUsedForValuesOnlyConstraintId' )
395
					=> new ValueOnlyChecker(),
396
				$this->config->get( 'WBQualityConstraintsUsedAsReferenceConstraintId' )
397
					=> new ReferenceChecker(),
398
				$this->config->get( 'WBQualityConstraintsNoBoundsConstraintId' )
399
					=> new NoBoundsChecker(),
400
				$this->config->get( 'WBQualityConstraintsAllowedUnitsConstraintId' )
401
					=> new AllowedUnitsChecker(
402
						$this->constraintParameterParser,
403
						$this->unitConverter
404
					),
405
				$this->config->get( 'WBQualityConstraintsSingleBestValueConstraintId' )
406
					=> new SingleBestValueChecker( $this->constraintParameterParser ),
407
				$this->config->get( 'WBQualityConstraintsAllowedEntityTypesConstraintId' )
408
					=> new EntityTypeChecker(
409
						$this->constraintParameterParser
410
					),
411
				$this->config->get( 'WBQualityConstraintsNoneOfConstraintId' )
412
					=> new NoneOfChecker(
413
						$this->constraintParameterParser
414
					),
415
				$this->config->get( 'WBQualityConstraintsIntegerConstraintId' )
416
					=> new IntegerChecker(),
417
				$this->config->get( 'WBQualityConstraintsCitationNeededConstraintId' )
418
					=> new CitationNeededChecker(),
419
			];
420
		}
421
422
		return $this->constraintCheckerMap;
423
	}
424
425
	/**
426
	 * @return ConstraintRepository
427
	 */
428
	public function getConstraintRepository() {
429
		if ( $this->constraintRepository === null ) {
430
			$this->constraintRepository = new ConstraintRepository();
431
		}
432
433
		return $this->constraintRepository;
434
	}
435
436
	/**
437
	 * @return CheckResultSerializer
438
	 */
439
	public function getCheckResultSerializer() {
440
		if ( $this->checkResultSerializer === null ) {
441
			$this->checkResultSerializer = new CheckResultSerializer(
442
				new ConstraintSerializer(
443
					false // constraint parameters are not exposed
444
				),
445
				new ContextCursorSerializer(),
446
				new ViolationMessageSerializer(),
447
				false // unnecessary to serialize individual result dependencies
448
			);
449
		}
450
451
		return $this->checkResultSerializer;
452
	}
453
454
	/**
455
	 * @return CheckResultDeserializer
456
	 */
457
	public function getCheckResultDeserializer() {
458
		if ( $this->checkResultDeserializer === null ) {
459
			$this->checkResultDeserializer = new CheckResultDeserializer(
460
				new ConstraintDeserializer(),
461
				new ContextCursorDeserializer(),
462
				new ViolationMessageDeserializer(
463
					$this->entityIdParser,
464
					$this->dataValueFactory
465
				),
466
				$this->entityIdParser
467
			);
468
		}
469
470
		return $this->checkResultDeserializer;
471
	}
472
473
	/**
474
	 * @return WikiPageEntityMetaDataAccessor
475
	 */
476
	public function getWikiPageEntityMetaDataAccessor() {
477
		if ( $this->wikiPageEntityMetaDataAccessor === null ) {
478
			$this->wikiPageEntityMetaDataAccessor = new WikiPageEntityMetaDataLookup(
0 ignored issues
show
Documentation Bug introduced by
It seems like new \Wikibase\Lib\Store\...>entityNamespaceLookup) of type object<Wikibase\Lib\Stor...geEntityMetaDataLookup> is incompatible with the declared type object<Wikibase\Lib\Stor...yMetaDataAccessor>|null of property $wikiPageEntityMetaDataAccessor.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
479
				$this->entityNamespaceLookup
480
			);
481
		}
482
483
		return $this->wikiPageEntityMetaDataAccessor;
0 ignored issues
show
Bug Compatibility introduced by
The expression $this->wikiPageEntityMetaDataAccessor; of type Wikibase\Lib\Store\Sql\W...eEntityMetaDataAccessor adds the type Wikibase\Lib\Store\Sql\W...ageEntityMetaDataLookup to the return on line 483 which is incompatible with the return type documented by WikibaseQuality\Constrai...eEntityMetaDataAccessor of type Wikibase\Lib\Store\Sql\W...eEntityMetaDataAccessor.
Loading history...
484
	}
485
486
	/**
487
	 * @return ResultsSource
488
	 */
489
	public function getResultsSource() {
490
		if ( $this->resultsSource === null ) {
491
			$this->resultsSource = new CheckingResultsSource(
492
				$this->getConstraintChecker()
493
			);
494
495
			if ( $this->config->get( 'WBQualityConstraintsCacheCheckConstraintsResults' ) ) {
496
				$this->resultsSource = new CachingResultsSource(
497
					$this->resultsSource,
498
					ResultsCache::getDefaultInstance(),
499
					$this->getCheckResultSerializer(),
500
					$this->getCheckResultDeserializer(),
501
					$this->getWikiPageEntityMetaDataAccessor(),
502
					$this->entityIdParser,
503
					$this->config->get( 'WBQualityConstraintsCacheCheckConstraintsTTLSeconds' ),
504
					$this->getPossiblyStaleConstraintTypes(),
505
					$this->config->get( 'WBQualityConstraintsCacheCheckConstraintsMaximumRevisionIds' ),
506
					ConstraintsServices::getLoggingHelper()
507
				);
508
			}
509
		}
510
511
		return $this->resultsSource;
512
	}
513
514
	/**
515
	 * @return string[]
516
	 */
517
	public function getPossiblyStaleConstraintTypes() {
518
		return [
519
			$this->config->get( 'WBQualityConstraintsCommonsLinkConstraintId' ),
520
			$this->config->get( 'WBQualityConstraintsTypeConstraintId' ),
521
			$this->config->get( 'WBQualityConstraintsValueTypeConstraintId' ),
522
			$this->config->get( 'WBQualityConstraintsDistinctValuesConstraintId' ),
523
		];
524
	}
525
526
}
527