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 ...@@ -772,6 +772,7 @@ class Collection extends Object
protected function normalizeConditionKeyword($key) protected function normalizeConditionKeyword($key)
{ {
static $map = [ static $map = [
'AND' => '$and',
'OR' => '$or', 'OR' => '$or',
'IN' => '$in', 'IN' => '$in',
'NOT IN' => '$nin', 'NOT IN' => '$nin',
...@@ -898,13 +899,13 @@ class Collection extends Object ...@@ -898,13 +899,13 @@ class Collection extends Object
*/ */
public function buildAndCondition($operator, $operands) public function buildAndCondition($operator, $operands)
{ {
$result = []; $operator = $this->normalizeConditionKeyword($operator);
$parts = [];
foreach ($operands as $operand) { foreach ($operands as $operand) {
$condition = $this->buildCondition($operand); $parts[] = $this->buildCondition($operand);
$result = array_merge_recursive($result, $condition);
} }
return $result; return [$operator => $parts];
} }
/** /**
......
...@@ -101,6 +101,56 @@ class QueryRunTest extends MongoDbTestCase ...@@ -101,6 +101,56 @@ class QueryRunTest extends MongoDbTestCase
$this->assertEquals('address5', $rows[1]['address']); $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() public function testOrder()
{ {
$connection = $this->getConnection(); $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