Completed
Push — master ( f2f357...ccb861 )
by
unknown
02:21
created

ConstraintReportFactory::getResultsSource()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 24

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 24
rs 9.536
c 0
b 0
f 0
cc 3
nc 3
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\DelegatingConstraintChecker;
32
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\CommonsLinkChecker;
33
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\FormatChecker;
34
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\OneOfChecker;
35
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\QualifierChecker;
36
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\RangeChecker;
37
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\TypeChecker;
38
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\ConflictsWithChecker;
39
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\QualifiersChecker;
40
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\TargetRequiredClaimChecker;
41
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\ItemChecker;
42
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\MandatoryQualifiersChecker;
43
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\ValueTypeChecker;
44
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\SymmetricChecker;
45
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\InverseChecker;
46
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\DiffWithinRangeChecker;
47
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\SingleValueChecker;
48
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\MultiValueChecker;
49
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\UniqueValueChecker;
50
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\ValueOnlyChecker;
51
use WikibaseQuality\ConstraintReport\ConstraintCheck\ConstraintChecker;
52
use WikibaseQuality\ConstraintReport\ConstraintCheck\Helper\ConnectionCheckerHelper;
53
use WikibaseQuality\ConstraintReport\ConstraintCheck\Helper\RangeCheckerHelper;
54
use WikibaseQuality\ConstraintReport\ConstraintCheck\Helper\SparqlHelper;
55
use WikibaseQuality\ConstraintReport\ConstraintCheck\Helper\TypeCheckerHelper;
56
use Wikibase\DataModel\Services\Statement\StatementGuidParser;
57
58
/**
59
 * Factory for {@link DelegatingConstraintChecker}
60
 * and {@link ConstraintRepository}.
61
 *
62
 * @license GPL-2.0-or-later
63
 */
64
class ConstraintReportFactory {
65
66
	// services created by this factory
67
68
	/**
69
	 * @var DelegatingConstraintChecker|null
70
	 */
71
	private $delegatingConstraintChecker;
72
73
	/**
74
	 * @var ConstraintChecker[]|null
75
	 */
76
	private $constraintCheckerMap;
77
78
	/**
79
	 * @var WikiPageEntityMetaDataAccessor|null
80
	 */
81
	private $wikiPageEntityMetaDataAccessor;
82
83
	/**
84
	 * @var ResultsSource|null
85
	 */
86
	private $resultsSource;
87
88
	// services used by this factory
89
90
	/**
91
	 * @var EntityLookup
92
	 */
93
	private $lookup;
94
95
	/**
96
	 * @var PropertyDataTypeLookup
97
	 */
98
	private $propertyDataTypeLookup;
99
100
	/**
101
	 * @var StatementGuidParser
102
	 */
103
	private $statementGuidParser;
104
105
	/**
106
	 * @var Config
107
	 */
108
	private $config;
109
110
	/**
111
	 * @var RdfVocabulary
112
	 */
113
	private $rdfVocabulary;
114
115
	/**
116
	 * @var EntityIdParser
117
	 */
118
	private $entityIdParser;
119
120
	/**
121
	 * @var TitleParser
122
	 */
123
	private $titleParser;
124
125
	/**
126
	 * @var UnitConverter|null
127
	 */
128
	private $unitConverter;
129
130
	/**
131
	 * @var DataValueFactory
132
	 */
133
	private $dataValueFactory;
134
135
	/**
136
	 * @var EntityNamespaceLookup
137
	 */
138
	private $entityNamespaceLookup;
139
140
	/**
141
	 * @var IBufferingStatsdDataFactory
142
	 */
143
	private $dataFactory;
144
145
	/**
146
	 * Returns the default instance.
147
	 * IMPORTANT: Use only when it is not feasible to inject an instance properly.
148
	 *
149
	 * @return self
150
	 */
151
	public static function getDefaultInstance() {
152
		static $instance = null;
153
154
		if ( $instance === null ) {
155
			$wikibaseRepo = WikibaseRepo::getDefaultInstance();
156
			$config = MediaWikiServices::getInstance()->getMainConfig();
157
			$titleParser = MediaWikiServices::getInstance()->getTitleParser();
158
			$instance = new self(
159
				$wikibaseRepo->getEntityLookup(),
160
				$wikibaseRepo->getPropertyDataTypeLookup(),
161
				$wikibaseRepo->getStatementGuidParser(),
162
				$config,
163
				$wikibaseRepo->getRdfVocabulary(),
164
				$wikibaseRepo->getEntityIdParser(),
165
				$titleParser,
166
				$wikibaseRepo->getUnitConverter(),
167
				$wikibaseRepo->getDataValueFactory(),
168
				$wikibaseRepo->getEntityNamespaceLookup(),
169
				MediaWikiServices::getInstance()->getStatsdDataFactory()
170
			);
171
		}
172
173
		return $instance;
174
	}
175
176
	public function __construct(
177
		EntityLookup $lookup,
178
		PropertyDataTypeLookup $propertyDataTypeLookup,
179
		StatementGuidParser $statementGuidParser,
180
		Config $config,
181
		RdfVocabulary $rdfVocabulary,
182
		EntityIdParser $entityIdParser,
183
		TitleParser $titleParser,
184
		UnitConverter $unitConverter = null,
185
		DataValueFactory $dataValueFactory,
186
		EntityNamespaceLookup $entityNamespaceLookup,
187
		IBufferingStatsdDataFactory $dataFactory
188
	) {
189
		$this->lookup = $lookup;
190
		$this->propertyDataTypeLookup = $propertyDataTypeLookup;
191
		$this->statementGuidParser = $statementGuidParser;
192
		$this->config = $config;
193
		$this->rdfVocabulary = $rdfVocabulary;
194
		$this->entityIdParser = $entityIdParser;
195
		$this->titleParser = $titleParser;
196
		$this->unitConverter = $unitConverter;
197
		$this->dataValueFactory = $dataValueFactory;
198
		$this->entityNamespaceLookup = $entityNamespaceLookup;
199
		$this->dataFactory = $dataFactory;
200
	}
201
202
	/**
203
	 * @return DelegatingConstraintChecker
204
	 */
205
	public function getConstraintChecker() {
206
		if ( $this->delegatingConstraintChecker === null ) {
207
			$this->delegatingConstraintChecker = new DelegatingConstraintChecker(
208
				$this->lookup,
209
				$this->getConstraintCheckerMap(),
210
				ConstraintsServices::getConstraintLookup(),
211
				ConstraintsServices::getConstraintParameterParser(),
212
				$this->statementGuidParser,
213
				ConstraintsServices::getLoggingHelper(),
214
				$this->config->get( 'WBQualityConstraintsCheckQualifiers' ),
215
				$this->config->get( 'WBQualityConstraintsCheckReferences' ),
216
				$this->config->get( 'WBQualityConstraintsPropertiesWithViolatingQualifiers' )
217
			);
218
		}
219
220
		return $this->delegatingConstraintChecker;
221
	}
222
223
	/**
224
	 * @return ConstraintChecker[]
225
	 */
226
	private function getConstraintCheckerMap() {
227
		if ( $this->constraintCheckerMap === null ) {
228
			$connectionCheckerHelper = new ConnectionCheckerHelper();
229
			$rangeCheckerHelper = new RangeCheckerHelper( $this->config, $this->unitConverter );
230
			if ( $this->config->get( 'WBQualityConstraintsSparqlEndpoint' ) !== '' ) {
231
				$sparqlHelper = new SparqlHelper(
232
					$this->config,
233
					$this->rdfVocabulary,
234
					$this->entityIdParser,
235
					$this->propertyDataTypeLookup,
236
					MediaWikiServices::getInstance()->getMainWANObjectCache(),
237
					ConstraintsServices::getViolationMessageSerializer(),
238
					ConstraintsServices::getViolationMessageDeserializer(),
239
					$this->dataFactory
240
				);
241
			} else {
242
				$sparqlHelper = null;
243
			}
244
			$typeCheckerHelper = new TypeCheckerHelper(
245
				$this->lookup,
246
				$this->config,
247
				$sparqlHelper,
248
				$this->dataFactory
249
			);
250
251
			$this->constraintCheckerMap = [
252
				$this->config->get( 'WBQualityConstraintsConflictsWithConstraintId' )
253
					=> new ConflictsWithChecker(
254
						$this->lookup,
255
						ConstraintsServices::getConstraintParameterParser(),
256
						$connectionCheckerHelper
257
					),
258
				$this->config->get( 'WBQualityConstraintsItemRequiresClaimConstraintId' )
259
					=> new ItemChecker(
260
						$this->lookup,
261
						ConstraintsServices::getConstraintParameterParser(),
262
						$connectionCheckerHelper
263
					),
264
				$this->config->get( 'WBQualityConstraintsValueRequiresClaimConstraintId' )
265
					=> new TargetRequiredClaimChecker(
266
						$this->lookup,
267
						ConstraintsServices::getConstraintParameterParser(),
268
						$connectionCheckerHelper
269
					),
270
				$this->config->get( 'WBQualityConstraintsSymmetricConstraintId' )
271
					=> new SymmetricChecker(
272
						$this->lookup,
273
						$connectionCheckerHelper
274
					),
275
				$this->config->get( 'WBQualityConstraintsInverseConstraintId' )
276
					=> new InverseChecker(
277
						$this->lookup,
278
						ConstraintsServices::getConstraintParameterParser(),
279
						$connectionCheckerHelper
280
					),
281
				$this->config->get( 'WBQualityConstraintsUsedAsQualifierConstraintId' )
282
					=> new QualifierChecker(),
283
				$this->config->get( 'WBQualityConstraintsAllowedQualifiersConstraintId' )
284
					=> new QualifiersChecker(
285
						ConstraintsServices::getConstraintParameterParser()
286
					),
287
				$this->config->get( 'WBQualityConstraintsMandatoryQualifierConstraintId' )
288
					=> new MandatoryQualifiersChecker(
289
						ConstraintsServices::getConstraintParameterParser()
290
					),
291
				$this->config->get( 'WBQualityConstraintsRangeConstraintId' )
292
					=> new RangeChecker(
293
						$this->propertyDataTypeLookup,
294
						ConstraintsServices::getConstraintParameterParser(),
295
						$rangeCheckerHelper
296
					),
297
				$this->config->get( 'WBQualityConstraintsDifferenceWithinRangeConstraintId' )
298
					=> new DiffWithinRangeChecker(
299
						ConstraintsServices::getConstraintParameterParser(),
300
						$rangeCheckerHelper,
301
						$this->config
302
					),
303
				$this->config->get( 'WBQualityConstraintsTypeConstraintId' )
304
					=> new TypeChecker(
305
						$this->lookup,
306
						ConstraintsServices::getConstraintParameterParser(),
307
						$typeCheckerHelper,
308
						$this->config
309
					),
310
				$this->config->get( 'WBQualityConstraintsValueTypeConstraintId' )
311
					=> new ValueTypeChecker(
312
						$this->lookup,
313
						ConstraintsServices::getConstraintParameterParser(),
314
						$typeCheckerHelper,
315
						$this->config
316
					),
317
				$this->config->get( 'WBQualityConstraintsSingleValueConstraintId' )
318
					=> new SingleValueChecker( ConstraintsServices::getConstraintParameterParser() ),
319
				$this->config->get( 'WBQualityConstraintsMultiValueConstraintId' )
320
					=> new MultiValueChecker( ConstraintsServices::getConstraintParameterParser() ),
321
				$this->config->get( 'WBQualityConstraintsDistinctValuesConstraintId' )
322
					=> new UniqueValueChecker(
323
						$sparqlHelper
324
					),
325
				$this->config->get( 'WBQualityConstraintsFormatConstraintId' )
326
					=> new FormatChecker(
327
						ConstraintsServices::getConstraintParameterParser(),
328
						$this->config,
329
						$sparqlHelper
330
					),
331
				$this->config->get( 'WBQualityConstraintsCommonsLinkConstraintId' )
332
					=> new CommonsLinkChecker(
333
						ConstraintsServices::getConstraintParameterParser(),
334
						$this->titleParser
335
					),
336
				$this->config->get( 'WBQualityConstraintsOneOfConstraintId' )
337
					=> new OneOfChecker(
338
						ConstraintsServices::getConstraintParameterParser()
339
					),
340
				$this->config->get( 'WBQualityConstraintsUsedForValuesOnlyConstraintId' )
341
					=> new ValueOnlyChecker(),
342
				$this->config->get( 'WBQualityConstraintsUsedAsReferenceConstraintId' )
343
					=> new ReferenceChecker(),
344
				$this->config->get( 'WBQualityConstraintsNoBoundsConstraintId' )
345
					=> new NoBoundsChecker(),
346
				$this->config->get( 'WBQualityConstraintsAllowedUnitsConstraintId' )
347
					=> new AllowedUnitsChecker(
348
						ConstraintsServices::getConstraintParameterParser(),
349
						$this->unitConverter
350
					),
351
				$this->config->get( 'WBQualityConstraintsSingleBestValueConstraintId' )
352
					=> new SingleBestValueChecker( ConstraintsServices::getConstraintParameterParser() ),
353
				$this->config->get( 'WBQualityConstraintsAllowedEntityTypesConstraintId' )
354
					=> new EntityTypeChecker(
355
						ConstraintsServices::getConstraintParameterParser()
356
					),
357
				$this->config->get( 'WBQualityConstraintsNoneOfConstraintId' )
358
					=> new NoneOfChecker(
359
						ConstraintsServices::getConstraintParameterParser()
360
					),
361
				$this->config->get( 'WBQualityConstraintsIntegerConstraintId' )
362
					=> new IntegerChecker(),
363
				$this->config->get( 'WBQualityConstraintsCitationNeededConstraintId' )
364
					=> new CitationNeededChecker(),
365
			];
366
		}
367
368
		return $this->constraintCheckerMap;
369
	}
370
371
	/**
372
	 * @return WikiPageEntityMetaDataAccessor
373
	 */
374
	public function getWikiPageEntityMetaDataAccessor() {
375
		if ( $this->wikiPageEntityMetaDataAccessor === null ) {
376
			$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...
377
				$this->entityNamespaceLookup
378
			);
379
		}
380
381
		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 381 which is incompatible with the return type documented by WikibaseQuality\Constrai...eEntityMetaDataAccessor of type Wikibase\Lib\Store\Sql\W...eEntityMetaDataAccessor.
Loading history...
382
	}
383
384
	/**
385
	 * @return ResultsSource
386
	 */
387
	public function getResultsSource() {
388
		if ( $this->resultsSource === null ) {
389
			$this->resultsSource = new CheckingResultsSource(
390
				$this->getConstraintChecker()
391
			);
392
393
			if ( $this->config->get( 'WBQualityConstraintsCacheCheckConstraintsResults' ) ) {
394
				$this->resultsSource = new CachingResultsSource(
395
					$this->resultsSource,
396
					ResultsCache::getDefaultInstance(),
397
					ConstraintsServices::getCheckResultSerializer(),
398
					ConstraintsServices::getCheckResultDeserializer(),
399
					$this->getWikiPageEntityMetaDataAccessor(),
400
					$this->entityIdParser,
401
					$this->config->get( 'WBQualityConstraintsCacheCheckConstraintsTTLSeconds' ),
402
					$this->getPossiblyStaleConstraintTypes(),
403
					$this->config->get( 'WBQualityConstraintsCacheCheckConstraintsMaximumRevisionIds' ),
404
					ConstraintsServices::getLoggingHelper()
405
				);
406
			}
407
		}
408
409
		return $this->resultsSource;
410
	}
411
412
	/**
413
	 * @return string[]
414
	 */
415
	public function getPossiblyStaleConstraintTypes() {
416
		return [
417
			$this->config->get( 'WBQualityConstraintsCommonsLinkConstraintId' ),
418
			$this->config->get( 'WBQualityConstraintsTypeConstraintId' ),
419
			$this->config->get( 'WBQualityConstraintsValueTypeConstraintId' ),
420
			$this->config->get( 'WBQualityConstraintsDistinctValuesConstraintId' ),
421
		];
422
	}
423
424
}
425