. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU Affero General Public License version 3. * * In accordance with Section 7(b) of the GNU Affero General Public License version 3, * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ namespace Espo\Core\Select\Bool; use Espo\Core\Exceptions\BadRequest; use Espo\Core\Select\OrmSelectBuilder; use Espo\Core\Select\SelectManager; use Espo\Core\Select\Bool\FilterFactory as BoolFilterFactory; use Espo\ORM\Query\Select; use Espo\ORM\Query\SelectBuilder; use Espo\ORM\Query\Part\Where\OrGroupBuilder; use Espo\ORM\Query\Part\WhereClause; use Espo\Entities\User; class Applier { public function __construct( private string $entityType, private User $user, private BoolFilterFactory $boolFilterFactory, private SelectManager $selectManager ) {} /** * @param string[] $boolFilterNameList * @throws BadRequest */ public function apply(SelectBuilder $queryBuilder, array $boolFilterNameList): void { $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() ); } /** * @throws BadRequest */ private function applyBoolFilter( SelectBuilder $queryBuilder, OrGroupBuilder $orGroupBuilder, string $filterName ): void { if ($this->boolFilterFactory->has($this->entityType, $filterName)) { $filter = $this->boolFilterFactory->create($this->entityType, $this->user, $filterName); $filter->apply($queryBuilder, $orGroupBuilder); return; } // For backward compatibility. if ( $this->selectManager->hasBoolFilter($filterName) && $queryBuilder instanceof OrmSelectBuilder ) { $rawWhereClause = $this->selectManager->applyBoolFilterToQueryBuilder($queryBuilder, $filterName); $whereItem = WhereClause::fromRaw($rawWhereClause); $orGroupBuilder->add($whereItem); return; } throw new BadRequest("No bool filter '$filterName' for '$this->entityType'."); } private function handleMultiple(Select $queryBefore, SelectBuilder $queryBuilder): void { $queryAfter = $queryBuilder->build(); $joinCountBefore = count($queryBefore->getJoins()); $joinCountAfter = count($queryAfter->getJoins()); if ($joinCountBefore < $joinCountAfter) { $queryBuilder->distinct(); } } }