コード例 #1
0
        public void CanHanldeEnums()
        {
            var filter = new FilterTreeNode(
                new GridFilter()
            {
                PropName    = "D",
                StringValue = "3",
                Operator    = "eq"
            });

            var query  = filter.WrapFilter(Collection);
            var result = query.ToArray();

            var expectation = "Linq.GridQuery.Test.TestSubject[].Where(par => (par.D == C))";

            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(result, Is.EquivalentTo(Collection.Skip(2)));
        }
コード例 #2
0
        public void CanHanldeNullables()
        {
            var filter = new FilterTreeNode(
                new GridFilter()
            {
                PropName    = "C",
                StringValue = "3",
                Operator    = "gt"
            });

            var query  = filter.WrapFilter(Collection);
            var result = query.ToArray();

            var expectation = "Linq.GridQuery.Test.TestSubject[].Where(par => IIF(par.C.HasValue, (par.C.Value > 3), False))";

            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(result, Is.EquivalentTo(Collection.Skip(2)));
        }
コード例 #3
0
        public void EndsWithTest()
        {
            var filter = new FilterTreeNode(
                new GridFilter()
            {
                PropName    = "B",
                StringValue = "'A'",
                Operator    = "endswith"
            });

            var query  = filter.WrapFilter(Collection);
            var result = query.ToArray();

            var expectation = "Linq.GridQuery.Test.TestSubject[].Where(par => IIF((par.B != null), par.B.EndsWith(\"A\"), False))";

            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(result, Is.EquivalentTo(Collection.Take(1)));
        }
コード例 #4
0
        public void DoesNotContainTest()
        {
            var filter = new FilterTreeNode(
                new GridFilter()
            {
                PropName    = "B",
                StringValue = "'C'",
                Operator    = "doesnotcontain"
            });

            var query  = filter.WrapFilter(Collection);
            var result = query.ToArray();

            var expectation = "Linq.GridQuery.Test.TestSubject[].Where(par => IIF((par.B != null), Not(par.B.Contains(\"C\")), False))";

            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(result, Is.EquivalentTo(Collection.Take(1)));
        }
コード例 #5
0
        public void NotInTest()
        {
            var filter = new FilterTreeNode(
                new GridFilter()
            {
                PropName    = "A",
                StringValue = "[1,5]",
                Operator    = "notin"
            });

            var query  = filter.WrapFilter(Collection);
            var result = query.ToArray();

            var expectation = "Linq.GridQuery.Test.TestSubject[].Where(par => Not(value(System.Int32[]).Contains(par.A)))";

            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(result, Is.EquivalentTo(Collection.Skip(1).Take(1)));
        }
コード例 #6
0
        public void LteTest()
        {
            var filter = new FilterTreeNode(
                new GridFilter()
            {
                PropName    = "A",
                StringValue = "3",
                Operator    = "lte"
            });

            var query  = filter.WrapFilter(Collection);
            var result = query.ToArray();

            var expectation = "Linq.GridQuery.Test.TestSubject[].Where(par => (par.A <= 3))";

            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(result, Is.EquivalentTo(Collection.Take(2)));
        }
コード例 #7
0
        public void SingleFitlerWorks()
        {
            var filter = new FilterTreeNode(
                new GridFilter()
            {
                PropName    = "A",
                StringValue = "4",
                Operator    = "gt"
            });

            var query  = filter.WrapFilter(Collection);
            var result = query.ToArray();

            var expectation = "Linq.GridQuery.Test.TestSubject[].Where(par => (par.A > 4))";

            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(query.Count, Is.EqualTo(1));
            Assert.That(query.Single().A, Is.EqualTo(5));
        }
コード例 #8
0
        public void NotInTestNullableEnum()
        {
            var filter = new FilterTreeNode(
                new GridFilter()
            {
                PropName    = "E",
                StringValue = "[1,3]",
                Operator    = "notin"
            });

            var query  = filter.WrapFilter(Collection);
            var result = query.ToArray();

            var expectation =
                "Linq.GridQuery.Test.TestSubject[].Where(par => IIF(par.E.HasValue, Not(value(Linq.GridQuery.Test.TestEnum[]).Contains(par.E.Value)), False))";

            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(result, Is.EquivalentTo(Collection.Skip(1).Take(1)));
        }
コード例 #9
0
        public void AdditionalOperatorToExpressionConvertersProvidedOnPerInstanceBasisOverrideBaseOnesOfTheSameName()
        {
            var  marker1    = "MARKER1";
            var  marker2    = "MARKER2";
            var  wasCalled  = false;
            Type typePassed = null;

            Config.DefaultOperatorToExpressionConverters.Add(marker2, new OperatorHandler((propTypeUnwrapped, propTypeRaw, left, right) =>
            {
                throw new Exception("This should never be called.");
            }));

            var additionalOperatorToExpressionConverters =
                new Dictionary <string, OperatorHandler>()
            {
                { marker2, new OperatorHandler((propTypeUnwrapped, propTypeRaw, left, right) =>
                    {
                        wasCalled  = true;
                        typePassed = propTypeUnwrapped;
                        return(Expression.Equal(Expression.Constant(marker1), Expression.Constant(marker1)));
                    }) }
            };

            var filter = new FilterTreeNode(
                new GridFilter()
            {
                PropName    = "A",
                StringValue = "0",
                Operator    = marker2
            },
                operatorToExpressionConvertersOverrides: additionalOperatorToExpressionConverters);

            var query  = filter.WrapFilter(Collection);
            var result = query.ToArray();

            var expectation = "Linq.GridQuery.Test.TestSubject[].Where(par => (\"MARKER1\" == \"MARKER1\"))";

            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(wasCalled, Is.EqualTo(true));
            Assert.That(typePassed, Is.EqualTo(typeof(Int32)));
            Assert.That(result, Is.EquivalentTo(Collection));
        }
コード例 #10
0
        public void ValueDeserializationFunctionOverrideCanBeSet()
        {
            var    marker1     = "MARKER1";
            string valCapture  = null;
            Type   typeCapture = null;

            Config.DefaultValueDeserialiationFunction = (val, type) =>
            {
                throw new InvalidOperationException("This should not be called.");
            };

            Func <string, Type, object> actuallyUsedFunc = (val, type) =>
            {
                valCapture  = val;
                typeCapture = type;
                return(5);
            };

            var filter = new FilterTreeNode(
                new GridFilter()
            {
                PropName    = "A",
                StringValue = marker1,
                Operator    = "eq"
            },
                actuallyUsedFunc);

            var query  = filter.WrapFilter(Collection);
            var result = query.ToArray();

            var expectation = "Linq.GridQuery.Test.TestSubject[].Where(par => (par.A == 5))";

            Assert.That(filter.ValueDeserializationFunctionOverride, Is.EqualTo(actuallyUsedFunc));
            Assert.That(valCapture, Is.EqualTo(marker1));
            Assert.That(typeCapture, Is.EqualTo(typeof(int)));
            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(query.Count, Is.EqualTo(1));
            Assert.That(query.Single().A, Is.EqualTo(5));
        }
コード例 #11
0
        public void ThreeBranchesQueryWorks()
        {
            var filter = new FilterTreeNode(
                new FilterTreeNode(
                    new FilterTreeNode(
                        new GridFilter()
            {
                PropName    = "A",
                StringValue = "2",
                Operator    = "gt"
            }),
                    LogicalOpertor.AND,
                    new FilterTreeNode(
                        new GridFilter()
            {
                PropName    = "A",
                StringValue = "4",
                Operator    = "lt"
            })
                    ),
                LogicalOpertor.OR,
                new FilterTreeNode(
                    new GridFilter()
            {
                PropName    = "A",
                StringValue = "5",
                Operator    = "eq"
            }));

            var query  = filter.WrapFilter(Collection);
            var result = query.ToArray();

            var expectation = "Linq.GridQuery.Test.TestSubject[].Where(par => (((par.A > 2) And (par.A < 4)) Or (par.A == 5)))";

            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(query.Count, Is.EqualTo(2));
            Assert.That(query.ElementAt(0).A, Is.EqualTo(3));
            Assert.That(query.ElementAt(1).A, Is.EqualTo(5));
        }
コード例 #12
0
        public void AdditionalOperatorToExpressionConvertersCanBeSetForRootOfTreeAndFunctionOfEachBranchFlowsDowntreeForNodesWithoutTheirOwn()
        {
            var marker2 = "MARKER2";
            var marker3 = "MARKER3";

            Type typePassed = null;

            var additionalOperatorToExpressionConverters1 =
                new Dictionary <string, OperatorHandler>()
            {
                { marker3, new OperatorHandler((propTypeUnwrapped, propTypeRaw, left, right) =>
                    {
                        typePassed = propTypeUnwrapped;
                        return(Expression.Equal(Expression.Constant(marker3), Expression.Constant(marker3)));
                    }) },
                {
                    marker2, new OperatorHandler((propTypeUnwrapped, propTypeRaw, left, right) =>
                    {
                        throw new Exception("This should never be called.");
                    })
                }
            };

            var additionalOperatorToExpressionConverters2 =
                new Dictionary <string, OperatorHandler>()
            {
                { marker2, new OperatorHandler((propTypeUnwrapped, propTypeRaw, left, right) =>
                    {
                        typePassed = propTypeUnwrapped;
                        return(Expression.Equal(Expression.Constant(marker2), Expression.Constant(marker2)));
                    }) }
            };

            var branchWithOwnFunction = new FilterTreeNode(
                new FilterTreeNode(
                    new GridFilter()
            {
                PropName    = "A",
                StringValue = "1",
                Operator    = "eq"
            }),
                LogicalOpertor.OR,
                new FilterTreeNode(
                    new GridFilter()
            {
                PropName    = "A",
                StringValue = "0",
                Operator    = marker2
            }),
                operatorToExpressionConvertersOverrides: additionalOperatorToExpressionConverters2);

            var branchWithoutOwnFunction = new FilterTreeNode(
                new FilterTreeNode(
                    new GridFilter()
            {
                PropName    = "A",
                StringValue = "2",
                Operator    = "eq"
            }),
                LogicalOpertor.OR,
                new FilterTreeNode(
                    new GridFilter()
            {
                PropName    = "A",
                StringValue = "0",
                Operator    = marker3
            }));

            var filter = new FilterTreeNode(
                branchWithOwnFunction,
                LogicalOpertor.OR,
                branchWithoutOwnFunction,
                operatorToExpressionConvertersOverrides: additionalOperatorToExpressionConverters1);

            var query  = filter.WrapFilter(Collection);
            var result = query.ToArray();

            var expectation = "Linq.GridQuery.Test.TestSubject[].Where(par => (((par.A == 1) Or (\"MARKER2\" == \"MARKER2\")) Or ((par.A == 2) Or (\"MARKER3\" == \"MARKER3\"))))";

            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(query.Count, Is.EqualTo(3));
            Assert.That(query.ElementAt(0).A, Is.EqualTo(1));
            Assert.That(query.ElementAt(1).A, Is.EqualTo(3));
            Assert.That(query.ElementAt(2).A, Is.EqualTo(5));
        }
コード例 #13
0
        public void ValueDeserializationFunctionCanBeSetForRootOfTreeAndFunctionOfEachBranchFlowsDowntreeForNodesWithoutTheirOwn()
        {
            var marker1     = "MARKER1";
            var marker2     = "MARKER2";
            var valCapture  = new List <string>();
            var typeCapture = new List <Type>();

            Config.DefaultValueDeserialiationFunction = (val, type) =>
            {
                throw new InvalidOperationException("This should not be called.");
            };

            Func <string, Type, object> deserializationFunc1 = (val, type) =>
            {
                valCapture.Add(val);
                typeCapture.Add(type);
                return(val == marker1 ? 3 :
                       val == marker2 ? 5 :
                       0);
            };

            Func <string, Type, object> deserializationFunc2 = (val, type) =>
            {
                return(JsonConvert.DeserializeObject(val, type));
            };

            var branchWithOwnFunction = new FilterTreeNode(
                new FilterTreeNode(
                    new GridFilter()
            {
                PropName    = "A",
                StringValue = marker1,
                Operator    = "eq"
            }),
                LogicalOpertor.OR,
                new FilterTreeNode(
                    new GridFilter()
            {
                PropName    = "A",
                StringValue = marker2,
                Operator    = "eq"
            }),
                deserializationFunc1);

            var branchWithoutOwnFunction = new FilterTreeNode(
                new FilterTreeNode(
                    new GridFilter()
            {
                PropName    = "A",
                StringValue = "2",
                Operator    = "eq"
            }),
                LogicalOpertor.OR,
                new FilterTreeNode(
                    new GridFilter()
            {
                PropName    = "A",
                StringValue = "4",
                Operator    = "eq"
            }));

            var filter = new FilterTreeNode(
                branchWithOwnFunction,
                LogicalOpertor.OR,
                branchWithoutOwnFunction,
                deserializationFunc2);

            var query  = filter.WrapFilter(Collection);
            var result = query.ToArray();

            var expectation = "Linq.GridQuery.Test.TestSubject[].Where(par => (((par.A == 3) Or (par.A == 5)) Or ((par.A == 2) Or (par.A == 4))))";

            Assert.That(filter.ValueDeserializationFunctionOverride, Is.EqualTo(deserializationFunc2));
            Assert.That(valCapture, Is.EquivalentTo(new[] { marker1, marker2 }));
            Assert.That(typeCapture, Is.EquivalentTo(new[] { typeof(int), typeof(int) }));
            Assert.That(query.ToString(), Is.EqualTo(expectation));
            Assert.That(query.Count, Is.EqualTo(2));
            Assert.That(query.ElementAt(0).A, Is.EqualTo(3));
            Assert.That(query.ElementAt(1).A, Is.EqualTo(5));
        }