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..c5721f24 --- /dev/null +++ b/bundle/API/Repository/Values/Content/Query/Criterion/TagSubtree.php @@ -0,0 +1,43 @@ +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') + ); + + + 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); + 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