From eb2760eeb14915ee1fafee4803ff5bc7ec776321 Mon Sep 17 00:00:00 2001 From: Martin Eiber Date: Wed, 27 Aug 2025 18:15:38 +0200 Subject: [PATCH 1/8] Update Bool filter to check if the boolean field is empty --- .../DefaultSearch/Query/BoolExistsQuery.php | 49 +++++++++++++++++++ .../Modifier/Filter/Basic/BooleanFilter.php | 4 +- .../Search/Modifier/Filter/BasicFilters.php | 15 ++++-- .../Modifier/Filter/BasicFiltersTest.php | 11 ++++- 4 files changed, 73 insertions(+), 6 deletions(-) create mode 100644 src/Model/DefaultSearch/Query/BoolExistsQuery.php diff --git a/src/Model/DefaultSearch/Query/BoolExistsQuery.php b/src/Model/DefaultSearch/Query/BoolExistsQuery.php new file mode 100644 index 00000000..54dce7cb --- /dev/null +++ b/src/Model/DefaultSearch/Query/BoolExistsQuery.php @@ -0,0 +1,49 @@ +value => [ + 'bool' => [ + 'must_not' => [ + 'exists' => ['field' => $field], + ], + ], + ], + ]); + } + + public function getField(): string + { + return $this->field; + } + + public function toArrayAsSubQuery(): array + { + return [ + 'bool' => [ + 'must_not' => [ + 'exists' => ['field' => $this->field], + ], + ], + ]; + } +} diff --git a/src/Model/Search/Modifier/Filter/Basic/BooleanFilter.php b/src/Model/Search/Modifier/Filter/Basic/BooleanFilter.php index 4eca925c..57b6c5bd 100644 --- a/src/Model/Search/Modifier/Filter/Basic/BooleanFilter.php +++ b/src/Model/Search/Modifier/Filter/Basic/BooleanFilter.php @@ -19,7 +19,7 @@ { public function __construct( private string $fieldName, - private bool $searchTerm, + private null|bool $searchTerm, private bool $enablePqlFieldNameResolution = true, ) { } @@ -29,7 +29,7 @@ public function getFieldName(): string return $this->fieldName; } - public function getSearchTerm(): bool + public function getSearchTerm(): null|bool { return $this->searchTerm; } diff --git a/src/SearchIndexAdapter/DefaultSearch/Search/Modifier/Filter/BasicFilters.php b/src/SearchIndexAdapter/DefaultSearch/Search/Modifier/Filter/BasicFilters.php index 5c706a77..bf0dc049 100644 --- a/src/SearchIndexAdapter/DefaultSearch/Search/Modifier/Filter/BasicFilters.php +++ b/src/SearchIndexAdapter/DefaultSearch/Search/Modifier/Filter/BasicFilters.php @@ -16,6 +16,7 @@ use Pimcore\Bundle\GenericDataIndexBundle\Attribute\Search\AsSearchModifierHandler; use Pimcore\Bundle\GenericDataIndexBundle\Enum\SearchIndex\FieldCategory\SystemField; use Pimcore\Bundle\GenericDataIndexBundle\Model\DefaultSearch\Modifier\SearchModifierContextInterface; +use Pimcore\Bundle\GenericDataIndexBundle\Model\DefaultSearch\Query\BoolExistsQuery; use Pimcore\Bundle\GenericDataIndexBundle\Model\DefaultSearch\Query\BoolQuery; use Pimcore\Bundle\GenericDataIndexBundle\Model\DefaultSearch\Query\TermFilter; use Pimcore\Bundle\GenericDataIndexBundle\Model\DefaultSearch\Query\TermsFilter; @@ -77,11 +78,19 @@ public function handleBooleanFilter(BooleanFilter $booleanFilter, SearchModifier ); } - $context->getSearch()->addQuery( - new TermFilter( + $query = new BoolExistsQuery( + field: $fieldName, + ); + + if ($booleanFilter->getSearchTerm()) { + $query = new TermFilter( field: $fieldName, term: $booleanFilter->getSearchTerm(), - ) + ); + } + + $context->getSearch()->addQuery( + $query ); } diff --git a/tests/Functional/Search/Modifier/Filter/BasicFiltersTest.php b/tests/Functional/Search/Modifier/Filter/BasicFiltersTest.php index ca59eabf..6f0d49e6 100644 --- a/tests/Functional/Search/Modifier/Filter/BasicFiltersTest.php +++ b/tests/Functional/Search/Modifier/Filter/BasicFiltersTest.php @@ -149,10 +149,12 @@ public function testIntegerFilter() public function testBooleanFilter() { - $objects = TestHelper::createEmptyObjects(count: 3); + $objects = TestHelper::createEmptyObjects(count: 4); $objects[1]->setPublished(false)->save(); $objects[2]->setPublished(false)->save(); + $objects[3]->setPublished(null)->save(); + /** @var DataObjectSearchServiceInterface $searchService */ $searchService = $this->tester->grabService(DataObjectSearchServiceInterface::class); /** @var SearchProviderInterface $searchProvider */ @@ -172,5 +174,12 @@ public function testBooleanFilter() ; $searchResult = $searchService->search($search); $this->assertCount(2, $searchResult->getItems()); + + $search = $searchProvider + ->createDataObjectSearch() + ->addModifier(new BooleanFilter('system_fields.published', null)) + ; + $searchResult = $searchService->search($search); + $this->assertCount(1, $searchResult->getItems()); } } From a6e905d7b2fa856f77ca371e3978428dd93b73d4 Mon Sep 17 00:00:00 2001 From: Martin Eiber Date: Wed, 27 Aug 2025 18:30:20 +0200 Subject: [PATCH 2/8] Remove Test --- .../Search/Modifier/Filter/BasicFiltersTest.php | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/tests/Functional/Search/Modifier/Filter/BasicFiltersTest.php b/tests/Functional/Search/Modifier/Filter/BasicFiltersTest.php index 6f0d49e6..ca59eabf 100644 --- a/tests/Functional/Search/Modifier/Filter/BasicFiltersTest.php +++ b/tests/Functional/Search/Modifier/Filter/BasicFiltersTest.php @@ -149,12 +149,10 @@ public function testIntegerFilter() public function testBooleanFilter() { - $objects = TestHelper::createEmptyObjects(count: 4); + $objects = TestHelper::createEmptyObjects(count: 3); $objects[1]->setPublished(false)->save(); $objects[2]->setPublished(false)->save(); - $objects[3]->setPublished(null)->save(); - /** @var DataObjectSearchServiceInterface $searchService */ $searchService = $this->tester->grabService(DataObjectSearchServiceInterface::class); /** @var SearchProviderInterface $searchProvider */ @@ -174,12 +172,5 @@ public function testBooleanFilter() ; $searchResult = $searchService->search($search); $this->assertCount(2, $searchResult->getItems()); - - $search = $searchProvider - ->createDataObjectSearch() - ->addModifier(new BooleanFilter('system_fields.published', null)) - ; - $searchResult = $searchService->search($search); - $this->assertCount(1, $searchResult->getItems()); } } From c24ee8fe4f7b47122aa62457319daf7ee62a155f Mon Sep 17 00:00:00 2001 From: Martin Eiber Date: Wed, 27 Aug 2025 18:41:55 +0200 Subject: [PATCH 3/8] Tests --- .../Search/Modifier/Filter/BasicFiltersTest.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/Functional/Search/Modifier/Filter/BasicFiltersTest.php b/tests/Functional/Search/Modifier/Filter/BasicFiltersTest.php index ca59eabf..341729d8 100644 --- a/tests/Functional/Search/Modifier/Filter/BasicFiltersTest.php +++ b/tests/Functional/Search/Modifier/Filter/BasicFiltersTest.php @@ -149,9 +149,10 @@ public function testIntegerFilter() public function testBooleanFilter() { - $objects = TestHelper::createEmptyObjects(count: 3); + $objects = TestHelper::createEmptyObjects(count: 4); $objects[1]->setPublished(false)->save(); $objects[2]->setPublished(false)->save(); + $objects[3]->setPublished(true)->save(); /** @var DataObjectSearchServiceInterface $searchService */ $searchService = $this->tester->grabService(DataObjectSearchServiceInterface::class); @@ -172,5 +173,12 @@ public function testBooleanFilter() ; $searchResult = $searchService->search($search); $this->assertCount(2, $searchResult->getItems()); + + $search = $searchProvider + ->createDataObjectSearch() + ->addModifier(new BooleanFilter('system_fields.published', null)) + ; + $searchResult = $searchService->search($search); + $this->assertCount(1, $searchResult->getItems()); } } From 48cbdcf03a45a2ac8625107b0eb0ce83b8b709b7 Mon Sep 17 00:00:00 2001 From: Martin Eiber Date: Wed, 27 Aug 2025 18:48:02 +0200 Subject: [PATCH 4/8] Remove Tests again --- .../Search/Modifier/Filter/BasicFiltersTest.php | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/tests/Functional/Search/Modifier/Filter/BasicFiltersTest.php b/tests/Functional/Search/Modifier/Filter/BasicFiltersTest.php index 341729d8..ca59eabf 100644 --- a/tests/Functional/Search/Modifier/Filter/BasicFiltersTest.php +++ b/tests/Functional/Search/Modifier/Filter/BasicFiltersTest.php @@ -149,10 +149,9 @@ public function testIntegerFilter() public function testBooleanFilter() { - $objects = TestHelper::createEmptyObjects(count: 4); + $objects = TestHelper::createEmptyObjects(count: 3); $objects[1]->setPublished(false)->save(); $objects[2]->setPublished(false)->save(); - $objects[3]->setPublished(true)->save(); /** @var DataObjectSearchServiceInterface $searchService */ $searchService = $this->tester->grabService(DataObjectSearchServiceInterface::class); @@ -173,12 +172,5 @@ public function testBooleanFilter() ; $searchResult = $searchService->search($search); $this->assertCount(2, $searchResult->getItems()); - - $search = $searchProvider - ->createDataObjectSearch() - ->addModifier(new BooleanFilter('system_fields.published', null)) - ; - $searchResult = $searchService->search($search); - $this->assertCount(1, $searchResult->getItems()); } } From d37cc37d98f1549dc5b19f0aff4066e13c9c46e5 Mon Sep 17 00:00:00 2001 From: Martin Eiber Date: Wed, 27 Aug 2025 18:57:05 +0200 Subject: [PATCH 5/8] Fix Logic --- .../Search/Modifier/Filter/BasicFilters.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/SearchIndexAdapter/DefaultSearch/Search/Modifier/Filter/BasicFilters.php b/src/SearchIndexAdapter/DefaultSearch/Search/Modifier/Filter/BasicFilters.php index bf0dc049..8ac9bb05 100644 --- a/src/SearchIndexAdapter/DefaultSearch/Search/Modifier/Filter/BasicFilters.php +++ b/src/SearchIndexAdapter/DefaultSearch/Search/Modifier/Filter/BasicFilters.php @@ -78,14 +78,15 @@ public function handleBooleanFilter(BooleanFilter $booleanFilter, SearchModifier ); } - $query = new BoolExistsQuery( + $query = new TermFilter( field: $fieldName, + term: $booleanFilter->getSearchTerm(), ); - if ($booleanFilter->getSearchTerm()) { - $query = new TermFilter( + + if ($booleanFilter->getSearchTerm() === null) { + $query = new BoolExistsQuery( field: $fieldName, - term: $booleanFilter->getSearchTerm(), ); } From 4190f068abbdd8139164373faea421b3030fea1d Mon Sep 17 00:00:00 2001 From: martineiber Date: Wed, 27 Aug 2025 16:57:31 +0000 Subject: [PATCH 6/8] Apply php-cs-fixer changes --- .../DefaultSearch/Search/Modifier/Filter/BasicFilters.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/SearchIndexAdapter/DefaultSearch/Search/Modifier/Filter/BasicFilters.php b/src/SearchIndexAdapter/DefaultSearch/Search/Modifier/Filter/BasicFilters.php index 8ac9bb05..95187abd 100644 --- a/src/SearchIndexAdapter/DefaultSearch/Search/Modifier/Filter/BasicFilters.php +++ b/src/SearchIndexAdapter/DefaultSearch/Search/Modifier/Filter/BasicFilters.php @@ -83,7 +83,6 @@ public function handleBooleanFilter(BooleanFilter $booleanFilter, SearchModifier term: $booleanFilter->getSearchTerm(), ); - if ($booleanFilter->getSearchTerm() === null) { $query = new BoolExistsQuery( field: $fieldName, From d6dfd4144cdce8c10995bcfc9025a115eb1a3f9a Mon Sep 17 00:00:00 2001 From: Martin Eiber Date: Wed, 27 Aug 2025 19:09:45 +0200 Subject: [PATCH 7/8] Fix Logic --- .../Search/Modifier/Filter/BasicFilters.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/SearchIndexAdapter/DefaultSearch/Search/Modifier/Filter/BasicFilters.php b/src/SearchIndexAdapter/DefaultSearch/Search/Modifier/Filter/BasicFilters.php index 95187abd..dfc99795 100644 --- a/src/SearchIndexAdapter/DefaultSearch/Search/Modifier/Filter/BasicFilters.php +++ b/src/SearchIndexAdapter/DefaultSearch/Search/Modifier/Filter/BasicFilters.php @@ -78,14 +78,15 @@ public function handleBooleanFilter(BooleanFilter $booleanFilter, SearchModifier ); } - $query = new TermFilter( + $query = new BoolExistsQuery( field: $fieldName, - term: $booleanFilter->getSearchTerm(), ); - if ($booleanFilter->getSearchTerm() === null) { - $query = new BoolExistsQuery( + + if ($booleanFilter->getSearchTerm() !== null) { + $query = new TermFilter( field: $fieldName, + term: $booleanFilter->getSearchTerm(), ); } From 0ff60d73b5c00638ad5ebe0f77134b8dad78b118 Mon Sep 17 00:00:00 2001 From: martineiber Date: Wed, 27 Aug 2025 17:10:55 +0000 Subject: [PATCH 8/8] Apply php-cs-fixer changes --- .../DefaultSearch/Search/Modifier/Filter/BasicFilters.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/SearchIndexAdapter/DefaultSearch/Search/Modifier/Filter/BasicFilters.php b/src/SearchIndexAdapter/DefaultSearch/Search/Modifier/Filter/BasicFilters.php index dfc99795..d25ca0e5 100644 --- a/src/SearchIndexAdapter/DefaultSearch/Search/Modifier/Filter/BasicFilters.php +++ b/src/SearchIndexAdapter/DefaultSearch/Search/Modifier/Filter/BasicFilters.php @@ -82,7 +82,6 @@ public function handleBooleanFilter(BooleanFilter $booleanFilter, SearchModifier field: $fieldName, ); - if ($booleanFilter->getSearchTerm() !== null) { $query = new TermFilter( field: $fieldName,