示例#1
0
        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);
        }
示例#2
0
        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>()));
            }
        }
示例#3
0
        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));
        }