Repository: Recurse a filter in the repository instead of in the query

This allows to recurse and adjust a filter outside the query context as well

refs #8826
This commit is contained in:
Johannes Meyer 2015-05-08 12:15:02 +02:00
parent 5ace0a08f3
commit 938da806ca
2 changed files with 21 additions and 18 deletions

View File

@ -4,6 +4,7 @@
namespace Icinga\Repository;
use Icinga\Application\Logger;
use Icinga\Data\Filter\Filter;
use Icinga\Data\Selectable;
use Icinga\Exception\ProgrammingError;
use Icinga\Exception\QueryException;
@ -471,6 +472,24 @@ abstract class Repository implements Selectable
}
}
/**
* Recurse the given filter, require each filter column and convert all values
*
* @param Filter $filter
*/
public function requireFilter(Filter $filter)
{
if ($filter->isExpression()) {
$column = $filter->getColumn();
$filter->setColumn($this->requireFilterColumn($column));
$filter->setExpression($this->persistColumn($column, $filter->getExpression()));
} elseif ($filter->isChain()) {
foreach ($filter->filters() as $chainOrExpression) {
$this->requireFilter($chainOrExpression);
}
}
}
/**
* Return this repository's query columns mapped to their respective aliases
*

View File

@ -164,7 +164,7 @@ class RepositoryQuery implements QueryInterface
*/
public function setFilter(Filter $filter)
{
$this->requireFilterColumns($filter);
$this->repository->requireFilter($filter);
$this->query->setFilter($filter);
return $this;
}
@ -180,27 +180,11 @@ class RepositoryQuery implements QueryInterface
*/
public function addFilter(Filter $filter)
{
$this->requireFilterColumns($filter);
$this->repository->requireFilter($filter);
$this->query->addFilter($filter);
return $this;
}
/**
* Recurse the given filter and notify the repository about each required filter column
*/
protected function requireFilterColumns(Filter $filter)
{
if ($filter->isExpression()) {
$column = $filter->getColumn();
$filter->setColumn($this->repository->requireFilterColumn($column));
$filter->setExpression($this->repository->persistColumn($column, $filter->getExpression()));
} elseif ($filter->isChain()) {
foreach ($filter->filters() as $chainOrExpression) {
$this->requireFilterColumns($chainOrExpression);
}
}
}
/**
* Return the current filter
*