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 Error */ private function applyBoolFilter( QueryBuilder $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 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(); } } }