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

getCheckResultSerializer()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 14
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 14
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 9
nc 2
nop 0
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