Skip to content

Commit 88c23c6

Browse files
committed
Fix for issue 131; Introduce NotLike into Ado & InMemory Adapters with tests
1 parent 57006bc commit 88c23c6

6 files changed

Lines changed: 66 additions & 5 deletions

File tree

Simple.Data.Ado/AdoAdapter.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,8 @@ public override IEnumerable<IEnumerable<IDictionary<string, object>>> RunQueries
436436

437437
public override bool IsExpressionFunction(string functionName, params object[] args)
438438
{
439-
return functionName.Equals("like", StringComparison.OrdinalIgnoreCase)
439+
return (functionName.Equals("like", StringComparison.OrdinalIgnoreCase) ||
440+
functionName.Equals("notlike", StringComparison.OrdinalIgnoreCase))
440441
&& args.Length == 1
441442
&& args[0] is string;
442443
}

Simple.Data.BehaviourTest/FindTest.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,14 @@ public void TestFindWithLike()
187187
Parameter(0).Is("Foo");
188188
}
189189

190+
[Test]
191+
public void TestFindWithNotLike()
192+
{
193+
_db.Users.Find(_db.Users.Name.NotLike("Foo"));
194+
GeneratedSqlIs("select " + usersColumns + " from [dbo].[Users] where [dbo].[Users].[name] not like @p1");
195+
Parameter(0).Is("Foo");
196+
}
197+
190198
[Test]
191199
public void TestFindAllWithLike()
192200
{
@@ -195,6 +203,14 @@ public void TestFindAllWithLike()
195203
Parameter(0).Is("Foo");
196204
}
197205

206+
[Test]
207+
public void TestFindAllWithNotLike()
208+
{
209+
_db.Users.FindAll(_db.Users.Name.NotLike("Foo")).ToList();
210+
GeneratedSqlIs("select [dbo].[Users].[id],[dbo].[Users].[name],[dbo].[Users].[password],[dbo].[Users].[age] from [dbo].[Users] where [dbo].[Users].[name] not like @p1");
211+
Parameter(0).Is("Foo");
212+
}
213+
198214
[Test]
199215
public void TestFindAllByNamedParameterSingleColumn()
200216
{

Simple.Data.InMemoryTest/InMemoryTests.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,32 @@ public void AllShouldReturnAllRecords()
5959
Assert.AreEqual(2, records.Count);
6060
}
6161

62+
[Test]
63+
public void TestFindAllByPartialName()
64+
{
65+
Database.UseMockAdapter(new InMemoryAdapter());
66+
var db = Database.Open();
67+
db.Test.Insert(Id: 1, Name: "Alice");
68+
db.Test.Insert(Id: 2, Name: "Bob");
69+
db.Test.Insert(Id: 2, Name: "Clive");
70+
List<dynamic> records = db.Test.FindAll(db.Test.Name.Like("A%")).ToList();
71+
Assert.IsNotNull(records);
72+
Assert.AreEqual(1, records.Count);
73+
}
74+
75+
[Test]
76+
public void TestFindAllByExcludedPartialName()
77+
{
78+
Database.UseMockAdapter(new InMemoryAdapter());
79+
var db = Database.Open();
80+
db.Test.Insert(Id: 1, Name: "Alice");
81+
db.Test.Insert(Id: 2, Name: "Bob");
82+
db.Test.Insert(Id: 2, Name: "Clive");
83+
List<dynamic> records = db.Test.FindAll(db.Test.Name.NotLike("A%")).ToList();
84+
Assert.IsNotNull(records);
85+
Assert.AreEqual(2, records.Count);
86+
}
87+
6288
[Test]
6389
public void SelectShouldReturnSubsetOfColumns()
6490
{

Simple.Data.SqlTest/FindTests.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,14 @@ public void TestFindAllByPartialName()
7070
Assert.AreEqual(1, users.Count());
7171
}
7272

73+
[Test]
74+
public void TestFindAllByExcludedPartialName()
75+
{
76+
var db = DatabaseHelper.Open();
77+
IEnumerable<User> users = db.Users.FindAll(db.Users.Name.NotLike("Bob")).ToList<User>();
78+
Assert.AreEqual(2, users.Count());
79+
}
80+
7381
[Test]
7482
public void TestAllCount()
7583
{

Simple.Data/InMemoryAdapter.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,10 @@ public override int Delete(string tableName, SimpleExpression criteria)
179179

180180
public override bool IsExpressionFunction(string functionName, params object[] args)
181181
{
182-
return functionName.Equals("like", StringComparison.OrdinalIgnoreCase) && args.Length == 1 &&
183-
args[0] is string;
182+
return (functionName.Equals("like", StringComparison.OrdinalIgnoreCase) ||
183+
functionName.Equals("notlike", StringComparison.OrdinalIgnoreCase))
184+
&& args.Length == 1
185+
&& args[0] is string;
184186
}
185187

186188
public void SetAutoIncrementColumn(string tableName, string columnName)

Simple.Data/QueryPolyfills/WhereClauseHandler.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ private Func<IDictionary<string, object>, bool> FunctionExpressionToWhereClause(
3434
{
3535
var function = arg.RightOperand as SimpleFunction;
3636
if (ReferenceEquals(function, null)) throw new InvalidOperationException("Expression type of function but no function supplied.");
37-
if (function.Name.Equals("like", StringComparison.OrdinalIgnoreCase))
37+
if (function.Name.Equals("like", StringComparison.OrdinalIgnoreCase) ||
38+
function.Name.Equals("notlike", StringComparison.OrdinalIgnoreCase))
3839
{
3940
var pattern = function.Args[0].ToString();
4041
if (pattern.Contains("%") || pattern.Contains("_")) // SQL Server LIKE
@@ -44,7 +45,14 @@ private Func<IDictionary<string, object>, bool> FunctionExpressionToWhereClause(
4445

4546
var regex = new Regex("^" + pattern + "$", RegexOptions.Multiline | RegexOptions.IgnoreCase);
4647

47-
return d => Resolve(d, arg.LeftOperand).Count > 0 && Resolve(d, arg.LeftOperand).OfType<string>().Any(regex.IsMatch);
48+
if (function.Name.Equals("like", StringComparison.OrdinalIgnoreCase))
49+
{
50+
return d => Resolve(d, arg.LeftOperand).Count > 0 && Resolve(d, arg.LeftOperand).OfType<string>().Any(regex.IsMatch);
51+
}
52+
if (function.Name.Equals("notlike", StringComparison.OrdinalIgnoreCase))
53+
{
54+
return d => Resolve(d, arg.LeftOperand).Count > 0 && Resolve(d, arg.LeftOperand).OfType<string>().All(input => !regex.IsMatch(input));
55+
}
4856
}
4957

5058
throw new NotSupportedException("Expression Function not supported.");

0 commit comments

Comments
 (0)