UsageValidator::matchPrefixes()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 3
rs 10
cc 1
eloc 2
nc 1
nop 1
1
<?php
2
3
namespace Asparagus;
4
5
use RangeException;
6
7
/**
8
 * Package-private class to validate the usage of variables and prefixes.
9
 *
10
 * @license GNU GPL v2+
11
 * @author Bene* < [email protected] >
12
 */
13
class UsageValidator {
14
15
	/**
16
	 * @var string[] list of used variables without prefixes
17
	 */
18
	private $usedVariables = array();
19
20
	/**
21
	 * @var string[] list of defined variables without prefixes
22
	 */
23
	private $definedVariables = array();
24
25
	/**
26
	 * @var string[] list of used prefixes
27
	 */
28
	private $usedPrefixes = array();
29
30
	/**
31
	 * @var string[] list of defined prefixes
32
	 */
33
	private $definedPrefixes = array();
34
35
	/**
36
	 * @var RegexHelper
37
	 */
38
	private $regexHelper;
39
40
	public function __construct() {
41
		$this->regexHelper = new RegexHelper();
42
	}
43
44
	/**
45
	 * Trackes the list of variables as used.
46
	 *
47
	 * @param string[]|string $variables list of variables without prefixes
48
	 */
49
	public function trackUsedVariables( $variables ) {
50
		if ( !is_array( $variables ) ) {
51
			$variables = $this->matchVariables( $variables );
52
		}
53
54
		$this->usedVariables = array_unique( array_merge( $this->usedVariables, $variables ) );
0 ignored issues
show
Documentation Bug introduced by
It seems like array_unique(array_merge...Variables, $variables)) of type array is incompatible with the declared type array<integer,string> of property $usedVariables.

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...
55
	}
56
57
	/**
58
	 * Trackes the list of variables as defined.
59
	 *
60
	 * @param string[]|string $variables list of variables without prefixes
61
	 */
62
	public function trackDefinedVariables( $variables )  {
63
		if ( !is_array( $variables ) ) {
64
			$variables = $this->matchVariables( $variables );
65
		}
66
67
		$this->definedVariables = array_unique( array_merge( $this->definedVariables, $variables ) );
0 ignored issues
show
Documentation Bug introduced by
It seems like array_unique(array_merge...Variables, $variables)) of type array is incompatible with the declared type array<integer,string> of property $definedVariables.

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...
68
	}
69
70
	/**
71
	 * Trackes the list of prefixes as used.
72
	 *
73
	 * @param string[]|string $prefixes list of prefixes
74
	 */
75
	public function trackUsedPrefixes( $prefixes )  {
76
		if ( !is_array( $prefixes ) ) {
77
			$prefixes = $this->matchPrefixes( $prefixes );
78
		}
79
80
		$this->usedPrefixes = array_merge( $this->usedPrefixes, $prefixes );
0 ignored issues
show
Documentation Bug introduced by
It seems like array_merge($this->usedPrefixes, $prefixes) of type array is incompatible with the declared type array<integer,string> of property $usedPrefixes.

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...
81
	}
82
83
	/**
84
	 * Trackes the list of prefixes as defined.
85
	 *
86
	 * @param string[]|string $prefixes list of prefixes
87
	 */
88
	public function trackDefinedPrefixes( $prefixes )  {
89
		if ( !is_array( $prefixes ) ) {
90
			$prefixes = $this->matchPrefixes( $prefixes );
91
		}
92
93
		$this->definedPrefixes = array_merge( $this->definedPrefixes, $prefixes );
0 ignored issues
show
Documentation Bug introduced by
It seems like array_merge($this->definedPrefixes, $prefixes) of type array is incompatible with the declared type array<integer,string> of property $definedPrefixes.

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...
94
	}
95
96
	private function matchVariables( $expression ) {
97
		return $this->regexHelper->getMatches( '(^|\W)(?<!AS )\{variable}', $expression, 2 );
98
	}
99
100
	private function matchPrefixes( $expression ) {
101
		return $this->regexHelper->getMatches( '(^|\W)(\{prefix}):\{name}', $expression, 2 );
102
	}
103
104
	/**
105
	 * Validates the variables and prefixes tracked.
106
	 *
107
	 * @throws RangeException
108
	 */
109
	public function validate() {
110
		$this->validatePrefixes();
111
		$this->validateVariables();
112
	}
113
114
	private function validatePrefixes() {
115
		$diff = array_diff( $this->usedPrefixes, $this->definedPrefixes );
116
		if ( !empty( $diff ) ) {
117
			throw new RangeException( 'The prefixes ' . implode( ', ', $diff ) . ' aren\'t defined for this query.' );
118
		}
119
	}
120
121
	private function validateVariables() {
122
		$diff = array_diff( $this->usedVariables, $this->definedVariables );
123
		if ( !empty( $diff ) ) {
124
			throw new RangeException( 'The variables ?' . implode( ', ?', $diff ) . ' don\'t occur in this query.' );
125
		}
126
	}
127
128
}
129