From a0c3baddfb4a00692f3ace230fd06457b320f60e Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 11 Aug 2025 06:39:58 +0000 Subject: [PATCH 1/5] Add selective filter skipping to Database class Co-authored-by: jakeb994 --- src/Database/Database.php | 44 ++++++++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/src/Database/Database.php b/src/Database/Database.php index cc30ddb10..9f26af32a 100644 --- a/src/Database/Database.php +++ b/src/Database/Database.php @@ -348,6 +348,15 @@ class Database protected bool $filter = true; + /** + * Array in which the keys are the names of filters that + * should be skipped when decoding attributes. null $disabledFilters + * will skip all filters. + * + * @var ?array + */ + protected ?array $disabledFilters = []; + protected bool $validate = true; protected bool $preserveDates = false; @@ -809,21 +818,41 @@ public function disableFilters(): static /** * Skip filters * - * Execute a callback without filters + * Execute a callback without filters, or with specific filters disabled * * @template T * @param callable(): T $callback + * @param array|null $filterNames List of filter names to skip; if null, all filters will be skipped * @return T */ - public function skipFilters(callable $callback): mixed + public function skipFilters(callable $callback, ?array $filterNames = null): mixed { - $initial = $this->filter; - $this->disableFilters(); + $previousFilter = $this->filter; + $previousDisabledFilters = $this->disabledFilters; + + if (is_null($filterNames)) { + // Skip all filters - existing behavior + $this->disableFilters(); + } else { + // Skip specific filters - new behavior + if (empty($filterNames)) { + // Empty array means skip no filters (keep current behavior) + $this->disabledFilters = []; + } else { + // Create fast lookup map: value => true + $disabledFilters = []; + foreach ($filterNames as $filterName) { + $disabledFilters[$filterName] = true; + } + $this->disabledFilters = $disabledFilters; + } + } try { return $callback(); } finally { - $this->filter = $initial; + $this->filter = $previousFilter; + $this->disabledFilters = $previousDisabledFilters; } } @@ -6625,6 +6654,11 @@ protected function decodeAttribute(string $filter, mixed $value, Document $docum return $value; } + // Skip filters that are disabled + if (!is_null($this->disabledFilters) && isset($this->disabledFilters[$filter])) { + return $value; + } + if (!array_key_exists($filter, self::$filters) && !array_key_exists($filter, $this->instanceFilters)) { throw new NotFoundException("Filter \"{$filter}\" not found for attribute \"{$attribute}\""); } From 91d1140d44f0d03e66310945264d02356cfcae0b Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 11 Aug 2025 06:54:05 +0000 Subject: [PATCH 2/5] Refactor skipFilters method and remove unnecessary comments Co-authored-by: jakeb994 --- src/Database/Database.php | 28 +++------------------------- 1 file changed, 3 insertions(+), 25 deletions(-) diff --git a/src/Database/Database.php b/src/Database/Database.php index 9f26af32a..e8482280a 100644 --- a/src/Database/Database.php +++ b/src/Database/Database.php @@ -348,13 +348,6 @@ class Database protected bool $filter = true; - /** - * Array in which the keys are the names of filters that - * should be skipped when decoding attributes. null $disabledFilters - * will skip all filters. - * - * @var ?array - */ protected ?array $disabledFilters = []; protected bool $validate = true; @@ -815,31 +808,17 @@ public function disableFilters(): static return $this; } - /** - * Skip filters - * - * Execute a callback without filters, or with specific filters disabled - * - * @template T - * @param callable(): T $callback - * @param array|null $filterNames List of filter names to skip; if null, all filters will be skipped - * @return T - */ public function skipFilters(callable $callback, ?array $filterNames = null): mixed { $previousFilter = $this->filter; $previousDisabledFilters = $this->disabledFilters; - if (is_null($filterNames)) { - // Skip all filters - existing behavior + if (\is_null($filterNames)) { $this->disableFilters(); } else { - // Skip specific filters - new behavior - if (empty($filterNames)) { - // Empty array means skip no filters (keep current behavior) + if (\count($filterNames) === 0) { $this->disabledFilters = []; } else { - // Create fast lookup map: value => true $disabledFilters = []; foreach ($filterNames as $filterName) { $disabledFilters[$filterName] = true; @@ -6654,8 +6633,7 @@ protected function decodeAttribute(string $filter, mixed $value, Document $docum return $value; } - // Skip filters that are disabled - if (!is_null($this->disabledFilters) && isset($this->disabledFilters[$filter])) { + if (!\is_null($this->disabledFilters) && isset($this->disabledFilters[$filter])) { return $value; } From d792eb0692c6517a834a5ca3b3471c5f7a932fe5 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 11 Aug 2025 07:05:55 +0000 Subject: [PATCH 3/5] Add skipFilters method to bypass database filters conditionally Co-authored-by: jakeb994 --- src/Database/Database.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Database/Database.php b/src/Database/Database.php index e8482280a..47ad22e38 100644 --- a/src/Database/Database.php +++ b/src/Database/Database.php @@ -808,6 +808,15 @@ public function disableFilters(): static return $this; } + /** + * Skip filters + * + * Execute a callback without filters + * + * @template T + * @param callable(): T $callback + * @return T + */ public function skipFilters(callable $callback, ?array $filterNames = null): mixed { $previousFilter = $this->filter; From 768306ff9e7fb093e14ebf00fd2d3c3cad846cf8 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 11 Aug 2025 07:14:29 +0000 Subject: [PATCH 4/5] Refactor skipFilters method to improve null filter handling and exception safety Co-authored-by: jakeb994 --- src/Database/Database.php | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/Database/Database.php b/src/Database/Database.php index 47ad22e38..a1371c43c 100644 --- a/src/Database/Database.php +++ b/src/Database/Database.php @@ -819,21 +819,28 @@ public function disableFilters(): static */ public function skipFilters(callable $callback, ?array $filterNames = null): mixed { + if (\is_null($filterNames)) { + $initial = $this->filter; + $this->disableFilters(); + + try { + return $callback(); + } finally { + $this->filter = $initial; + } + } + $previousFilter = $this->filter; $previousDisabledFilters = $this->disabledFilters; - if (\is_null($filterNames)) { - $this->disableFilters(); + if (\count($filterNames) === 0) { + $this->disabledFilters = []; } else { - if (\count($filterNames) === 0) { - $this->disabledFilters = []; - } else { - $disabledFilters = []; - foreach ($filterNames as $filterName) { - $disabledFilters[$filterName] = true; - } - $this->disabledFilters = $disabledFilters; + $disabledFilters = []; + foreach ($filterNames as $filterName) { + $disabledFilters[$filterName] = true; } + $this->disabledFilters = $disabledFilters; } try { From a76fcb6a8a147566e8fc947514b592f75da08582 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Mon, 11 Aug 2025 19:34:45 +1200 Subject: [PATCH 5/5] Fix stan --- src/Database/Database.php | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/Database/Database.php b/src/Database/Database.php index a1371c43c..3605c77df 100644 --- a/src/Database/Database.php +++ b/src/Database/Database.php @@ -348,6 +348,9 @@ class Database protected bool $filter = true; + /** + * @var array|null + */ protected ?array $disabledFilters = []; protected bool $validate = true; @@ -815,11 +818,12 @@ public function disableFilters(): static * * @template T * @param callable(): T $callback + * @param array|null $filters * @return T */ - public function skipFilters(callable $callback, ?array $filterNames = null): mixed + public function skipFilters(callable $callback, ?array $filters = null): mixed { - if (\is_null($filterNames)) { + if (empty($filters)) { $initial = $this->filter; $this->disableFilters(); @@ -830,24 +834,19 @@ public function skipFilters(callable $callback, ?array $filterNames = null): mix } } - $previousFilter = $this->filter; - $previousDisabledFilters = $this->disabledFilters; - - if (\count($filterNames) === 0) { - $this->disabledFilters = []; - } else { - $disabledFilters = []; - foreach ($filterNames as $filterName) { - $disabledFilters[$filterName] = true; - } - $this->disabledFilters = $disabledFilters; + $previous = $this->filter; + $previousDisabled = $this->disabledFilters; + $disabled = []; + foreach ($filters as $name) { + $disabled[$name] = true; } + $this->disabledFilters = $disabled; try { return $callback(); } finally { - $this->filter = $previousFilter; - $this->disabledFilters = $previousDisabledFilters; + $this->filter = $previous; + $this->disabledFilters = $previousDisabled; } }