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 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)); }
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)); }
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_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_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)); }
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)); }
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)); }
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)); }
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)); }
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)); }
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)); }
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)); }
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)); }
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)); }
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)); }
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)); }
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)); }