/** * @internal * @param FilterInterface $filter * @param FilterParam\Searching[] $columnSearchs * @return CompositeExpression */ private function getExpressionForColumnSearchs(FilterInterface $filter, array $columnSearchs) { $searchExprs = array(); foreach ($columnSearchs as $col) { /* @var $col FilterParam\Searching */ $field = $col->getColumnName(); $searchs = $col->isTokenizable() ? $col->getTokens() : (array) $col->getValue(); $searchColExprs = array(); foreach ($searchs as $search) { $compExpr = $col->isExactly() ? Criteria::expr()->eq($field, $search) : Criteria::expr()->contains($field, $search); $column = $filter->getColumn($field); if ($column && count($subcols = $column->getSubColumns())) { // with subcolumns $searchSubColExprs = array(); $searchSubColExprs[] = $compExpr; // self col ... foreach ($subcols as $subcol) { /* @var $subcol FilterParam\Column */ $subfield = $subcol->getName(); $compSubExpr = $col->isExactly() ? Criteria::expr()->eq($subfield, $search) : Criteria::expr()->contains($subfield, $search); $searchSubColExprs[] = $compSubExpr; // .. and his subcolumns } $searchColExprs[] = $this->createCompositeExpression(CompositeExpression::TYPE_OR, $searchSubColExprs); } else { // no subcolumns $searchColExprs[] = $compExpr; } } $searchExprs[] = $this->createCompositeExpression($col->getTokenSeparator(), $searchColExprs); } return $this->createCompositeExpression(CompositeExpression::TYPE_AND, $searchExprs); }