Commit 7a937903 by Klimov Paul

`yii\mongodb\Collection::buildLikeCondition()` fixed to escape regular expression.

`yii\mongodb\Collection::buildRegexCondition()` added.
parent 3e3ae634
......@@ -832,6 +832,7 @@ class Collection extends Object
'NOT BETWEEN' => 'buildBetweenCondition',
'IN' => 'buildInCondition',
'NOT IN' => 'buildInCondition',
'REGEX' => 'buildRegexCondition',
'LIKE' => 'buildLikeCondition',
];
......@@ -999,6 +1000,27 @@ class Collection extends Object
}
/**
* Creates a Mongo regular expression condition.
* @param string $operator the operator to use
* @param array $operands the first operand is the column name.
* The second operand is a single value that column value should be compared with.
* @return array the generated Mongo condition.
* @throws InvalidParamException if wrong number of operands have been given.
*/
public function buildRegexCondition($operator, $operands)
{
if (!isset($operands[0], $operands[1])) {
throw new InvalidParamException("Operator '$operator' requires two operands.");
}
list($column, $value) = $operands;
if (!($value instanceof \MongoRegex)) {
$value = new \MongoRegex($value);
}
return [$column => $value];
}
/**
* Creates a Mongo condition, which emulates the `LIKE` operator.
* @param string $operator the operator to use
* @param array $operands the first operand is the column name.
......@@ -1013,7 +1035,7 @@ class Collection extends Object
}
list($column, $value) = $operands;
if (!($value instanceof \MongoRegex)) {
$value = new \MongoRegex($value);
$value = new \MongoRegex('/' . preg_quote($value) . '/');
}
return [$column => $value];
......
......@@ -123,7 +123,7 @@ class QueryRunTest extends MongoDbTestCase
->where([
'name' => ['name1', 'name5', 'name10']
])
->andWhere(['LIKE', 'name', '/me1/'])
->andWhere(['LIKE', 'name', 'me1'])
->andWhere(['name' => 'name10'])
->all($connection);
$this->assertEquals(1, count($rows));
......@@ -180,12 +180,24 @@ class QueryRunTest extends MongoDbTestCase
$this->assertEquals(1, count($rows));
}
public function testRegex()
{
$connection = $this->getConnection();
$query = new Query;
$rows = $query->from('customer')
->where(['REGEX', 'name', '/me1/'])
->all($connection);
$this->assertEquals(2, count($rows));
$this->assertEquals('name1', $rows[0]['name']);
$this->assertEquals('name10', $rows[1]['name']);
}
public function testLike()
{
$connection = $this->getConnection();
$query = new Query;
$rows = $query->from('customer')
->where(['LIKE', 'name', '/me1/'])
->where(['LIKE', 'name', 'me1'])
->all($connection);
$this->assertEquals(2, count($rows));
$this->assertEquals('name1', $rows[0]['name']);
......
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