From 19dba8409070b4b0d5a2c09a6a1750f1adc8d5e9 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Mon, 18 Mar 2024 17:06:13 +0100 Subject: [PATCH 1/4] Rule: Require `sameAs(Rule $rule): bool` from implementors --- src/Filter/Rule.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Filter/Rule.php b/src/Filter/Rule.php index dc83c80..60b215b 100644 --- a/src/Filter/Rule.php +++ b/src/Filter/Rule.php @@ -4,4 +4,12 @@ interface Rule { + /** + * Get whether the given rule is semantically the same as this one + * + * @param Rule $rule + * + * @return bool + */ + public function sameAs(Rule $rule): bool; } From e48a27375e9b8aedbbe4e6187c7a510a24b62a05 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Mon, 18 Mar 2024 17:07:15 +0100 Subject: [PATCH 2/4] Filter\Condition: Implement `sameAs(Rule $rule): bool` --- src/Filter/Condition.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Filter/Condition.php b/src/Filter/Condition.php index cc35610..b42b6c3 100644 --- a/src/Filter/Condition.php +++ b/src/Filter/Condition.php @@ -34,6 +34,13 @@ public function __clone() } } + public function sameAs(Rule $rule): bool + { + return $rule instanceof static + && $rule->getColumn() === $this->getColumn() + && $rule->getValue() === $this->getValue(); + } + /** * Set this condition's column * From e15a8cf331c30db3f7ffbdd66fb68b1355de9483 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Mon, 18 Mar 2024 17:07:40 +0100 Subject: [PATCH 3/4] Filter\Chain: Implement `sameAs(Rule $rule): bool` --- src/Filter/Chain.php | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/Filter/Chain.php b/src/Filter/Chain.php index c0060e6..911f5f1 100644 --- a/src/Filter/Chain.php +++ b/src/Filter/Chain.php @@ -42,6 +42,35 @@ public function __clone() } } + public function sameAs(Rule $rule): bool + { + if (! $rule instanceof static) { + return false; + } + + if (count($rule) !== count($this->rules)) { + return false; + } + + $theirRules = iterator_to_array($rule); + foreach ($this->rules as $myRule) { + $found = false; + foreach ($theirRules as $i => $theirRule) { + if ($myRule->sameAs($theirRule)) { + unset($theirRules[$i]); + $found = true; + break; + } + } + + if (! $found) { + return false; + } + } + + return true; + } + /** * Get an iterator this chain's rules * From 5d59f952fca4e9e52f1f122ba54c511b71432de4 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Mon, 18 Mar 2024 17:08:06 +0100 Subject: [PATCH 4/4] Consider special cases when comparing filter rules --- src/Filter/Equal.php | 17 +++++++++++++++++ src/Filter/Like.php | 17 +++++++++++++++++ src/Filter/Unequal.php | 17 +++++++++++++++++ src/Filter/Unlike.php | 17 +++++++++++++++++ 4 files changed, 68 insertions(+) diff --git a/src/Filter/Equal.php b/src/Filter/Equal.php index 71da490..f1ed137 100644 --- a/src/Filter/Equal.php +++ b/src/Filter/Equal.php @@ -28,4 +28,21 @@ public function ignoresCase() { return $this->ignoreCase; } + + public function sameAs(Rule $rule): bool + { + if (! $rule instanceof static) { + return false; + } + + if ($this->ignoresCase() !== $rule->ignoresCase()) { + return false; + } + + if (is_array($this->value)) { + return array_diff($this->value, (array) $rule->getValue()) === []; + } + + return parent::sameAs($rule); + } } diff --git a/src/Filter/Like.php b/src/Filter/Like.php index 7a06279..9336921 100644 --- a/src/Filter/Like.php +++ b/src/Filter/Like.php @@ -28,4 +28,21 @@ public function ignoresCase() { return $this->ignoreCase; } + + public function sameAs(Rule $rule): bool + { + if (! $rule instanceof static) { + return false; + } + + if ($rule->ignoresCase() !== $this->ignoresCase()) { + return false; + } + + if (is_array($this->value)) { + return array_diff($this->value, (array) $rule->getValue()) === []; + } + + return parent::sameAs($rule); + } } diff --git a/src/Filter/Unequal.php b/src/Filter/Unequal.php index 5e37cbd..e231b8b 100644 --- a/src/Filter/Unequal.php +++ b/src/Filter/Unequal.php @@ -28,4 +28,21 @@ public function ignoresCase() { return $this->ignoreCase; } + + public function sameAs(Rule $rule): bool + { + if (! $rule instanceof static) { + return false; + } + + if ($this->ignoresCase() !== $rule->ignoresCase()) { + return false; + } + + if (is_array($this->value)) { + return array_diff($this->value, (array) $rule->getValue()) === []; + } + + return parent::sameAs($rule); + } } diff --git a/src/Filter/Unlike.php b/src/Filter/Unlike.php index 16b9fb3..1737ed6 100644 --- a/src/Filter/Unlike.php +++ b/src/Filter/Unlike.php @@ -28,4 +28,21 @@ public function ignoresCase() { return $this->ignoreCase; } + + public function sameAs(Rule $rule): bool + { + if (! $rule instanceof static) { + return false; + } + + if ($rule->ignoresCase() !== $this->ignoresCase()) { + return false; + } + + if (is_array($this->value)) { + return array_diff($this->value, (array) $rule->getValue()) === []; + } + + return parent::sameAs($rule); + } }