AssignFilter: add 'contains' operator

fixes #13133
This commit is contained in:
Thomas Gelf 2016-12-13 14:49:36 +01:00
parent 58a64cee78
commit 7c6a10013f
3 changed files with 44 additions and 10 deletions

View File

@ -160,7 +160,12 @@ class Zend_View_Helper_FormDataFilter extends Zend_View_Helper_FormElement
$type = 'host'; $type = 'host';
$filter = clone($filter); $filter = clone($filter);
$filter->setExpression(json_decode($filter->getExpression())); if ($this->columnIsJson($filter)) {
$filter->setExpression(json_decode($filter->getColumn()));
} else {
$filter->setExpression(json_decode($filter->getExpression()));
}
$dummy = IcingaObject::createByType($type); $dummy = IcingaObject::createByType($type);
$col = $filter->getColumn(); $col = $filter->getColumn();
if ($dummy->hasProperty($col)) { if ($dummy->hasProperty($col)) {
@ -204,6 +209,12 @@ class Zend_View_Helper_FormDataFilter extends Zend_View_Helper_FormElement
return $el; return $el;
} }
protected function columnIsJson(FilterExpression $filter)
{
$col = $filter->getColumn();
return strlen($col) && $col[0] === '"';
}
protected function text(Filter $filter = null) protected function text(Filter $filter = null)
{ {
$value = $filter === null ? '' : $filter->getExpression(); $value = $filter === null ? '' : $filter->getExpression();
@ -275,7 +286,7 @@ class Zend_View_Helper_FormDataFilter extends Zend_View_Helper_FormElement
); );
} }
protected function selectSign(Filter $filter = null) protected function selectSign(FilterExpression $filter = null)
{ {
$signs = array( $signs = array(
'=' => '=', '=' => '=',
@ -285,19 +296,24 @@ class Zend_View_Helper_FormDataFilter extends Zend_View_Helper_FormElement
'>=' => '>=', '>=' => '>=',
'<=' => '<=', '<=' => '<=',
'in' => 'in', 'in' => 'in',
'contains' => 'contains',
// 'true' => 'is true (or set)', // 'true' => 'is true (or set)',
); );
if ($filter === null) { if ($filter === null) {
$sign = null; $sign = null;
} else { } else {
$expression = json_decode($filter->getExpression()); if ($this->columnIsJson($filter)) {
if ($expression === true) { $sign = 'contains';
$sign = 'true';
} elseif (is_array($expression)) {
$sign = 'in';
} else { } else {
$sign = $filter->getSign(); $expression = json_decode($filter->getExpression());
if ($expression === true) {
$sign = 'true';
} elseif (is_array($expression)) {
$sign = 'in';
} else {
$sign = $filter->getSign();
}
} }
} }
@ -320,9 +336,12 @@ class Zend_View_Helper_FormDataFilter extends Zend_View_Helper_FormElement
return $this; return $this;
} }
protected function selectColumn(Filter $filter = null) protected function selectColumn(FilterExpression $filter = null)
{ {
$active = $filter === null ? null : $filter->getColumn(); $active = $filter === null ? null : $filter->getColumn();
if ($filter && $this->columnIsJson($filter)) {
$active = $filter->getExpression();
}
if (! $this->hasColumnList()) { if (! $this->hasColumnList()) {
return $this->view->formText( return $this->view->formText(

View File

@ -60,7 +60,14 @@ class AssignRenderer
protected function renderEquals($column, $expression) protected function renderEquals($column, $expression)
{ {
if (substr($column, -7) === '.groups') { if ($column[0] === '"') {
// "me"=vars.users -> "me" in vars.users
return sprintf(
'%s in %s',
$column,
$expression
);
} else if (substr($column, -7) === '.groups') {
return sprintf( return sprintf(
'%s in %s', '%s in %s',
$expression, $expression,

View File

@ -275,6 +275,14 @@ class DataFilter extends FormElement
'=', '=',
json_encode($value) json_encode($value)
); );
} elseif ($entry['sign'] === 'contains') {
$value = array_key_exists('value', $entry) ? $entry['value'] : null;
return Filter::expression(
json_encode($value),
'=',
$entry['column']
);
} else { } else {
$value = array_key_exists('value', $entry) ? $entry['value'] : null; $value = array_key_exists('value', $entry) ? $entry['value'] : null;