diff --git a/source/MongoDB.Tests/IntegrationTests/Linq/MongoQueryProviderTests.cs b/source/MongoDB.Tests/IntegrationTests/Linq/MongoQueryProviderTests.cs index e45cdc07..8d10e377 100644 --- a/source/MongoDB.Tests/IntegrationTests/Linq/MongoQueryProviderTests.cs +++ b/source/MongoDB.Tests/IntegrationTests/Linq/MongoQueryProviderTests.cs @@ -354,6 +354,20 @@ where Regex.IsMatch(p.FirstName, "Joe") Assert.AreEqual(new Document("FirstName", new MongoRegex("Joe")), queryObject.Query); } + [Test] + public void Regex_IsMatch_CaseInsensitive() + { + var people = from p in Collection.Linq() + where Regex.IsMatch(p.FirstName, "Joe", RegexOptions.IgnoreCase) + select p; + + var queryObject = ((IMongoQueryable)people).GetQueryObject(); + Assert.AreEqual(0, queryObject.Fields.Count); + Assert.AreEqual(0, queryObject.NumberToLimit); + Assert.AreEqual(0, queryObject.NumberToSkip); + Assert.AreEqual(new Document("FirstName", new MongoRegex("Joe", MongoRegexOption.IgnoreCase)), queryObject.Query); + } + [Test] public void SingleEqualConstraint() { diff --git a/source/MongoDB.Tests/IntegrationTests/Linq/MongoQueryTests.cs b/source/MongoDB.Tests/IntegrationTests/Linq/MongoQueryTests.cs index 68066dec..94ae8908 100644 --- a/source/MongoDB.Tests/IntegrationTests/Linq/MongoQueryTests.cs +++ b/source/MongoDB.Tests/IntegrationTests/Linq/MongoQueryTests.cs @@ -370,6 +370,16 @@ where Regex.IsMatch(p.FirstName, "Joe") Assert.AreEqual(1, people.Count); } + [Test] + public void Regex_IsMatch_CaseInsensitive() + { + var people = (from p in Collection.Linq() + where Regex.IsMatch(p.FirstName, "joe", RegexOptions.IgnoreCase) + select p).ToList(); + + Assert.AreEqual(1, people.Count); + } + [Test] public void Single() { diff --git a/source/MongoDB.Tests/UnitTests/TestMongoRegex.cs b/source/MongoDB.Tests/UnitTests/TestMongoRegex.cs index ec28e073..03e2991a 100644 --- a/source/MongoDB.Tests/UnitTests/TestMongoRegex.cs +++ b/source/MongoDB.Tests/UnitTests/TestMongoRegex.cs @@ -45,6 +45,14 @@ public void CanBeConstructedFromRegex() Assert.AreEqual("img", regex.RawOptions); } + [Test] + public void MongoRegexOptionFlagsAreIndependent() + { + var regex = new MongoRegex("expression", MongoRegexOption.IgnoreCase); + Assert.AreEqual("expression", regex.Expression); + Assert.AreEqual("i", regex.RawOptions); + } + [Test] public void CanBeConstructedWithMongoRegexOption() { @@ -53,6 +61,14 @@ public void CanBeConstructedWithMongoRegexOption() Assert.AreEqual("img", regex.RawOptions); } + [Test] + public void CanBeConstructedWithRegexOptions() + { + var regex = new MongoRegex("expression", RegexOptions.IgnoreCase | RegexOptions.Multiline); + Assert.AreEqual("expression", regex.Expression); + Assert.AreEqual("im", regex.RawOptions); + } + [Test] public void CanReadOptions() { diff --git a/source/MongoDB/Linq/Translators/DocumentFormatter.cs b/source/MongoDB/Linq/Translators/DocumentFormatter.cs index 3eefc054..7270ffdc 100644 --- a/source/MongoDB/Linq/Translators/DocumentFormatter.cs +++ b/source/MongoDB/Linq/Translators/DocumentFormatter.cs @@ -225,7 +225,11 @@ protected override Expression VisitMethodCall(MethodCallExpression m) else throw new InvalidQueryException(string.Format("Only the static Regex.IsMatch is supported.", m.Method.Name)); - AddCondition(new MongoRegex(value)); + var regexOptions = RegexOptions.None; + if (m.Arguments.Count > 2) + regexOptions = EvaluateConstant(m.Arguments[2]); + + AddCondition(new MongoRegex(value, regexOptions)); PopConditionScope(); return m; } diff --git a/source/MongoDB/MongoRegex.cs b/source/MongoDB/MongoRegex.cs index 38b80c2e..11bc7b67 100644 --- a/source/MongoDB/MongoRegex.cs +++ b/source/MongoDB/MongoRegex.cs @@ -38,6 +38,16 @@ public MongoRegex(string expression, MongoRegexOption options) Options = options; } + /// + /// Initializes a new instance of the class. + /// + /// The Regex expression. + /// The Regex options. + public MongoRegex(string expression, RegexOptions options) + : this(new Regex(expression, options)) + { + } + /// /// Initializes a new instance of the class. /// diff --git a/source/MongoDB/MongoRegexOption.cs b/source/MongoDB/MongoRegexOption.cs index 909d9224..0dff132c 100644 --- a/source/MongoDB/MongoRegexOption.cs +++ b/source/MongoDB/MongoRegexOption.cs @@ -25,6 +25,6 @@ public enum MongoRegexOption /// /// g - Eliminates unescaped white space from the pattern. /// - IgnorePatternWhitespace = 3 + IgnorePatternWhitespace = 4 } } \ No newline at end of file