public async Task Create_StringNotEndsWith_Expression()
        {
            // arrange
            var value = new ObjectValueNode(
                new ObjectFieldNode("bar_not_ends_with",
                                    new StringValueNode("a")));

            var fooType = await CreateTypeAsync(new FooFilterType());

            // act
            var filter = new QueryableFilterVisitor(
                fooType,
                typeof(Foo),
                TypeConversion.Default);

            value.Accept(filter);
            Func <Foo, bool> func = filter.CreateFilter <Foo>().Compile();

            // assert
            var a = new Foo {
                Bar = "ab"
            };

            Assert.True(func(a));

            var b = new Foo {
                Bar = "ba"
            };

            Assert.False(func(b));
        }
예제 #2
0
        public void Create_ShortIn_Expression()
        {
            // arrange
            var value = new ObjectValueNode(
                new ObjectFieldNode("barShort_in",
                                    new ListValueNode(new[]
            {
                new IntValueNode(13),
                new IntValueNode(14)
            }))
                );

            var fooType = CreateType(new FooFilterType());

            // act
            var filter = new QueryableFilterVisitor(
                fooType, typeof(Foo), TypeConversion.Default, true);

            filter.Visit(value, null);
            Func <Foo, bool> func = filter.CreateFilter <Foo>().Compile();

            // assert
            var a = new Foo {
                BarShort = 13
            };

            Assert.True(func(a));

            var b = new Foo {
                BarShort = 12
            };

            Assert.False(func(b));
        }
        public void Create_StringContains_Expression()
        {
            // arrange
            var value = new ObjectValueNode(
                new ObjectFieldNode("bar_contains",
                                    new StringValueNode("a")));

            FooFilterType fooType = CreateType(new FooFilterType());

            // act
            var filter = new QueryableFilterVisitor(
                fooType,
                typeof(Foo),
                TypeConversion.Default,
                true);

            value.Accept(filter);
            Func <Foo, bool> func = filter.CreateFilter <Foo>().Compile();

            // assert
            var a = new Foo {
                Bar = "testatest"
            };

            Assert.True(func(a));

            var b = new Foo {
                Bar = "testbtest"
            };

            Assert.False(func(b));
        }
        public void Create_BooleanNotEqual_Expression()
        {
            // arrange
            var value = new ObjectValueNode(
                new ObjectFieldNode("bar",
                                    new BooleanValueNode(false)));

            var fooType = CreateType(new FooFilterType());

            // act
            var filter = new QueryableFilterVisitor(
                fooType, typeof(Foo), TypeConversion.Default);

            value.Accept(filter);
            Func <Foo, bool> func = filter.CreateFilter <Foo>().Compile();

            // assert
            var a = new Foo {
                Bar = false
            };

            Assert.True(func(a));

            var b = new Foo {
                Bar = true
            };

            Assert.False(func(b));
        }
예제 #5
0
        public void Create_ShortGreaterThan_Expression()
        {
            // arrange
            var value = new ObjectValueNode(
                new ObjectFieldNode("barShort_gt",
                                    new IntValueNode(12)));

            var fooType = CreateType(new FooFilterType());

            // act
            var filter = new QueryableFilterVisitor(
                fooType, typeof(Foo), TypeConversion.Default);

            value.Accept(filter);
            Func <Foo, bool> func = filter.CreateFilter <Foo>().Compile();

            // assert
            var a = new Foo {
                BarShort = 11
            };

            Assert.False(func(a));

            var b = new Foo {
                BarShort = 12
            };

            Assert.False(func(b));

            var c = new Foo {
                BarShort = 13
            };

            Assert.True(func(c));
        }
예제 #6
0
        public void Create_StringIn_Expression()
        {
            // arrange
            var value = new ObjectValueNode(
                new ObjectFieldNode("bar_in",
                                    new ListValueNode(new[]
            {
                new StringValueNode("a"),
                new StringValueNode("c")
            })));

            var fooType = CreateType(new FooFilterType());

            // act
            var filter = new QueryableFilterVisitor(
                fooType,
                typeof(Foo),
                TypeConversion.Default);

            value.Accept(filter);
            Func <Foo, bool> func = filter.CreateFilter <Foo>().Compile();

            // assert
            var a = new Foo {
                Bar = "a"
            };

            Assert.True(func(a));

            var b = new Foo {
                Bar = "b"
            };

            Assert.False(func(b));
        }
예제 #7
0
        public async Task Create_ShortNotIn_Expression()
        {
            // arrange
            var value = new ObjectValueNode(
                new ObjectFieldNode("barShort_not_in",
                                    new ListValueNode(new[] { new IntValueNode(13), new IntValueNode(14) }
                                                      ))
                );

            var fooType = await CreateTypeAsync(new FooFilterType());

            // act
            var filter = new QueryableFilterVisitor(fooType, typeof(Foo), TypeConversion.Default);

            value.Accept(filter);
            Func <Foo, bool> func = filter.CreateFilter <Foo>().Compile();

            // assert
            var a = new Foo {
                BarShort = 12
            };

            Assert.True(func(a));

            var b = new Foo {
                BarShort = 13
            };

            Assert.False(func(b));
        }
예제 #8
0
        public void Create_NullableBooleanNotEqual_Expression()
        {
            // arrange
            var value = new ObjectValueNode(
                new ObjectFieldNode("bar",
                                    new BooleanValueNode(false)));

            var fooNullableType = CreateType(new FooNullableFilterType());

            // act
            var filter = new QueryableFilterVisitor(
                fooNullableType, typeof(FooNullable), TypeConversion.Default, true);

            filter.Visit(value, null);
            Func <FooNullable, bool> func = filter.CreateFilter <FooNullable>().Compile();

            // assert
            var a = new FooNullable {
                Bar = false
            };

            Assert.True(func(a));

            var b = new FooNullable {
                Bar = true
            };

            Assert.False(func(b));

            var c = new FooNullable {
                Bar = null
            };

            Assert.False(func(c));
        }
        public void Create_NullableShortNotEqual_Expression()
        {
            // arrange
            var value = new ObjectValueNode(
                new ObjectFieldNode("barShort_not",
                                    new IntValueNode(12)));

            var fooNullableType = CreateType(new FooNullableFilterType());

            // act
            var filter = new QueryableFilterVisitor(
                fooNullableType, typeof(FooNullable), TypeConversion.Default, true);

            value.Accept(filter);
            Func <FooNullable, bool> func = filter.CreateFilter <FooNullable>().Compile();

            // assert
            var a = new FooNullable {
                BarShort = 13
            };

            Assert.True(func(a));

            var b = new FooNullable {
                BarShort = 12
            };

            Assert.False(func(b));

            var c = new FooNullable {
                BarShort = null
            };

            Assert.True(func(c));
        }
예제 #10
0
        public async Task Create_NullableBooleanEqual_Expression()
        {
            // arrange
            var value = new ObjectValueNode(
                new ObjectFieldNode("bar",
                                    new BooleanValueNode(true)));

            var fooNullableType = await CreateTypeAsync(new FooNullableFilterType());

            // act
            var filter = new QueryableFilterVisitor(
                fooNullableType, typeof(FooNullable), TypeConversion.Default);

            value.Accept(filter);
            Func <FooNullable, bool> func = filter.CreateFilter <FooNullable>().Compile();

            // assert
            var a = new FooNullable {
                Bar = true
            };

            Assert.True(func(a));

            var b = new FooNullable {
                Bar = false
            };

            Assert.False(func(b));

            var c = new FooNullable {
                Bar = null
            };

            Assert.False(func(c));
        }
        public void Create_StringNotEqual_Expression()
        {
            // arrange
            var value = new ObjectValueNode(
                new ObjectFieldNode("bar_not",
                                    new StringValueNode("a")));

            FooFilterType fooType = CreateType(new FooFilterType());

            // act
            var filter = new QueryableFilterVisitor(
                fooType,
                typeof(Foo),
                TypeConversion.Default,
                true);

            filter.Visit(value, null);
            Func <Foo, bool> func = filter.CreateFilter <Foo>().Compile();

            // assert
            var a = new Foo {
                Bar = "a"
            };

            Assert.False(func(a));

            var b = new Foo {
                Bar = "b"
            };

            Assert.True(func(b));
        }
예제 #12
0
        public void Create_ArraySomeObjectStringEqualWithNull_Expression()
        {
            // arrange
            var value = new ObjectValueNode(
                new ObjectFieldNode("fooNested_some",
                                    new ObjectValueNode(
                                        new ObjectFieldNode("bar",
                                                            new StringValueNode("a")
                                                            )
                                        )
                                    )
                );

            FooFilterType fooType = CreateType(new FooFilterType());

            // act
            var filter = new QueryableFilterVisitor(
                fooType,
                typeof(Foo),
                TypeConversion.Default,
                true);

            filter.Visit(value, null);
            Func <Foo, bool> func = filter.CreateFilter <Foo>().Compile();

            // assert
            var a = new Foo
            {
                FooNested = new[]
                {
                    new FooNested {
                        Bar = "c"
                    },
                    null,
                    new FooNested {
                        Bar = "a"
                    }
                }
            };

            Assert.True(func(a));

            var b = new Foo
            {
                FooNested = new[]
                {
                    new FooNested {
                        Bar = "c"
                    },
                    null,
                    new FooNested {
                        Bar = "b"
                    }
                }
            };

            Assert.False(func(b));
        }
예제 #13
0
        public void Create_ArrayAnyObjectStringEqual_Expression()
        {
            // arrange
            var value = new ObjectValueNode(
                new ObjectFieldNode("fooNested_any",
                                    new BooleanValueNode(true)
                                    )
                );

            FooFilterType fooType = CreateType(new FooFilterType());

            // act
            var filter = new QueryableFilterVisitor(
                fooType,
                typeof(Foo),
                TypeConversion.Default,
                true);

            filter.Visit(value, null);
            Func <Foo, bool> func = filter.CreateFilter <Foo>().Compile();

            // assert
            var a = new Foo
            {
                FooNested = new[]
                {
                    new FooNested {
                        Bar = "c"
                    },
                    new FooNested {
                        Bar = "d"
                    },
                    new FooNested {
                        Bar = "a"
                    }
                }
            };

            Assert.True(func(a));

            var b = new Foo {
                FooNested = new FooNested[] { }
            };

            Assert.False(func(b));
            var c = new Foo {
                FooNested = null
            };

            Assert.False(func(c));
            var d = new Foo {
                FooNested = new FooNested[] { null }
            };

            Assert.True(func(d));
        }
예제 #14
0
        public async Task InvokeAsync(IMiddlewareContext context)
        {
            await _next(context).ConfigureAwait(false);

            var filter = context.Argument <IValueNode>("where");

            if (filter is null || filter is NullValueNode)
            {
                return;
            }

            IQueryable <T> source = null;

            if (context.Result is PageableData <T> p)
            {
                source = p.Source;
            }
            else
            {
                p = null;
            }

            if (context.Result is IQueryable <T> q)
            {
                source = q;
            }
            else if (context.Result is IEnumerable <T> e)
            {
                source = e.AsQueryable();
            }

            if (source != null &&
                context.Field.Arguments["where"].Type is InputObjectType iot &&
                iot is IFilterInputType fit)
            {
                var visitor = new QueryableFilterVisitor(
                    iot,
                    fit.EntityType,
                    _converter);
                filter.Accept(visitor);

                if (source is EnumerableQuery)
                {
                    source = source.Where(visitor.CreateFilterInMemory <T>());
                }
                else
                {
                    source = source.Where(visitor.CreateFilter <T>());
                }

                context.Result = p is null
                    ? (object)source
                    : new PageableData <T>(source, p.Properties);
            }
        }
        public void Create_ObjectStringEqualRecursive_Expression()
        {
            // arrange
            var value = new ObjectValueNode(
                new ObjectFieldNode("nested",
                                    new ObjectValueNode(
                                        new ObjectFieldNode("nested",
                                                            new ObjectValueNode(
                                                                new ObjectFieldNode("bar",
                                                                                    new StringValueNode("a")
                                                                                    )
                                                                )
                                                            )
                                        )
                                    )
                );

            var fooType = CreateType(new FilterInputType <Recursive>());

            // act
            var filter = new QueryableFilterVisitor(
                fooType,
                typeof(Recursive),
                TypeConversion.Default,
                true);

            filter.Visit(value, null);
            Func <Recursive, bool> func = filter.CreateFilter <Recursive>().Compile();


            var a = new Recursive {
                Nested = new Recursive {
                    Nested = new Recursive {
                        Bar = "a"
                    }
                }
            };

            Assert.True(func(a));

            var b = new Recursive {
                Nested = new Recursive {
                    Nested = new Recursive {
                        Bar = "b"
                    }
                }
            };

            Assert.False(func(b));
        }
        public void Create_ObjectStringEqualDeep_Expression()
        {
            // arrange
            var value = new ObjectValueNode(
                new ObjectFieldNode("foo",
                                    new ObjectValueNode(
                                        new ObjectFieldNode("fooNested",
                                                            new ObjectValueNode(
                                                                new ObjectFieldNode("bar",
                                                                                    new StringValueNode("a")
                                                                                    )
                                                                )
                                                            )
                                        )
                                    )
                );

            var fooType = CreateType(new EvenDeeperFilterType());

            // act
            var filter = new QueryableFilterVisitor(
                fooType,
                typeof(EvenDeeper),
                TypeConversion.Default,
                true);

            filter.Visit(value, null);
            Func <EvenDeeper, bool> func = filter.CreateFilter <EvenDeeper>().Compile();

            // assert
            var a = new EvenDeeper {
                Foo = new Foo {
                    FooNested = new FooNested {
                        Bar = "a"
                    }
                }
            };

            Assert.True(func(a));

            var b = new EvenDeeper {
                Foo = new Foo {
                    FooNested = new FooNested {
                        Bar = "b"
                    }
                }
            };

            Assert.False(func(b));
        }
예제 #17
0
        public void Create_ArraySomeStringEqualWithNull_Expression()
        {
            // arrange
            var value = new ObjectValueNode(
                new ObjectFieldNode("bar_some",
                                    new ObjectValueNode(
                                        new ObjectFieldNode("element",
                                                            new StringValueNode("a")
                                                            )
                                        )
                                    )
                );

            FooSimpleFilterType fooType = CreateType(new FooSimpleFilterType());

            // act
            var filter = new QueryableFilterVisitor(
                fooType,
                typeof(FooSimple),
                TypeConversion.Default,
                true);

            filter.Visit(value, null);
            Func <FooSimple, bool> func = filter.CreateFilter <FooSimple>().Compile();

            // assert
            var a = new FooSimple {
                Bar = new[] { "c", null, "a" }
            };

            Assert.True(func(a));

            var b = new FooSimple {
                Bar = new[] { "c", null, "b" }
            };

            Assert.False(func(b));

            var c = new FooSimple {
                Bar = null
            };

            Assert.False(func(c));
        }
예제 #18
0
        public async Task Create_NullableShortLowerThanOrEquals_Expression()
        {
            // arrange
            var value = new ObjectValueNode(
                new ObjectFieldNode("barShort_lte",
                                    new IntValueNode(12)));

            var fooNullableType = await CreateTypeAsync(new FooNullableFilterType());

            // act
            var filter = new QueryableFilterVisitor(
                fooNullableType, typeof(FooNullable), TypeConversion.Default);

            value.Accept(filter);
            Func <FooNullable, bool> func = filter.CreateFilter <FooNullable>().Compile();

            // assert
            var a = new FooNullable {
                BarShort = 11
            };

            Assert.True(func(a));

            var b = new FooNullable {
                BarShort = 12
            };

            Assert.True(func(b));

            var c = new FooNullable {
                BarShort = 13
            };

            Assert.False(func(c));

            var d = new FooNullable {
                BarShort = null
            };

            Assert.False(func(d));
        }
예제 #19
0
        public void Create_ArrayAnyStringEqual_Expression()
        {
            // arrange
            var value = new ObjectValueNode(
                new ObjectFieldNode("bar_any",
                                    new BooleanValueNode(true)
                                    )
                );

            var fooType = CreateType(new FooSimpleFilterType());

            // act
            var filter = new QueryableFilterVisitor(
                fooType,
                typeof(FooSimple),
                TypeConversion.Default,
                true);

            value.Accept(filter);
            Func <FooSimple, bool> func = filter.CreateFilter <FooSimple>().Compile();

            // assert
            var a = new FooSimple {
                Bar = new[] { "c", "d", "a" }
            };

            Assert.True(func(a));

            var b = new FooSimple {
                Bar = new string[0]
            };

            Assert.False(func(b));

            var c = new FooSimple {
                Bar = null
            };

            Assert.False(func(c));
        }
예제 #20
0
        public void Create_ObjectStringEqualWithNull_Expression()
        {
            // arrange
            var value = new ObjectValueNode(
                new ObjectFieldNode("fooNested",
                                    new ObjectValueNode(
                                        new ObjectFieldNode("bar",
                                                            new StringValueNode("a")
                                                            )
                                        )
                                    )
                );

            var fooType = CreateType(new FooFilterType());

            // act
            var filter = new QueryableFilterVisitor(
                fooType,
                typeof(Foo),
                TypeConversion.Default);

            value.Accept(filter);
            Func <Foo, bool> func = filter.CreateFilterInMemory <Foo>().Compile();

            // assert
            var a = new Foo {
                FooNested = new FooNested {
                    Bar = "a"
                }
            };

            Assert.True(func(a));

            Foo b = null;

            Assert.False(func(b));
        }
        public async Task InvokeAsync(IMiddlewareContext context)
        {
            await _next(context).ConfigureAwait(false);

            IValueNode filter = context.ArgumentLiteral <IValueNode>("where");

            if (filter is null || filter is NullValueNode)
            {
                return;
            }

            IQueryable <T> source = null;

            if (context.Result is IQueryable <T> q)
            {
                source = q;
            }
            else if (context.Result is IEnumerable <T> e)
            {
                source = e.AsQueryable();
            }

            if (source != null &&
                context.Field.Arguments["where"].Type is InputObjectType iot &&
                iot is IFilterInputType fit)
            {
                var visitor = new QueryableFilterVisitor(
                    iot,
                    fit.EntityType,
                    _converter);
                filter.Accept(visitor);

                source         = source.Where(visitor.CreateFilter <T>());
                context.Result = source;
            }
        }
        public void Create_ObjectStringEqualNullWithMultipleFilters_Expression()
        {
            // arrange
            var value = new ObjectValueNode(
                new ObjectFieldNode("foo",
                                    new ObjectValueNode(
                                        new ObjectFieldNode("fooNested",
                                                            new ObjectValueNode(
                                                                new ObjectFieldNode("bar",
                                                                                    new StringValueNode("a")
                                                                                    ),

                                                                new ObjectFieldNode("bar_not",
                                                                                    new StringValueNode("c")
                                                                                    )
                                                                )
                                                            )
                                        )
                                    )
                );

            var fooType = CreateType(new EvenDeeperFilterType());

            // act
            var filter = new QueryableFilterVisitor(
                fooType,
                typeof(EvenDeeper),
                TypeConversion.Default);

            value.Accept(filter);
            Func <EvenDeeper, bool> func = filter.CreateFilter <EvenDeeper>().Compile();

            // assert
            var a = new EvenDeeper {
                Foo = null
            };

            Assert.False(func(a));

            var b = new EvenDeeper {
                Foo = new Foo {
                    FooNested = null
                }
            };

            Assert.False(func(b));

            var c = new EvenDeeper {
                Foo = new Foo {
                    FooNested = new FooNested {
                        Bar = null
                    }
                }
            };

            Assert.False(func(c));

            var d = new EvenDeeper {
                Foo = new Foo {
                    FooNested = new FooNested {
                        Bar = "a"
                    }
                }
            };

            Assert.True(func(d));
        }
예제 #23
0
        public void Create_ArrayAllObjectStringEqual_Expression()
        {
            // arrange
            var value = new ObjectValueNode(
                new ObjectFieldNode("fooNested_all",
                                    new ObjectValueNode(
                                        new ObjectFieldNode("bar",
                                                            new StringValueNode("a")
                                                            )
                                        )
                                    )
                );

            var fooType = CreateType(new FooFilterType());

            // act
            var filter = new QueryableFilterVisitor(
                fooType,
                typeof(Foo),
                TypeConversion.Default,
                true);

            value.Accept(filter);
            Func <Foo, bool> func = filter.CreateFilter <Foo>().Compile();

            // assert
            var a = new Foo
            {
                FooNested = new[]
                {
                    new FooNested {
                        Bar = "a"
                    },
                    new FooNested {
                        Bar = "a"
                    },
                    new FooNested {
                        Bar = "a"
                    }
                }
            };

            Assert.True(func(a));

            var b = new Foo
            {
                FooNested = new[]
                {
                    new FooNested {
                        Bar = "c"
                    },
                    new FooNested {
                        Bar = "a"
                    },
                    new FooNested {
                        Bar = "a"
                    }
                }
            };

            Assert.False(func(b));

            var c = new Foo
            {
                FooNested = new[]
                {
                    new FooNested {
                        Bar = "a"
                    },
                    new FooNested {
                        Bar = "d"
                    },
                    new FooNested {
                        Bar = "b"
                    }
                }
            };

            Assert.False(func(c));

            var d = new Foo
            {
                FooNested = new[]
                {
                    new FooNested {
                        Bar = "c"
                    },
                    new FooNested {
                        Bar = "d"
                    },
                    new FooNested {
                        Bar = "b"
                    }
                }
            };

            Assert.False(func(d));

            var e = new Foo
            {
                FooNested = new[]
                {
                    null,
                    new FooNested {
                        Bar = null
                    },
                    new FooNested {
                        Bar = "d"
                    },
                    new FooNested {
                        Bar = "b"
                    }
                }
            };

            Assert.False(func(e));
        }