FlattenedObjectVars: Support selecting custom variables as columns

This commit is contained in:
Johannes Meyer 2022-05-19 15:49:18 +02:00
parent 462af082d7
commit ec0815a9aa

View file

@ -4,11 +4,29 @@
namespace Icinga\Module\Icingadb\Model\Behavior;
use ipl\Orm\Contract\RewriteFilterBehavior;
use Icinga\Module\Icingadb\Common\Auth;
use Icinga\Module\Icingadb\Model\CustomvarFlat;
use ipl\Orm\AliasedExpression;
use ipl\Orm\ColumnDefinition;
use ipl\Orm\Contract\QueryAwareBehavior;
use ipl\Orm\Contract\RewriteColumnBehavior;
use ipl\Orm\Query;
use ipl\Stdlib\Filter;
class FlattenedObjectVars implements RewriteFilterBehavior
class FlattenedObjectVars implements RewriteColumnBehavior, QueryAwareBehavior
{
use Auth;
/** @var Query */
protected $query;
public function setQuery(Query $query)
{
$this->query = $query;
return $this;
}
public function rewriteCondition(Filter\Condition $condition, $relation = null)
{
$column = $condition->metaData()->get('columnName');
@ -21,4 +39,33 @@ class FlattenedObjectVars implements RewriteFilterBehavior
return Filter::all($nameFilter, $valueFilter);
}
}
public function rewriteColumn($column, $relation = null)
{
$subQuery = $this->query->createSubQuery(new CustomvarFlat(), $relation)
->limit(1)
->columns('flatvalue')
->filter(Filter::equal('flatname', $column));
$this->applyRestrictions($subQuery);
$alias = $this->query->getDb()->quoteIdentifier([str_replace('.', '_', $relation) . "_$column"]);
list($select, $values) = $this->query->getDb()->getQueryBuilder()->assembleSelect($subQuery->assembleSelect());
return new AliasedExpression($alias, "($select)", null, ...$values);
}
public function rewriteColumnDefinition(ColumnDefinition $def, string $relation): void
{
$parts = explode('.', substr($relation, 0, -5));
$objectType = array_pop($parts);
// Programmatically translated since the full definition is available in class ObjectSuggestions
$def->setLabel(sprintf(t(ucfirst($objectType) . ' %s', '..<customvar-name>'), $def->getName()));
}
public function isSelectableColumn(string $name): bool
{
return true;
}
}