Commit 33c8f703 by Paul Klimov

Merge pull request #2909 from dirx/2868-mongob-combined-conditions

Changes building of mongodb and conditions & fixes #2868
parents 803b3547 e0edca24
......@@ -772,6 +772,7 @@ class Collection extends Object
protected function normalizeConditionKeyword($key)
{
static $map = [
'AND' => '$and',
'OR' => '$or',
'IN' => '$in',
'NOT IN' => '$nin',
......@@ -898,13 +899,13 @@ class Collection extends Object
*/
public function buildAndCondition($operator, $operands)
{
$result = [];
$operator = $this->normalizeConditionKeyword($operator);
$parts = [];
foreach ($operands as $operand) {
$condition = $this->buildCondition($operand);
$result = array_merge_recursive($result, $condition);
$parts[] = $this->buildCondition($operand);
}
return $result;
return [$operator => $parts];
}
/**
......
......@@ -101,6 +101,56 @@ class QueryRunTest extends MongoDbTestCase
$this->assertEquals('address5', $rows[1]['address']);
}
public function testCombinedInAndCondition()
{
$connection = $this->getConnection();
$query = new Query;
$rows = $query->from('customer')
->where([
'name' => ['name1', 'name5']
])
->andWhere(['name' => 'name1'])
->all($connection);
$this->assertEquals(1, count($rows));
$this->assertEquals('name1', $rows[0]['name']);
}
public function testCombinedInLikeAndCondition()
{
$connection = $this->getConnection();
$query = new Query;
$rows = $query->from('customer')
->where([
'name' => ['name1', 'name5', 'name10']
])
->andWhere(['LIKE', 'name', '/me1/'])
->andWhere(['name' => 'name10'])
->all($connection);
$this->assertEquals(1, count($rows));
$this->assertEquals('name10', $rows[0]['name']);
}
public function testNestedCombinedInAndCondition()
{
$connection = $this->getConnection();
$query = new Query;
$rows = $query->from('customer')
->where([
'and',
['name' => ['name1', 'name2', 'name3']],
['name' => 'name1']
])
->orWhere([
'and',
['name' => ['name4', 'name5', 'name6']],
['name' => 'name6']
])
->all($connection);
$this->assertEquals(2, count($rows));
$this->assertEquals('name1', $rows[0]['name']);
$this->assertEquals('name6', $rows[1]['name']);
}
public function testOrder()
{
$connection = $this->getConnection();
......
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