From ebb46fe23eb0e80544bbb193b5e574d91bea0a7a Mon Sep 17 00:00:00 2001 From: pkamps Date: Mon, 13 Nov 2023 16:01:58 +0100 Subject: [PATCH 1/3] New Criterion "TagSubtree" matching the "path_string" of tags --- .../Content/Query/Criterion/TagSubtree.php | 38 +++++++++++ .../CriterionHandler/Tags/TagSubtree.php | 68 +++++++++++++++++++ bundle/Resources/config/search/legacy.yaml | 7 ++ 3 files changed, 113 insertions(+) create mode 100644 bundle/API/Repository/Values/Content/Query/Criterion/TagSubtree.php create mode 100644 bundle/Core/Search/Legacy/Content/Common/Gateway/CriterionHandler/Tags/TagSubtree.php diff --git a/bundle/API/Repository/Values/Content/Query/Criterion/TagSubtree.php b/bundle/API/Repository/Values/Content/Query/Criterion/TagSubtree.php new file mode 100644 index 00000000..ee5fa430 --- /dev/null +++ b/bundle/API/Repository/Values/Content/Query/Criterion/TagSubtree.php @@ -0,0 +1,38 @@ +connection->createQueryBuilder(); + $subSelect + ->select('t1.id') + ->from('ezcontentobject', 't1') + ->innerJoin( + 't1', + 'eztags_attribute_link', + 't2', + $queryBuilder->expr()->andX( + $queryBuilder->expr()->eq('t2.objectattribute_version', 't1.current_version'), + $queryBuilder->expr()->eq('t2.object_id', 't1.id') + ) + ) + ->innerJoin( + 't2', + 'eztags', + 't3', + $queryBuilder->expr()->eq( 't2.keyword_id', 't3.id' ) + )->where( + $queryBuilder->expr()->like( + 't3.path_string', + $queryBuilder->createNamedParameter( '%/'. $criterion->value[0] .'/%' ) + ) + ); + + $fieldDefinitionIds = $this->getSearchableFields($criterion->target); + if ($fieldDefinitionIds !== null) { + $subSelect->innerJoin( + 't2', + 'ezcontentobject_attribute', + 't3', + $queryBuilder->expr()->andX( + $queryBuilder->expr()->eq('t3.id', 't2.objectattribute_id'), + $queryBuilder->expr()->eq('t3.version', 't2.objectattribute_version') + ) + )->andWhere( + $queryBuilder->expr()->in( + 't3.contentclassattribute_id', + $queryBuilder->createNamedParameter($fieldDefinitionIds, Connection::PARAM_INT_ARRAY) + ) + ); + } + + return $queryBuilder->expr()->in('c.id', $subSelect->getSQL()); + } +} diff --git a/bundle/Resources/config/search/legacy.yaml b/bundle/Resources/config/search/legacy.yaml index c2fde37d..116ba4a9 100644 --- a/bundle/Resources/config/search/legacy.yaml +++ b/bundle/Resources/config/search/legacy.yaml @@ -1,4 +1,11 @@ services: + netgen_tags.search.legacy.gateway.criterion_handler.common.tag_subtree: + class: Netgen\TagsBundle\Core\Search\Legacy\Content\Common\Gateway\CriterionHandler\Tags\TagSubtree + parent: ibexa.search.legacy.gateway.criterion_handler.base + tags: + - { name: ibexa.search.legacy.gateway.criterion_handler.content } + - { name: ibexa.search.legacy.gateway.criterion_handler.location } + netgen_tags.search.legacy.gateway.criterion_handler.common.tag_id: class: Netgen\TagsBundle\Core\Search\Legacy\Content\Common\Gateway\CriterionHandler\Tags\TagId parent: ibexa.search.legacy.gateway.criterion_handler.base From 4e908506b7876f31d554ea8a1188a16e170928e0 Mon Sep 17 00:00:00 2001 From: pkamps Date: Tue, 14 Nov 2023 19:27:42 +0100 Subject: [PATCH 2/3] TagSubtree can handle multiple filter values --- .../Values/Content/Query/Criterion/TagSubtree.php | 5 +++++ .../Common/Gateway/CriterionHandler/Tags/TagSubtree.php | 9 +++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/bundle/API/Repository/Values/Content/Query/Criterion/TagSubtree.php b/bundle/API/Repository/Values/Content/Query/Criterion/TagSubtree.php index ee5fa430..c5721f24 100644 --- a/bundle/API/Repository/Values/Content/Query/Criterion/TagSubtree.php +++ b/bundle/API/Repository/Values/Content/Query/Criterion/TagSubtree.php @@ -28,6 +28,11 @@ public function __construct($value, ?string $target = null) public function getSpecifications(): array { return [ + new Specifications( + Operator::IN, + Specifications::FORMAT_ARRAY, + Specifications::TYPE_INTEGER | Specifications::TYPE_STRING + ), new Specifications( Operator::EQ, Specifications::FORMAT_SINGLE, diff --git a/bundle/Core/Search/Legacy/Content/Common/Gateway/CriterionHandler/Tags/TagSubtree.php b/bundle/Core/Search/Legacy/Content/Common/Gateway/CriterionHandler/Tags/TagSubtree.php index e94e6959..497c018a 100644 --- a/bundle/Core/Search/Legacy/Content/Common/Gateway/CriterionHandler/Tags/TagSubtree.php +++ b/bundle/Core/Search/Legacy/Content/Common/Gateway/CriterionHandler/Tags/TagSubtree.php @@ -38,12 +38,17 @@ public function handle(CriteriaConverter $converter, QueryBuilder $queryBuilder, 'eztags', 't3', $queryBuilder->expr()->eq( 't2.keyword_id', 't3.id' ) - )->where( + ); + + foreach( $criterion->value as $value ) + { + $subSelect->orWhere( $queryBuilder->expr()->like( 't3.path_string', - $queryBuilder->createNamedParameter( '%/'. $criterion->value[0] .'/%' ) + $queryBuilder->createNamedParameter( '%/'. $value .'/%' ) ) ); + } $fieldDefinitionIds = $this->getSearchableFields($criterion->target); if ($fieldDefinitionIds !== null) { From 19c5668228cd1061ed84d30b408d6a7a097acfde Mon Sep 17 00:00:00 2001 From: pkamps Date: Sun, 26 Nov 2023 14:57:17 +0100 Subject: [PATCH 3/3] CS fixes and PHPStan improvements --- .../CriterionHandler/Tags/TagSubtree.php | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/bundle/Core/Search/Legacy/Content/Common/Gateway/CriterionHandler/Tags/TagSubtree.php b/bundle/Core/Search/Legacy/Content/Common/Gateway/CriterionHandler/Tags/TagSubtree.php index 497c018a..d907bdf0 100644 --- a/bundle/Core/Search/Legacy/Content/Common/Gateway/CriterionHandler/Tags/TagSubtree.php +++ b/bundle/Core/Search/Legacy/Content/Common/Gateway/CriterionHandler/Tags/TagSubtree.php @@ -32,22 +32,24 @@ public function handle(CriteriaConverter $converter, QueryBuilder $queryBuilder, $queryBuilder->expr()->eq('t2.objectattribute_version', 't1.current_version'), $queryBuilder->expr()->eq('t2.object_id', 't1.id') ) - ) - ->innerJoin( - 't2', - 'eztags', - 't3', - $queryBuilder->expr()->eq( 't2.keyword_id', 't3.id' ) + ) + ->innerJoin( + 't2', + 'eztags', + 't3', + $queryBuilder->expr()->eq('t2.keyword_id', 't3.id') ); - foreach( $criterion->value as $value ) - { - $subSelect->orWhere( - $queryBuilder->expr()->like( - 't3.path_string', - $queryBuilder->createNamedParameter( '%/'. $value .'/%' ) - ) - ); + + if (is_array($criterion->value)) { + foreach ($criterion->value as $value) { + $subSelect->orWhere( + $queryBuilder->expr()->like( + 't3.path_string', + $queryBuilder->createNamedParameter('%/' . $value . '/%') + ) + ); + } } $fieldDefinitionIds = $this->getSearchableFields($criterion->target);