Skip to content

Commit f264954

Browse files
CaptainCodemanlanwin
authored andcommitted
Convert RegexOptions to MongoRegexOption when translating expression for Linq
Allows more control over type of Regex match, e.g. (x => Regex.IsMatch(x.Name, "^" + prefix, RegexOptions.IgnoreCase) Also fixed bug where setting IgnoreCase would also set IgnorePatternWhitespace (MongoRegexOption flags overlapped)
1 parent 6fd8ac4 commit f264954

File tree

6 files changed

+56
-2
lines changed

6 files changed

+56
-2
lines changed

source/MongoDB.Tests/IntegrationTests/Linq/MongoQueryProviderTests.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,20 @@ where Regex.IsMatch(p.FirstName, "Joe")
354354
Assert.AreEqual(new Document("FirstName", new MongoRegex("Joe")), queryObject.Query);
355355
}
356356

357+
[Test]
358+
public void Regex_IsMatch_CaseInsensitive()
359+
{
360+
var people = from p in Collection.Linq()
361+
where Regex.IsMatch(p.FirstName, "Joe", RegexOptions.IgnoreCase)
362+
select p;
363+
364+
var queryObject = ((IMongoQueryable)people).GetQueryObject();
365+
Assert.AreEqual(0, queryObject.Fields.Count);
366+
Assert.AreEqual(0, queryObject.NumberToLimit);
367+
Assert.AreEqual(0, queryObject.NumberToSkip);
368+
Assert.AreEqual(new Document("FirstName", new MongoRegex("Joe", MongoRegexOption.IgnoreCase)), queryObject.Query);
369+
}
370+
357371
[Test]
358372
public void SingleEqualConstraint()
359373
{

source/MongoDB.Tests/IntegrationTests/Linq/MongoQueryTests.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,16 @@ where Regex.IsMatch(p.FirstName, "Joe")
370370
Assert.AreEqual(1, people.Count);
371371
}
372372

373+
[Test]
374+
public void Regex_IsMatch_CaseInsensitive()
375+
{
376+
var people = (from p in Collection.Linq()
377+
where Regex.IsMatch(p.FirstName, "joe", RegexOptions.IgnoreCase)
378+
select p).ToList();
379+
380+
Assert.AreEqual(1, people.Count);
381+
}
382+
373383
[Test]
374384
public void Single()
375385
{

source/MongoDB.Tests/UnitTests/TestMongoRegex.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,14 @@ public void CanBeConstructedFromRegex()
4545
Assert.AreEqual("img", regex.RawOptions);
4646
}
4747

48+
[Test]
49+
public void MongoRegexOptionFlagsAreIndependent()
50+
{
51+
var regex = new MongoRegex("expression", MongoRegexOption.IgnoreCase);
52+
Assert.AreEqual("expression", regex.Expression);
53+
Assert.AreEqual("i", regex.RawOptions);
54+
}
55+
4856
[Test]
4957
public void CanBeConstructedWithMongoRegexOption()
5058
{
@@ -53,6 +61,14 @@ public void CanBeConstructedWithMongoRegexOption()
5361
Assert.AreEqual("img", regex.RawOptions);
5462
}
5563

64+
[Test]
65+
public void CanBeConstructedWithRegexOptions()
66+
{
67+
var regex = new MongoRegex("expression", RegexOptions.IgnoreCase | RegexOptions.Multiline);
68+
Assert.AreEqual("expression", regex.Expression);
69+
Assert.AreEqual("im", regex.RawOptions);
70+
}
71+
5672
[Test]
5773
public void CanReadOptions()
5874
{

source/MongoDB/Linq/Translators/DocumentFormatter.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,11 @@ protected override Expression VisitMethodCall(MethodCallExpression m)
225225
else
226226
throw new InvalidQueryException(string.Format("Only the static Regex.IsMatch is supported.", m.Method.Name));
227227

228-
AddCondition(new MongoRegex(value));
228+
var regexOptions = RegexOptions.None;
229+
if (m.Arguments.Count > 2)
230+
regexOptions = EvaluateConstant<RegexOptions>(m.Arguments[2]);
231+
232+
AddCondition(new MongoRegex(value, regexOptions));
229233
PopConditionScope();
230234
return m;
231235
}

source/MongoDB/MongoRegex.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,16 @@ public MongoRegex(string expression, MongoRegexOption options)
3838
Options = options;
3939
}
4040

41+
/// <summary>
42+
/// Initializes a new instance of the <see cref="MongoRegex"/> class.
43+
/// </summary>
44+
/// <param name="expression">The Regex expression.</param>
45+
/// <param name="options">The Regex options.</param>
46+
public MongoRegex(string expression, RegexOptions options)
47+
: this(new Regex(expression, options))
48+
{
49+
}
50+
4151
/// <summary>
4252
/// Initializes a new instance of the <see cref = "MongoRegex" /> class.
4353
/// </summary>

source/MongoDB/MongoRegexOption.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,6 @@ public enum MongoRegexOption
2525
/// <summary>
2626
/// g - Eliminates unescaped white space from the pattern.
2727
/// </summary>
28-
IgnorePatternWhitespace = 3
28+
IgnorePatternWhitespace = 4
2929
}
3030
}

0 commit comments

Comments
 (0)