/**
* Returns the expression for a specific filter.
*
* @param QueryBuilder $queryBuilder
* @param $filter
*
* @throws \Exception
*
* @return \Doctrine\ORM\Query\Expr\Comparison|\Doctrine\ORM\Query\Expr\Func
*/
private function getFilterExpression(QueryBuilder $queryBuilder, Filter $filter)
{
if ($filter->hasSubFilters()) {
$subFilterExpressions = [];
foreach ($filter->getSubFilters() as $subFilter) {
/**
* @var $subFilter Filter
*/
if ($subFilter->getAssociation() !== null) {
$this->addJoins($queryBuilder, $subFilter);
}
$subFilterExpressions[] = $this->getFilterExpression($queryBuilder, $subFilter);
}
if ($filter->getType() == Filter::TYPE_AND) {
return call_user_func_array([$queryBuilder->expr(), "andX"], $subFilterExpressions);
} else {
return call_user_func_array([$queryBuilder->expr(), "orX"], $subFilterExpressions);
}
}
if ($filter->getAssociation() !== null) {
$this->addJoins($queryBuilder, $filter);
$alias = $this->getAlias('o.' . $filter->getAssociation()) . '.' . $filter->getProperty();
} else {
$alias = 'o.' . $filter->getProperty();
}
if (strtolower($filter->getOperator()) == Filter::OPERATOR_IN) {
if (!is_array($filter->getValue())) {
throw new \Exception('Value needs to be an array for the IN operator');
}
return $queryBuilder->expr()->in($alias, $filter->getValue());
} else {
$paramName = ':param' . $this->parameterCount;
$this->parameterCount++;
$queryBuilder->setParameter($paramName, $filter->getValue());
switch (strtolower($filter->getOperator())) {
case Filter::OPERATOR_EQUALS:
return $queryBuilder->expr()->eq($alias, $paramName);
break;
case Filter::OPERATOR_GREATER_THAN:
return $queryBuilder->expr()->gt($alias, $paramName);
break;
case Filter::OPERATOR_GREATER_THAN_EQUALS:
return $queryBuilder->expr()->gte($alias, $paramName);
break;
case Filter::OPERATOR_LESS_THAN:
return $queryBuilder->expr()->lt($alias, $paramName);
break;
case Filter::OPERATOR_LESS_THAN_EQUALS:
return $queryBuilder->expr()->lte($alias, $paramName);
break;
case Filter::OPERATOR_NOT_EQUALS:
return $queryBuilder->expr()->neq($alias, $paramName);
break;
case Filter::OPERATOR_LIKE:
return $queryBuilder->expr()->like($alias, $paramName);
break;
default:
throw new \Exception('Unknown operator ' . $filter->getOperator());
}
}
}