From 3cadba477c7d874100fcf78cf10eff5fc9ed4633 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Wed, 15 Apr 2015 22:08:23 +0200 Subject: [PATCH 1/2] Add AnyOf to TableQuery. --- src/SQLite.Net/TableQuery.cs | 51 ++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/src/SQLite.Net/TableQuery.cs b/src/SQLite.Net/TableQuery.cs index 588881a26..c41c5d3ba 100644 --- a/src/SQLite.Net/TableQuery.cs +++ b/src/SQLite.Net/TableQuery.cs @@ -120,6 +120,36 @@ public TableQuery Where([NotNull] Expression> predExpr) return q; } + [PublicAPI] + public TableQuery AnyOf(params Expression>[] predExprs) + { + if (predExprs.Length == 0) + throw new ArgumentException("predExprs is empty"); + + Expression[] preds = new Expression[predExprs.Length]; + int i = 0; + foreach (Expression> predExpr in predExprs) + { + if (predExpr == null) + { + throw new ArgumentNullException("predExpr"); + } + if (predExpr.NodeType != ExpressionType.Lambda) + { + throw new NotSupportedException("Must be a predicate"); + } + var lambda = (LambdaExpression)predExpr; + var pred = lambda.Body; + preds[i] = pred; + + i++; + } + + var q = Clone(); + q.AddAnyOf(preds); + return q; + } + [PublicAPI] public TableQuery Take(int n) { @@ -277,6 +307,27 @@ private void AddWhere([NotNull] Expression pred) } } + private void AddAnyOf(Expression[] preds) + { + if (preds.Length == 0) + { + throw new ArgumentException("preds is empty"); + } + if (_limit != null || _offset != null) + { + throw new NotSupportedException("Cannot call anyof after a skip or a take"); + } + + var expr = preds[0]; + for (int i = 1, len = preds.Length; i < len; i++) + { + var pred = preds[i]; + expr = Expression.OrElse(expr, pred); + } + + AddWhere(expr); + } + [PublicAPI] public TableQuery Join( TableQuery inner, From cd8fedfef7da2e75a8c16bccd8ee96b3583db65b Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Sat, 18 Apr 2015 17:08:31 +0200 Subject: [PATCH 2/2] Add tests for AnyOf --- tests/AnyOfTest.cs | 81 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 tests/AnyOfTest.cs diff --git a/tests/AnyOfTest.cs b/tests/AnyOfTest.cs new file mode 100644 index 000000000..e980f47e8 --- /dev/null +++ b/tests/AnyOfTest.cs @@ -0,0 +1,81 @@ +using System.Linq.Expressions; +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using SQLite.Net.Attributes; + +#if __WIN32__ +using SQLitePlatformTest = SQLite.Net.Platform.Win32.SQLitePlatformWin32; +#elif WINDOWS_PHONE +using SQLitePlatformTest = SQLite.Net.Platform.WindowsPhone8.SQLitePlatformWP8; +#elif __WINRT__ +using SQLitePlatformTest = SQLite.Net.Platform.WinRT.SQLitePlatformWinRT; +#elif __IOS__ +using SQLitePlatformTest = SQLite.Net.Platform.XamarinIOS.SQLitePlatformIOS; +#elif __ANDROID__ +using SQLitePlatformTest = SQLite.Net.Platform.XamarinAndroid.SQLitePlatformAndroid; +#else +using SQLitePlatformTest = SQLite.Net.Platform.Generic.SQLitePlatformGeneric; +#endif + + +namespace SQLite.Net.Tests +{ + [TestFixture] + internal class AnyOfTest + { + public class TestObj + { + [AutoIncrement, PrimaryKey] + public int Id { get; set; } + + public string ColumnA { get; set; } + public string ColumnB { get; set; } + + } + + public class TestDb : SQLiteConnection + { + public TestDb(String path) + : base(new SQLitePlatformTest(), path) + { + CreateTable(); + + Insert(new TestObj { ColumnA = "Foo", ColumnB = "Bar" }); + Insert(new TestObj { ColumnA = "Bar", ColumnB = "Baz" }); + Insert(new TestObj { ColumnA = "Baz", ColumnB = "Qux" }); + } + } + + [Test] + public void ParamsList() + { + var db = new TestDb(TestPath.GetTempFileName()); + + TableQuery results = db.Table().AnyOf(o => o.ColumnA == "Foo", o => o.ColumnB == "Qux"); + List resultsList = results.OrderBy(o => o.Id).ToList(); + + Assert.AreEqual(2, resultsList.Count); + Assert.AreEqual("Bar", resultsList[0].ColumnB); + Assert.AreEqual("Baz", resultsList[1].ColumnA); + } + + [Test] + public void Array() + { + var db = new TestDb(TestPath.GetTempFileName()); + + List>> preds = new List>>(); + preds.Add(o => o.ColumnA == "Foo"); + preds.Add(o => o.ColumnB == "Qux"); + + TableQuery results = db.Table().AnyOf(preds.ToArray()); + List resultsList = results.OrderBy(o => o.Id).ToList(); + + Assert.AreEqual(2, resultsList.Count); + Assert.AreEqual("Bar", resultsList[0].ColumnB); + Assert.AreEqual("Baz", resultsList[1].ColumnA); + } + } +} \ No newline at end of file