Completed
Push — master ( 29c144...1bc02d )
by
unknown
06:38 queued 10s
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 CheckResultSerializer|null
87
	 */
88
	private $checkResultSerializer;
89
90
	/**
91
	 * @var CheckResultDeserializer|null
92
	 */
93
	private $checkResultDeserializer;
94
95
	/**
96
	 * @var WikiPageEntityMetaDataAccessor|null
97
	 */
98
	private $wikiPageEntityMetaDataAccessor;
99
100
	/**
101
	 * @var ResultsSource|null
102
	 */
103
	private $resultsSource;
104
105
	// services used by this factory
106
107
	/**
108
	 * @var EntityLookup
109
	 */
110
	private $lookup;
111
112
	/**
113
	 * @var PropertyDataTypeLookup
114
	 */
115
	private $propertyDataTypeLookup;
116
117
	/**
118
	 * @var StatementGuidParser
119
	 */
120
	private $statementGuidParser;
121
122
	/**
123
	 * @var Config
124
	 */
125
	private $config;
126
127
	/**
128
	 * @var ConstraintParameterParser
129
	 */
130
	private $constraintParameterParser;
131
132
	/**
133
	 * @var ViolationMessageSerializer
134
	 */
135
	private $violationMessageSerializer;
136
137
	/**
138
	 * @var ViolationMessageDeserializer
139
	 */
140
	private $violationMessageDeserializer;
141
142
	/**
143
	 * @var RdfVocabulary
144
	 */
145
	private $rdfVocabulary;
146
147
	/**
148
	 * @var EntityIdParser
149
	 */
150
	private $entityIdParser;
151
152
	/**
153
	 * @var TitleParser
154
	 */
155
	private $titleParser;
156
157
	/**
158
	 * @var UnitConverter|null
159
	 */
160
	private $unitConverter;
161
162
	/**
163
	 * @var DataValueFactory
164
	 */
165
	private $dataValueFactory;
166
167
	/**
168
	 * @var EntityNamespaceLookup
169
	 */
170
	private $entityNamespaceLookup;
171
172
	/**
173
	 * @var IBufferingStatsdDataFactory
174
	 */
175
	private $dataFactory;
176
177
	/**
178
	 * Returns the default instance.
179
	 * IMPORTANT: Use only when it is not feasible to inject an instance properly.
180
	 *
181
	 * @return self
182
	 */
183
	public static function getDefaultInstance() {
184
		static $instance = null;
185
186
		if ( $instance === null ) {
187
			$wikibaseRepo = WikibaseRepo::getDefaultInstance();
188
			$config = MediaWikiServices::getInstance()->getMainConfig();
189
			$titleParser = MediaWikiServices::getInstance()->getTitleParser();
190
			$violationMessageDeserializer = new ViolationMessageDeserializer(
191
				$wikibaseRepo->getEntityIdParser(),
192
				$wikibaseRepo->getDataValueFactory()
193
			);
194
			$instance = new self(
195
				$wikibaseRepo->getEntityLookup(),
196
				$wikibaseRepo->getPropertyDataTypeLookup(),
197
				$wikibaseRepo->getStatementGuidParser(),
198
				$config,
199
				new ConstraintParameterParser(
200
					$config,
201
					$wikibaseRepo->getBaseDataModelDeserializerFactory(),
202
					$wikibaseRepo->getConceptBaseUris()
203
				),
204
				new ViolationMessageSerializer(),
205
				$violationMessageDeserializer,
206
				$wikibaseRepo->getRdfVocabulary(),
207
				$wikibaseRepo->getEntityIdParser(),
208
				$titleParser,
209
				$wikibaseRepo->getUnitConverter(),
210
				$wikibaseRepo->getDataValueFactory(),
211
				$wikibaseRepo->getEntityNamespaceLookup(),
212
				MediaWikiServices::getInstance()->getStatsdDataFactory()
213
			);
214
		}
215
216
		return $instance;
217
	}
218
219
	public function __construct(
220
		EntityLookup $lookup,
221
		PropertyDataTypeLookup $propertyDataTypeLookup,
222
		StatementGuidParser $statementGuidParser,
223
		Config $config,
224
		ConstraintParameterParser $constraintParameterParser,
225
		ViolationMessageSerializer $violationMessageSerializer,
226
		ViolationMessageDeserializer $violationMessageDeserializer,
227
		RdfVocabulary $rdfVocabulary,
228
		EntityIdParser $entityIdParser,
229
		TitleParser $titleParser,
230
		UnitConverter $unitConverter = null,
231
		DataValueFactory $dataValueFactory,
232
		EntityNamespaceLookup $entityNamespaceLookup,
233
		IBufferingStatsdDataFactory $dataFactory
234
	) {
235
		$this->lookup = $lookup;
236
		$this->propertyDataTypeLookup = $propertyDataTypeLookup;
237
		$this->statementGuidParser = $statementGuidParser;
238
		$this->config = $config;
239
		$this->constraintParameterParser = $constraintParameterParser;
240
		$this->violationMessageSerializer = $violationMessageSerializer;
241
		$this->violationMessageDeserializer = $violationMessageDeserializer;
242
		$this->rdfVocabulary = $rdfVocabulary;
243
		$this->entityIdParser = $entityIdParser;
244
		$this->titleParser = $titleParser;
245
		$this->unitConverter = $unitConverter;
246
		$this->dataValueFactory = $dataValueFactory;
247
		$this->entityNamespaceLookup = $entityNamespaceLookup;
248
		$this->dataFactory = $dataFactory;
249
	}
250
251
	/**
252
	 * @return DelegatingConstraintChecker
253
	 */
254
	public function getConstraintChecker() {
255
		if ( $this->delegatingConstraintChecker === null ) {
256
			$this->delegatingConstraintChecker = new DelegatingConstraintChecker(
257
				$this->lookup,
258
				$this->getConstraintCheckerMap(),
259
				ConstraintsServices::getConstraintLookup(),
260
				$this->constraintParameterParser,
261
				$this->statementGuidParser,
262
				ConstraintsServices::getLoggingHelper(),
263
				$this->config->get( 'WBQualityConstraintsCheckQualifiers' ),
264
				$this->config->get( 'WBQualityConstraintsCheckReferences' ),
265
				$this->config->get( 'WBQualityConstraintsPropertiesWithViolatingQualifiers' )
266
			);
267
		}
268
269
		return $this->delegatingConstraintChecker;
270
	}
271
272
	/**
273
	 * @return ConstraintChecker[]
274
	 */
275
	private function getConstraintCheckerMap() {
276
		if ( $this->constraintCheckerMap === null ) {
277
			$connectionCheckerHelper = new ConnectionCheckerHelper();
278
			$rangeCheckerHelper = new RangeCheckerHelper( $this->config, $this->unitConverter );
279
			if ( $this->config->get( 'WBQualityConstraintsSparqlEndpoint' ) !== '' ) {
280
				$sparqlHelper = new SparqlHelper(
281
					$this->config,
282
					$this->rdfVocabulary,
283
					$this->entityIdParser,
284
					$this->propertyDataTypeLookup,
285
					MediaWikiServices::getInstance()->getMainWANObjectCache(),
286
					$this->violationMessageSerializer,
287
					$this->violationMessageDeserializer,
288
					$this->dataFactory
289
				);
290
			} else {
291
				$sparqlHelper = null;
292
			}
293
			$typeCheckerHelper = new TypeCheckerHelper(
294
				$this->lookup,
295
				$this->config,
296
				$sparqlHelper,
297
				$this->dataFactory
298
			);
299
300
			$this->constraintCheckerMap = [
301
				$this->config->get( 'WBQualityConstraintsConflictsWithConstraintId' )
302
					=> new ConflictsWithChecker(
303
						$this->lookup,
304
						$this->constraintParameterParser,
305
						$connectionCheckerHelper
306
					),
307
				$this->config->get( 'WBQualityConstraintsItemRequiresClaimConstraintId' )
308
					=> new ItemChecker(
309
						$this->lookup,
310
						$this->constraintParameterParser,
311
						$connectionCheckerHelper
312
					),
313
				$this->config->get( 'WBQualityConstraintsValueRequiresClaimConstraintId' )
314
					=> new TargetRequiredClaimChecker(
315
						$this->lookup,
316
						$this->constraintParameterParser,
317
						$connectionCheckerHelper
318
					),
319
				$this->config->get( 'WBQualityConstraintsSymmetricConstraintId' )
320
					=> new SymmetricChecker(
321
						$this->lookup,
322
						$connectionCheckerHelper
323
					),
324
				$this->config->get( 'WBQualityConstraintsInverseConstraintId' )
325
					=> new InverseChecker(
326
						$this->lookup,
327
						$this->constraintParameterParser,
328
						$connectionCheckerHelper
329
					),
330
				$this->config->get( 'WBQualityConstraintsUsedAsQualifierConstraintId' )
331
					=> new QualifierChecker(),
332
				$this->config->get( 'WBQualityConstraintsAllowedQualifiersConstraintId' )
333
					=> new QualifiersChecker(
334
						$this->constraintParameterParser
335
					),
336
				$this->config->get( 'WBQualityConstraintsMandatoryQualifierConstraintId' )
337
					=> new MandatoryQualifiersChecker(
338
						$this->constraintParameterParser
339
					),
340
				$this->config->get( 'WBQualityConstraintsRangeConstraintId' )
341
					=> new RangeChecker(
342
						$this->propertyDataTypeLookup,
343
						$this->constraintParameterParser,
344
						$rangeCheckerHelper
345
					),
346
				$this->config->get( 'WBQualityConstraintsDifferenceWithinRangeConstraintId' )
347
					=> new DiffWithinRangeChecker(
348
						$this->constraintParameterParser,
349
						$rangeCheckerHelper,
350
						$this->config
351
					),
352
				$this->config->get( 'WBQualityConstraintsTypeConstraintId' )
353
					=> new TypeChecker(
354
						$this->lookup,
355
						$this->constraintParameterParser,
356
						$typeCheckerHelper,
357
						$this->config
358
					),
359
				$this->config->get( 'WBQualityConstraintsValueTypeConstraintId' )
360
					=> new ValueTypeChecker(
361
						$this->lookup,
362
						$this->constraintParameterParser,
363
						$typeCheckerHelper,
364
						$this->config
365
					),
366
				$this->config->get( 'WBQualityConstraintsSingleValueConstraintId' )
367
					=> new SingleValueChecker( $this->constraintParameterParser ),
368
				$this->config->get( 'WBQualityConstraintsMultiValueConstraintId' )
369
					=> new MultiValueChecker( $this->constraintParameterParser ),
370
				$this->config->get( 'WBQualityConstraintsDistinctValuesConstraintId' )
371
					=> new UniqueValueChecker(
372
						$sparqlHelper
373
					),
374
				$this->config->get( 'WBQualityConstraintsFormatConstraintId' )
375
					=> new FormatChecker(
376
						$this->constraintParameterParser,
377
						$this->config,
378
						$sparqlHelper
379
					),
380
				$this->config->get( 'WBQualityConstraintsCommonsLinkConstraintId' )
381
					=> new CommonsLinkChecker(
382
						$this->constraintParameterParser,
383
						$this->titleParser
384
					),
385
				$this->config->get( 'WBQualityConstraintsOneOfConstraintId' )
386
					=> new OneOfChecker(
387
						$this->constraintParameterParser
388
					),
389
				$this->config->get( 'WBQualityConstraintsUsedForValuesOnlyConstraintId' )
390
					=> new ValueOnlyChecker(),
391
				$this->config->get( 'WBQualityConstraintsUsedAsReferenceConstraintId' )
392
					=> new ReferenceChecker(),
393
				$this->config->get( 'WBQualityConstraintsNoBoundsConstraintId' )
394
					=> new NoBoundsChecker(),
395
				$this->config->get( 'WBQualityConstraintsAllowedUnitsConstraintId' )
396
					=> new AllowedUnitsChecker(
397
						$this->constraintParameterParser,
398
						$this->unitConverter
399
					),
400
				$this->config->get( 'WBQualityConstraintsSingleBestValueConstraintId' )
401
					=> new SingleBestValueChecker( $this->constraintParameterParser ),
402
				$this->config->get( 'WBQualityConstraintsAllowedEntityTypesConstraintId' )
403
					=> new EntityTypeChecker(
404
						$this->constraintParameterParser
405
					),
406
				$this->config->get( 'WBQualityConstraintsNoneOfConstraintId' )
407
					=> new NoneOfChecker(
408
						$this->constraintParameterParser
409
					),
410
				$this->config->get( 'WBQualityConstraintsIntegerConstraintId' )
411
					=> new IntegerChecker(),
412
				$this->config->get( 'WBQualityConstraintsCitationNeededConstraintId' )
413
					=> new CitationNeededChecker(),
414
			];
415
		}
416
417
		return $this->constraintCheckerMap;
418
	}
419
420
	/**
421
	 * @return CheckResultSerializer
422
	 */
423
	public function getCheckResultSerializer() {
424
		if ( $this->checkResultSerializer === null ) {
425
			$this->checkResultSerializer = new CheckResultSerializer(
426
				new ConstraintSerializer(
427
					false // constraint parameters are not exposed
428
				),
429
				new ContextCursorSerializer(),
430
				new ViolationMessageSerializer(),
431
				false // unnecessary to serialize individual result dependencies
432
			);
433
		}
434
435
		return $this->checkResultSerializer;
436
	}
437
438
	/**
439
	 * @return CheckResultDeserializer
440
	 */
441
	public function getCheckResultDeserializer() {
442
		if ( $this->checkResultDeserializer === null ) {
443
			$this->checkResultDeserializer = new CheckResultDeserializer(
444
				new ConstraintDeserializer(),
445
				new ContextCursorDeserializer(),
446
				new ViolationMessageDeserializer(
447
					$this->entityIdParser,
448
					$this->dataValueFactory
449
				),
450
				$this->entityIdParser
451
			);
452
		}
453
454
		return $this->checkResultDeserializer;
455
	}
456
457
	/**
458
	 * @return WikiPageEntityMetaDataAccessor
459
	 */
460
	public function getWikiPageEntityMetaDataAccessor() {
461
		if ( $this->wikiPageEntityMetaDataAccessor === null ) {
462
			$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...
463
				$this->entityNamespaceLookup
464
			);
465
		}
466
467
		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 467 which is incompatible with the return type documented by WikibaseQuality\Constrai...eEntityMetaDataAccessor of type Wikibase\Lib\Store\Sql\W...eEntityMetaDataAccessor.
Loading history...
468
	}
469
470
	/**
471
	 * @return ResultsSource
472
	 */
473
	public function getResultsSource() {
474
		if ( $this->resultsSource === null ) {
475
			$this->resultsSource = new CheckingResultsSource(
476
				$this->getConstraintChecker()
477
			);
478
479
			if ( $this->config->get( 'WBQualityConstraintsCacheCheckConstraintsResults' ) ) {
480
				$this->resultsSource = new CachingResultsSource(
481
					$this->resultsSource,
482
					ResultsCache::getDefaultInstance(),
483
					$this->getCheckResultSerializer(),
484
					$this->getCheckResultDeserializer(),
485
					$this->getWikiPageEntityMetaDataAccessor(),
486
					$this->entityIdParser,
487
					$this->config->get( 'WBQualityConstraintsCacheCheckConstraintsTTLSeconds' ),
488
					$this->getPossiblyStaleConstraintTypes(),
489
					$this->config->get( 'WBQualityConstraintsCacheCheckConstraintsMaximumRevisionIds' ),
490
					ConstraintsServices::getLoggingHelper()
491
				);
492
			}
493
		}
494
495
		return $this->resultsSource;
496
	}
497
498
	/**
499
	 * @return string[]
500
	 */
501
	public function getPossiblyStaleConstraintTypes() {
502
		return [
503
			$this->config->get( 'WBQualityConstraintsCommonsLinkConstraintId' ),
504
			$this->config->get( 'WBQualityConstraintsTypeConstraintId' ),
505
			$this->config->get( 'WBQualityConstraintsValueTypeConstraintId' ),
506
			$this->config->get( 'WBQualityConstraintsDistinctValuesConstraintId' ),
507
		];
508
	}
509
510
}
511