From a081b97f5364e0a0fcdf61ba81cd487c876568e2 Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Thu, 28 Nov 2024 06:55:42 +0000 Subject: [PATCH 1/7] Ensure no queries are run when entries field has no values --- src/Fieldtypes/Entries.php | 5 +++++ src/Query/EmptyQueryBuilder.php | 16 ++++++++++++++++ tests/Fieldtypes/EntriesTest.php | 6 ++++++ 3 files changed, 27 insertions(+) create mode 100644 src/Query/EmptyQueryBuilder.php diff --git a/src/Fieldtypes/Entries.php b/src/Fieldtypes/Entries.php index 29a9b96e78..d94b689bb5 100644 --- a/src/Fieldtypes/Entries.php +++ b/src/Fieldtypes/Entries.php @@ -18,6 +18,7 @@ use Statamic\Facades\User; use Statamic\Http\Resources\CP\Entries\EntriesFieldtypeEntries; use Statamic\Http\Resources\CP\Entries\EntriesFieldtypeEntry as EntryResource; +use Statamic\Query\EmptyQueryBuilder; use Statamic\Query\OrderedQueryBuilder; use Statamic\Query\Scopes\Filter; use Statamic\Query\Scopes\Filters\Concerns\QueriesFilters; @@ -337,6 +338,10 @@ protected function collect($value) private function queryBuilder($values) { + if (! $values) { + return new StatusQueryBuilder(new EmptyQueryBuilder()); + } + $site = Site::current()->handle(); if (($parent = $this->field()->parent()) && $parent instanceof Localization) { $site = $parent->locale(); diff --git a/src/Query/EmptyQueryBuilder.php b/src/Query/EmptyQueryBuilder.php new file mode 100644 index 0000000000..8ec78ac758 --- /dev/null +++ b/src/Query/EmptyQueryBuilder.php @@ -0,0 +1,16 @@ +assertInstanceOf(Builder::class, $augmented); $this->assertCount(0, $augmented->get()); + + $augmented = $this->fieldtype()->augment([]); + + $this->assertInstanceOf(Builder::class, $augmented); + $this->assertCount(0, $augmented->get()); } #[Test] From 4a82284f34944459b701e59be0832268ca11a4f7 Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Thu, 28 Nov 2024 06:59:18 +0000 Subject: [PATCH 2/7] :beer: --- tests/Fieldtypes/EntriesTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/Fieldtypes/EntriesTest.php b/tests/Fieldtypes/EntriesTest.php index f50b48f108..6407d2a4a0 100644 --- a/tests/Fieldtypes/EntriesTest.php +++ b/tests/Fieldtypes/EntriesTest.php @@ -15,7 +15,6 @@ use Statamic\Facades\Site; use Statamic\Fields\Field; use Statamic\Fieldtypes\Entries; -use Statamic\Query\EmptyQueryBuilder; use Tests\Fieldtypes\Concerns\TestsQueryableValueWithMaxItems; use Tests\PreventSavingStacheItemsToDisk; use Tests\TestCase; From 1ab95854b301e1a69ece95d164795f320545567e Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Mon, 2 Dec 2024 20:00:39 +0000 Subject: [PATCH 3/7] Assets and terms --- src/Fieldtypes/Assets/Assets.php | 15 ++++++++++----- src/Fieldtypes/Terms.php | 5 +++++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/Fieldtypes/Assets/Assets.php b/src/Fieldtypes/Assets/Assets.php index a58efcfea8..3ea8982746 100644 --- a/src/Fieldtypes/Assets/Assets.php +++ b/src/Fieldtypes/Assets/Assets.php @@ -17,6 +17,7 @@ use Statamic\Fields\Fieldtype; use Statamic\GraphQL\Types\AssetInterface; use Statamic\Http\Resources\CP\Assets\Asset as AssetResource; +use Statamic\Query\EmptyQueryBuilder; use Statamic\Query\Scopes\Filter; use Statamic\Support\Arr; use Statamic\Support\Str; @@ -257,13 +258,17 @@ public function augment($values) return Blink::get($key); } - $ids = collect($values) - ->map(fn ($value) => $this->container()->handle().'::'.$value) - ->all(); + if (! $values) { + $query = new EmptyQueryBuilder(); + } else { + $ids = collect($values) + ->map(fn ($value) => $this->container()->handle().'::'.$value) + ->all(); - $query = $this->container()->queryAssets()->whereIn('path', $values); + $query = $this->container()->queryAssets()->whereIn('path', $values); - $query = new OrderedQueryBuilder($query, $ids); + $query = new OrderedQueryBuilder($query, $ids); + } return $single && ! config('statamic.system.always_augment_to_query', false) ? Blink::once($key, fn () => $query->first()) diff --git a/src/Fieldtypes/Terms.php b/src/Fieldtypes/Terms.php index c3b7dd1bd0..63b0dc5cbc 100644 --- a/src/Fieldtypes/Terms.php +++ b/src/Fieldtypes/Terms.php @@ -20,6 +20,7 @@ use Statamic\Facades\User; use Statamic\GraphQL\Types\TermInterface; use Statamic\Http\Resources\CP\Taxonomies\TermsFieldtypeTerms as TermsResource; +use Statamic\Query\EmptyQueryBuilder; use Statamic\Query\OrderedQueryBuilder; use Statamic\Query\Scopes\Filter; use Statamic\Query\Scopes\Filters\Fields\Terms as TermsFilter; @@ -130,6 +131,10 @@ public function augment($values) private function queryBuilder($values) { + if (! $values) { + return new EmptyQueryBuilder(); + } + // The parent is the item this terms fieldtype exists on. Most commonly an // entry, but could also be something else, like another taxonomy term. $parent = $this->field->parent(); From 98d5befed2000ef698f431b8acb353a9f03a14e3 Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Mon, 2 Dec 2024 20:01:15 +0000 Subject: [PATCH 4/7] Revert "Assets and terms" This reverts commit 1ab95854b301e1a69ece95d164795f320545567e. --- src/Fieldtypes/Assets/Assets.php | 15 +++++---------- src/Fieldtypes/Terms.php | 5 ----- 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/src/Fieldtypes/Assets/Assets.php b/src/Fieldtypes/Assets/Assets.php index 3ea8982746..a58efcfea8 100644 --- a/src/Fieldtypes/Assets/Assets.php +++ b/src/Fieldtypes/Assets/Assets.php @@ -17,7 +17,6 @@ use Statamic\Fields\Fieldtype; use Statamic\GraphQL\Types\AssetInterface; use Statamic\Http\Resources\CP\Assets\Asset as AssetResource; -use Statamic\Query\EmptyQueryBuilder; use Statamic\Query\Scopes\Filter; use Statamic\Support\Arr; use Statamic\Support\Str; @@ -258,17 +257,13 @@ public function augment($values) return Blink::get($key); } - if (! $values) { - $query = new EmptyQueryBuilder(); - } else { - $ids = collect($values) - ->map(fn ($value) => $this->container()->handle().'::'.$value) - ->all(); + $ids = collect($values) + ->map(fn ($value) => $this->container()->handle().'::'.$value) + ->all(); - $query = $this->container()->queryAssets()->whereIn('path', $values); + $query = $this->container()->queryAssets()->whereIn('path', $values); - $query = new OrderedQueryBuilder($query, $ids); - } + $query = new OrderedQueryBuilder($query, $ids); return $single && ! config('statamic.system.always_augment_to_query', false) ? Blink::once($key, fn () => $query->first()) diff --git a/src/Fieldtypes/Terms.php b/src/Fieldtypes/Terms.php index 63b0dc5cbc..c3b7dd1bd0 100644 --- a/src/Fieldtypes/Terms.php +++ b/src/Fieldtypes/Terms.php @@ -20,7 +20,6 @@ use Statamic\Facades\User; use Statamic\GraphQL\Types\TermInterface; use Statamic\Http\Resources\CP\Taxonomies\TermsFieldtypeTerms as TermsResource; -use Statamic\Query\EmptyQueryBuilder; use Statamic\Query\OrderedQueryBuilder; use Statamic\Query\Scopes\Filter; use Statamic\Query\Scopes\Filters\Fields\Terms as TermsFilter; @@ -131,10 +130,6 @@ public function augment($values) private function queryBuilder($values) { - if (! $values) { - return new EmptyQueryBuilder(); - } - // The parent is the item this terms fieldtype exists on. Most commonly an // entry, but could also be something else, like another taxonomy term. $parent = $this->field->parent(); From 4aeb464276b8d601dff993c16a4b8362e9958776 Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Mon, 2 Dec 2024 20:12:07 +0000 Subject: [PATCH 5/7] Its a bit yuck but --- src/Exceptions/InvalidQueryDateException.php | 11 +++++++++++ src/Stache/Query/QueriesEntryStatus.php | 17 +++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 src/Exceptions/InvalidQueryDateException.php diff --git a/src/Exceptions/InvalidQueryDateException.php b/src/Exceptions/InvalidQueryDateException.php new file mode 100644 index 0000000000..58fbaefa1e --- /dev/null +++ b/src/Exceptions/InvalidQueryDateException.php @@ -0,0 +1,11 @@ +where(fn ($query) => $this ->getCollectionsForStatusQuery() - ->each(fn ($collection) => $query->orWhere(fn ($q) => $this->addCollectionStatusLogicToQuery($q, $status, $collection)))); + ->each(function ($collection) use ($query, $status) { + try { + return $query->orWhere(fn ($q) => $this->addCollectionStatusLogicToQuery($q, $status, $collection)); + } catch (InvalidQueryDateException $e) { + return new EmptyQueryBuilder(); + } + }) + ); } private function addCollectionStatusLogicToQuery($query, $status, $collection): void @@ -35,7 +44,7 @@ private function addCollectionStatusLogicToQuery($query, $status, $collection): if (! $collection->dated() || ($collection->futureDateBehavior() === 'public' && $collection->pastDateBehavior() === 'public')) { if ($status === 'scheduled' || $status === 'expired') { - $query->where('date', 'invalid'); // intentionally trigger no results. + throw new InvalidQueryDateException(); // intentionally trigger no results. } return; @@ -47,7 +56,7 @@ private function addCollectionStatusLogicToQuery($query, $status, $collection): : $query->where('date', '<', now()); if ($status === 'expired') { - $query->where('date', 'invalid'); // intentionally trigger no results. + throw new InvalidQueryDateException(); // intentionally trigger no results. } } @@ -57,7 +66,7 @@ private function addCollectionStatusLogicToQuery($query, $status, $collection): : $query->where('date', '>', now()); if ($status === 'scheduled') { - $query->where('date', 'invalid'); // intentionally trigger no results. + throw new InvalidQueryDateException(); // intentionally trigger no results. } } } From 99035d8d515e386c1260001049b37cf06e24ec24 Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Mon, 2 Dec 2024 20:14:01 +0000 Subject: [PATCH 6/7] remove copy/paste --- src/Exceptions/InvalidQueryDateException.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/Exceptions/InvalidQueryDateException.php b/src/Exceptions/InvalidQueryDateException.php index 58fbaefa1e..91566069a5 100644 --- a/src/Exceptions/InvalidQueryDateException.php +++ b/src/Exceptions/InvalidQueryDateException.php @@ -2,10 +2,6 @@ namespace Statamic\Exceptions; -/** - * When an action for one type of entry is performed on another. - * For example, trying to access the date of an entry when it is ordered numerically. - */ class InvalidQueryDateException extends \Exception { } From 4a564fd0d85ce07b7e53ca1c8c1560a991303935 Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Fri, 6 Dec 2024 07:12:55 +0000 Subject: [PATCH 7/7] potential new direction --- src/Fieldtypes/Entries.php | 4 ++-- src/Query/EmptyEntryQueryBuilder.php | 16 ++++++++++++++++ src/Query/EmptyQueryBuilder.php | 5 ----- src/Stache/Query/QueriesEntryStatus.php | 4 ++-- 4 files changed, 20 insertions(+), 9 deletions(-) create mode 100644 src/Query/EmptyEntryQueryBuilder.php diff --git a/src/Fieldtypes/Entries.php b/src/Fieldtypes/Entries.php index d94b689bb5..cc8c98c87a 100644 --- a/src/Fieldtypes/Entries.php +++ b/src/Fieldtypes/Entries.php @@ -18,7 +18,7 @@ use Statamic\Facades\User; use Statamic\Http\Resources\CP\Entries\EntriesFieldtypeEntries; use Statamic\Http\Resources\CP\Entries\EntriesFieldtypeEntry as EntryResource; -use Statamic\Query\EmptyQueryBuilder; +use Statamic\Query\EmptyEntryQueryBuilder; use Statamic\Query\OrderedQueryBuilder; use Statamic\Query\Scopes\Filter; use Statamic\Query\Scopes\Filters\Concerns\QueriesFilters; @@ -339,7 +339,7 @@ protected function collect($value) private function queryBuilder($values) { if (! $values) { - return new StatusQueryBuilder(new EmptyQueryBuilder()); + return new StatusQueryBuilder(new EmptyEntryQueryBuilder()); } $site = Site::current()->handle(); diff --git a/src/Query/EmptyEntryQueryBuilder.php b/src/Query/EmptyEntryQueryBuilder.php new file mode 100644 index 0000000000..49f58877a3 --- /dev/null +++ b/src/Query/EmptyEntryQueryBuilder.php @@ -0,0 +1,16 @@ +orWhere(fn ($q) => $this->addCollectionStatusLogicToQuery($q, $status, $collection)); } catch (InvalidQueryDateException $e) { - return new EmptyQueryBuilder(); + return new EmptyEntryQueryBuilder(); } }) );