Completed
Push — master ( 29c144...1bc02d )
by
unknown
06:38 queued 10s
created

ConstraintReportFactory   C

Complexity

Total Complexity 18

Size/Duplication

Total Lines 440
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 45

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 18
c 1
b 0
f 0
lcom 1
cbo 45
dl 0
loc 440
rs 5

9 Methods

Rating   Name   Duplication   Size   Complexity  
B getDefaultInstance() 0 35 2
B __construct() 0 31 1
A getConstraintChecker() 0 17 2
B getConstraintCheckerMap() 0 144 3
A getCheckResultSerializer() 0 14 2
A getCheckResultDeserializer() 0 15 2
A getWikiPageEntityMetaDataAccessor() 0 9 2
B getResultsSource() 0 24 3
A getPossiblyStaleConstraintTypes() 0 8 1
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