From f8fd222e255fe0c93fa8ee6b12bbcb92372ade7b Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Wed, 24 Nov 2021 12:21:55 +0200 Subject: [PATCH] multiple bool filters fix --- .../Applier/Appliers/BoolFilterList.php | 41 ++++++++++++++----- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/application/Espo/Core/Select/Applier/Appliers/BoolFilterList.php b/application/Espo/Core/Select/Applier/Appliers/BoolFilterList.php index 128197ae8e..c2062a69e3 100644 --- a/application/Espo/Core/Select/Applier/Appliers/BoolFilterList.php +++ b/application/Espo/Core/Select/Applier/Appliers/BoolFilterList.php @@ -30,19 +30,16 @@ namespace Espo\Core\Select\Applier\Appliers; use Espo\Core\Select\OrmSelectBuilder; +use Espo\Core\Exceptions\Error; +use Espo\Core\Select\SelectManager; +use Espo\Core\Select\Bool\FilterFactory as BoolFilterFactory; -use Espo\Core\{ - Exceptions\Error, - Select\SelectManager, - Select\Bool\FilterFactory as BoolFilterFactory, -}; +use Espo\ORM\Query\Select; +use Espo\ORM\Query\SelectBuilder as QueryBuilder; +use Espo\ORM\Query\Part\Where\OrGroupBuilder; +use Espo\ORM\Query\Part\WhereClause; -use Espo\{ - ORM\Query\SelectBuilder as QueryBuilder, - ORM\Query\Part\Where\OrGroupBuilder, - ORM\Query\Part\WhereClause, - Entities\User, -}; +use Espo\Entities\User; class BoolFilterList { @@ -79,10 +76,20 @@ class BoolFilterList { $orGroupBuilder = new OrGroupBuilder(); + $isMultiple = count($boolFilterNameList) > 1; + + if ($isMultiple) { + $queryBefore = $queryBuilder->build(); + } + foreach ($boolFilterNameList as $filterName) { $this->applyBoolFilter($queryBuilder, $orGroupBuilder, $filterName); } + if ($isMultiple) { + $this->handleMultiple($queryBefore, $queryBuilder); + } + $queryBuilder->where( $orGroupBuilder->build() ); @@ -118,4 +125,16 @@ class BoolFilterList throw new Error("No bool filter '{$filterName}' for '{$this->entityType}'."); } + + private function handleMultiple(Select $queryBefore, QueryBuilder $queryBuilder): void + { + $queryAfter = $queryBuilder->build(); + + $joinCountBefore = count($queryBefore->getJoins()) + count($queryBefore->getLeftJoins()); + $joinCountAfter = count($queryAfter->getJoins()) + count($queryAfter->getLeftJoins()); + + if ($joinCountBefore < $joinCountAfter) { + $queryBuilder->distinct(); + } + } }