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

ConstraintReportFactory::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 25

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 25
rs 9.52
c 0
b 0
f 0
cc 1
nc 1
nop 11

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\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