Commit 8cd24773 by Alexander Makarov

Query::filter() adjustments

parent a884c80f
...@@ -92,7 +92,7 @@ class Query extends Component implements QueryInterface ...@@ -92,7 +92,7 @@ class Query extends Component implements QueryInterface
* @var array|string The filter part of this search query. This is an array or json string that follows the format of * @var array|string The filter part of this search query. This is an array or json string that follows the format of
* the elasticsearch [Query DSL](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl.html). * the elasticsearch [Query DSL](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl.html).
*/ */
public $filter; public $filterPart;
public $facets = []; public $facets = [];
...@@ -459,9 +459,9 @@ class Query extends Component implements QueryInterface ...@@ -459,9 +459,9 @@ class Query extends Component implements QueryInterface
* @param string $filter * @param string $filter
* @return static the query object itself * @return static the query object itself
*/ */
public function applyFilter($filter) public function filterPart($filter)
{ {
$this->filter = $filter; $this->filterPart = $filter;
return $this; return $this;
} }
......
...@@ -62,17 +62,17 @@ class QueryBuilder extends \yii\base\Object ...@@ -62,17 +62,17 @@ class QueryBuilder extends \yii\base\Object
} }
$whereFilter = $this->buildCondition($query->where); $whereFilter = $this->buildCondition($query->where);
if (is_string($query->filter)) { if (is_string($query->filterPart)) {
if (empty($whereFilter)) { if (empty($whereFilter)) {
$parts['filter'] = $query->filter; $parts['filter'] = $query->filterPart;
} else { } else {
$parts['filter'] = '{"and": [' . $query->filter . ', ' . Json::encode($whereFilter) . ']}'; $parts['filter'] = '{"and": [' . $query->filterPart . ', ' . Json::encode($whereFilter) . ']}';
} }
} elseif ($query->filter !== null) { } elseif ($query->filterPart !== null) {
if (empty($whereFilter)) { if (empty($whereFilter)) {
$parts['filter'] = $query->filter; $parts['filter'] = $query->filterPart;
} else { } else {
$parts['filter'] = ['and' => [$query->filter, $whereFilter]]; $parts['filter'] = ['and' => [$query->filterPart, $whereFilter]];
} }
} elseif (!empty($whereFilter)) { } elseif (!empty($whereFilter)) {
$parts['filter'] = $whereFilter; $parts['filter'] = $whereFilter;
......
...@@ -819,6 +819,16 @@ class Query extends Component implements QueryInterface ...@@ -819,6 +819,16 @@ class Query extends Component implements QueryInterface
$operator = strtoupper($condition[0]); $operator = strtoupper($condition[0]);
switch ($operator) { switch ($operator) {
case 'NOT':
case 'AND':
case 'OR':
$subCondition = $this->filterCondition($condition[1]);
if ($this->parameterNotEmpty($subCondition)) {
$condition[1] = $subCondition;
} else {
$condition = [];
}
break;
case 'IN': case 'IN':
case 'NOT IN': case 'NOT IN':
case 'LIKE': case 'LIKE':
...@@ -837,7 +847,7 @@ class Query extends Component implements QueryInterface ...@@ -837,7 +847,7 @@ class Query extends Component implements QueryInterface
break; break;
} }
} else { } else {
$condition = $this->filterConditionHash($condition); $condition = $this->filterHashCondition($condition);
} }
return $condition; return $condition;
} }
......
...@@ -906,6 +906,16 @@ class Query extends Component implements QueryInterface ...@@ -906,6 +906,16 @@ class Query extends Component implements QueryInterface
$operator = strtoupper($condition[0]); $operator = strtoupper($condition[0]);
switch ($operator) { switch ($operator) {
case 'NOT':
case 'AND':
case 'OR':
$subCondition = $this->filterCondition($condition[1]);
if ($this->parameterNotEmpty($subCondition)) {
$condition[1] = $subCondition;
} else {
$condition = [];
}
break;
case 'IN': case 'IN':
case 'NOT IN': case 'NOT IN':
case 'LIKE': case 'LIKE':
...@@ -924,7 +934,7 @@ class Query extends Component implements QueryInterface ...@@ -924,7 +934,7 @@ class Query extends Component implements QueryInterface
break; break;
} }
} else { } else {
$condition = $this->filterConditionHash($condition); $condition = $this->filterHashCondition($condition);
} }
return $condition; return $condition;
} }
......
...@@ -109,7 +109,7 @@ trait QueryTrait ...@@ -109,7 +109,7 @@ trait QueryTrait
* @param array $condition original condition * @param array $condition original condition
* @return array condition with empty parameters removed * @return array condition with empty parameters removed
*/ */
protected function filterConditionHash($condition) protected function filterHashCondition($condition)
{ {
if (is_array($condition) && !isset($condition[0])) { if (is_array($condition) && !isset($condition[0])) {
// hash format: 'column1' => 'value1', 'column2' => 'value2', ... // hash format: 'column1' => 'value1', 'column2' => 'value2', ...
...@@ -126,7 +126,7 @@ trait QueryTrait ...@@ -126,7 +126,7 @@ trait QueryTrait
*/ */
protected function filterCondition($condition) protected function filterCondition($condition)
{ {
return $this->filterConditionHash($condition); return $this->filterHashCondition($condition);
} }
/** /**
......
...@@ -117,6 +117,17 @@ class QueryTest extends SphinxTestCase ...@@ -117,6 +117,17 @@ class QueryTest extends SphinxTestCase
$this->assertEquals($condition, $query->where); $this->assertEquals($condition, $query->where);
} }
public function testFilterRecursively()
{
$query = new Query();
$query->filter(['not', ['like', 'name', '']]);
$this->assertEquals(null, $query->where);
$query->where(['id' => 1]);
$query->filter(['and', ['like', 'name', '']]);
$this->assertEquals(['id' => 1], $query->where);
}
public function testGroup() public function testGroup()
{ {
$query = new Query; $query = new Query;
......
...@@ -106,6 +106,17 @@ class QueryTest extends DatabaseTestCase ...@@ -106,6 +106,17 @@ class QueryTest extends DatabaseTestCase
$this->assertEquals($condition, $query->where); $this->assertEquals($condition, $query->where);
} }
public function testFilterRecursively()
{
$query = new Query();
$query->filter(['not', ['like', 'name', '']]);
$this->assertEquals(null, $query->where);
$query->where(['id' => 1]);
$query->filter(['and', ['like', 'name', '']]);
$this->assertEquals(['id' => 1], $query->where);
}
public function testJoin() public function testJoin()
{ {
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment