@@ 193-215 (lines=23) @@ | ||
190 | /** |
|
191 | * Remove AndRules operands of AndRules |
|
192 | */ |
|
193 | public function removeSameOperationOperands() |
|
194 | { |
|
195 | foreach ($this->operands as $i => $operand) { |
|
196 | if ( ! is_a($operand, AndRule::class)) { |
|
197 | continue; |
|
198 | } |
|
199 | ||
200 | if ( ! $operands = $operand->getOperands()) { |
|
201 | continue; |
|
202 | } |
|
203 | ||
204 | // Id AND is an operand on AND they can be merge (and the same with OR) |
|
205 | foreach ($operands as $sub_operand) { |
|
206 | $this->addOperand( $sub_operand->copy() ); |
|
207 | } |
|
208 | unset($this->operands[$i]); |
|
209 | ||
210 | // possibility of mono-operand or dupicates |
|
211 | $has_been_changed = true; |
|
212 | } |
|
213 | ||
214 | return ! empty($has_been_changed); |
|
215 | } |
|
216 | ||
217 | /** |
|
218 | * Removes rule branches that cannot produce result like: |
@@ 19-41 (lines=23) @@ | ||
16 | /** |
|
17 | * Remove AndRules operands of AndRules and OrRules of OrRules. |
|
18 | */ |
|
19 | public function removeSameOperationOperands(array $simplification_options) |
|
20 | { |
|
21 | foreach ($this->operands as $i => &$operand) { |
|
22 | if ( ! is_a($operand, OrRule::class)) { |
|
23 | continue; |
|
24 | } |
|
25 | ||
26 | if ( ! $operand->isNormalizationAllowed($simplification_options) ) { |
|
27 | continue; |
|
28 | } |
|
29 | ||
30 | // Id AND is an operand on AND they can be merge (and the same with OR) |
|
31 | foreach ($operand->getOperands() as $sub_operand) { |
|
32 | $this->addOperand( $sub_operand->copy() ); |
|
33 | } |
|
34 | unset($this->operands[$i]); |
|
35 | ||
36 | // possibility of mono-operand or dupicates |
|
37 | $has_been_changed = true; |
|
38 | } |
|
39 | ||
40 | return ! empty($has_been_changed); |
|
41 | } |
|
42 | ||
43 | /** |
|
44 | * Replace all the OrRules of the RuleTree by one OrRule at its root. |