public void Select_distinct_order_by() { var q = UtExtensions.Select <Home> (h => h.Town); Assert.AreEqual(1, q.SelectClause.Count); Assert.AreEqual("Town", q.SelectClause[0].Name); Assert.AreEqual("Town", q.SelectClause[0].Alias); q = UtExtensions.Select <Home> (h => new { Town = h.Town, Adress = h.Address }); Assert.AreEqual(2, q.SelectClause.Count); Assert.AreEqual("Town", q.SelectClause[0].Name); Assert.IsFalse(q.Distinct); // check with distinct clause q = UtExtensions.Select <Home> (h => new { Town = h.Town, Adress = h.Address }, true); Assert.IsTrue(q.Distinct); q = UtExtensions.OrderBy <Home, decimal> (h => h.PriceInEuros); Assert.AreEqual("PriceInEuros", q.OrderByProperty); Assert.IsFalse(q.OrderByIsDescending); q = UtExtensions.OrderBy <Home, decimal> (h => h.PriceInEuros, true); Assert.AreEqual("PriceInEuros", q.OrderByProperty); Assert.IsTrue(q.OrderByIsDescending); }
public void Test_subset_on_queries() { { var q1 = UtExtensions.PredicateToQuery <TradeLike>(t => t.ValueDate == DateTime.Today); var q2 = UtExtensions.PredicateToQuery <TradeLike>(t => t.ValueDate >= DateTime.Today.AddDays(-10)); Assert.IsTrue(q1.IsSubsetOf(q2)); Assert.IsFalse(q2.IsSubsetOf(q1)); } { var q1 = UtExtensions.PredicateToQuery <TradeLike>(t => t.ValueDate == DateTime.Today && t.Folder == "EUR12"); var q2 = UtExtensions.PredicateToQuery <TradeLike>(t => t.ValueDate >= DateTime.Today.AddDays(-10)); Assert.IsTrue(q1.IsSubsetOf(q2)); Assert.IsFalse(q2.IsSubsetOf(q1)); } { var q1 = UtExtensions.PredicateToQuery <TradeLike>(t => t.Folder == "EUR12"); var q2 = UtExtensions.PredicateToQuery <TradeLike>(t => t.Folder == "EUR12" || t.Folder == "EUR11"); Assert.IsTrue(q1.IsSubsetOf(q2)); Assert.IsFalse(q2.IsSubsetOf(q1)); } { var q1 = UtExtensions.PredicateToQuery <TradeLike>(t => t.Folder == "EUR12"); var q2 = UtExtensions.PredicateToQuery <TradeLike>(t => t.Folder == "EUR12" || t.Folder == "EUR11" && t.ValueDate == DateTime.Today); Assert.IsTrue(q1.IsSubsetOf(q2)); Assert.IsFalse(q2.IsSubsetOf(q1)); } { var q1 = UtExtensions.PredicateToQuery <TradeLike>(t => t.Folder == "EUR11"); var q2 = UtExtensions.PredicateToQuery <TradeLike>(t => t.Folder == "EUR12" || t.Folder == "EUR11" && t.ValueDate == DateTime.Today); Assert.IsFalse(q1.IsSubsetOf(q2)); } { var q1 = UtExtensions.PredicateToQuery <TradeLike>(t => t.Folder == "EUR11" && t.ValueDate == DateTime.Today); var q2 = UtExtensions.PredicateToQuery <TradeLike>(t => t.Folder == "EUR12" || t.Folder == "EUR11" && t.ValueDate > DateTime.Today.AddDays(-10)); Assert.IsTrue(q1.IsSubsetOf(q2)); Assert.IsFalse(q2.IsSubsetOf(q1)); // every query is a subset of an empty query Assert.IsTrue(q1.IsSubsetOf(OrQuery.Empty <TradeLike>())); Assert.IsTrue(q2.IsSubsetOf(OrQuery.Empty <TradeLike>())); } }
public void Expression_tree_processing() { var towns = new[] { "Paris", "Nice" }; // not supposed to be optimal; improving coverage (constant at left + extension at root level) var query = UtExtensions.PredicateToQuery <Home>(h => towns.Contains(h.Town) || "Toronto" == h.Town); Assert.AreEqual(2, query.Elements.Count); Assert.AreEqual(QueryOperator.In, query.Elements.First().Elements.Single().Operator); Assert.AreEqual("Toronto", query.Elements.Last().Elements.Single().Value.ToString()); // check reversed "Contains" at root query = UtExtensions.PredicateToQuery <Home>(h => h.AvailableDates.Contains(DateTime.Today) || h.Town == "Nowhere"); Assert.AreEqual(2, query.Elements.Count); Assert.AreEqual(QueryOperator.Contains, query.Elements.First().Elements.Single().Operator); // check boolean members without operator query = UtExtensions.PredicateToQuery <Order>(o => o.IsDelivered); Assert.AreEqual(QueryOperator.Eq, query.Elements.First().Elements.Single().Operator); query = UtExtensions.PredicateToQuery <Order>(o => o.IsDelivered || o.Amount < 0.1); Assert.AreEqual(2, query.Elements.Count); // check reversing simple queries var query1 = UtExtensions.PredicateToQuery <Order>(o => o.Amount < 0.1); var query2 = UtExtensions.PredicateToQuery <Order>(o => 0.1 > o.Amount); Assert.AreEqual(query1.Elements.Single().Elements.Single(), query2.Elements.Single().Elements.Single()); query = UtExtensions.PredicateToQuery <Order>(o => o.Amount < 0.1 || o.IsDelivered); Assert.AreEqual(2, query.Elements.Count); query = UtExtensions.PredicateToQuery <Order>(o => o.Amount < 0.1 && o.IsDelivered); Assert.AreEqual(1, query.Elements.Count); Assert.AreEqual(2, query.Elements[0].Elements.Count); query = UtExtensions.PredicateToQuery <Order>(o => o.IsDelivered && o.Amount < 0.1); Assert.AreEqual(1, query.Elements.Count); Assert.AreEqual(2, query.Elements[0].Elements.Count); query = UtExtensions.PredicateToQuery <Order>(o => !o.IsDelivered); Assert.AreEqual(1, query.Elements.Count); Assert.AreEqual(1, query.Elements[0].Elements.Count); var str = query.ToString(); Assert.AreEqual("IsDelivered = False", str); // check != operator query = UtExtensions.PredicateToQuery <Order>(o => o.ClientId != 15); Assert.AreEqual(1, query.Elements.Count); Assert.AreEqual(1, query.Elements[0].Elements.Count); Assert.AreEqual(QueryOperator.NotEq, query.Elements[0].Elements[0].Operator); // check not contains query = UtExtensions.PredicateToQuery <Home>(h => !h.AvailableDates.Contains(DateTime.Today)); Assert.AreEqual(1, query.Elements.Count); Assert.AreEqual(1, query.Elements[0].Elements.Count); Assert.AreEqual(QueryOperator.NotContains, query.Elements[0].Elements[0].Operator); query = UtExtensions.PredicateToQuery <Home>(h => !towns.Contains(h.Town)); Assert.AreEqual(1, query.Elements.Count); Assert.AreEqual(1, query.Elements[0].Elements.Count); Assert.AreEqual(QueryOperator.NotIn, query.Elements[0].Elements[0].Operator); query = UtExtensions.PredicateToQuery <Home>(h => !h.AvailableDates.Contains(DateTime.Today) && h.Town == "Paris"); Assert.IsTrue(query.IsValid); Assert.AreEqual(1, query.Elements.Count); Assert.AreEqual(2, query.Elements[0].Elements.Count); Assert.IsTrue(query.Elements[0].Elements.Any(q => q.Operator == QueryOperator.NotContains)); query = UtExtensions.PredicateToQuery <Home>(h => h.Town == "Paris" && !h.AvailableDates.Contains(DateTime.Today)); Assert.IsTrue(query.IsValid); Assert.AreEqual(1, query.Elements.Count); Assert.AreEqual(2, query.Elements[0].Elements.Count); Assert.IsTrue(query.Elements[0].Elements.Any(q => q.Operator == QueryOperator.NotContains)); query = UtExtensions.PredicateToQuery <Home>(h => !h.AvailableDates.Contains(DateTime.Today) || h.Town == "Paris"); Assert.IsTrue(query.IsValid); Assert.AreEqual(2, query.Elements.Count); Assert.IsTrue(query.Elements.Any(q => q.Elements[0].Operator == QueryOperator.NotContains)); query = UtExtensions.PredicateToQuery <Home>(h => h.Town == "Paris" || !h.AvailableDates.Contains(DateTime.Today)); Assert.IsTrue(query.IsValid); Assert.AreEqual(2, query.Elements.Count); Assert.IsTrue(query.Elements.Any(q => q.Elements.Any(e => e.Operator == QueryOperator.NotContains))); Console.WriteLine(query); // string operators query = UtExtensions.PredicateToQuery <Home>(h => h.Town.StartsWith("p")); Assert.IsTrue(query.IsValid); Assert.AreEqual(1, query.Elements.Count); Assert.AreEqual(1, query.Elements[0].Elements.Count); Assert.AreEqual(QueryOperator.StrStartsWith, query.Elements[0].Elements[0].Operator); query = UtExtensions.PredicateToQuery <Home>(h => h.Town.Contains("p")); Assert.IsTrue(query.IsValid); Assert.AreEqual(1, query.Elements.Count); Assert.AreEqual(1, query.Elements[0].Elements.Count); Assert.AreEqual(QueryOperator.StrContains, query.Elements[0].Elements[0].Operator); query = UtExtensions.PredicateToQuery <Home>(h => h.Town.Contains("p") || h.Town.StartsWith("P") || h.Town.EndsWith("p")); Assert.IsTrue(query.IsValid); Assert.AreEqual(3, query.Elements.Count); query = UtExtensions.PredicateToQuery <Home>(h => h.Town.Contains("p") && h.Town.StartsWith("P") && h.Town.EndsWith("p")); Assert.IsTrue(query.IsValid); Assert.AreEqual(1, query.Elements.Count); Assert.AreEqual(3, query.Elements[0].Elements.Count); Console.WriteLine(query); // we are not trying to parse everything Assert.Throws <NotSupportedException>(() => UtExtensions.PredicateToQuery <Home>(h => h.Town.IndexOf("p", StringComparison.InvariantCulture) == 2)); }