Exemplo n.º 1
0
        // KnownFunctions

        private static Func <IDocumentFilterBuilder, object> NotInvocation(FuncFilterQuerySyntaxVisitor visitor, InvocationQuerySyntaxNode node)
        {
            // not(condition) --> f.Not(condition)
            var condition = visitor.Visit(node.Arguments[0]);

            return(f => f.Not(condition(f)));
        }
Exemplo n.º 2
0
        public static Func <IDocumentFilterBuilder, object> CreateFilterExpression(InvocationQuerySyntaxNode node)
        {
            var visitor    = new FuncFilterQuerySyntaxVisitor();
            var filterBody = visitor.Visit(node);

            return(filterBody);
        }
Exemplo n.º 3
0
        private static Func <IDocumentFilterBuilder, object> OrInvocation(FuncFilterQuerySyntaxVisitor visitor, InvocationQuerySyntaxNode node)
        {
            // or(condition1, condition2, condition3, ...) --> f.Or(condition1, condition2, condition3, ...)
            var conditions = node.Arguments.Select(visitor.Visit);

            return(f => f.Or(conditions.Select(i => i(f))));
        }
Exemplo n.º 4
0
        private static Func <IDocumentFilterBuilder, object> DateInvocation(FuncFilterQuerySyntaxVisitor visitor, InvocationQuerySyntaxNode node)
        {
            // date('value') --> DateTime.Parse('value')
            var dateTimeString = node.Arguments[0].AsStringLiteral();
            var dateTime       = DateTime.Parse(dateTimeString);

            return(f => dateTime);
        }
Exemplo n.º 5
0
        private static Func <IDocumentFilterBuilder, object> TypeInvocation(FuncFilterQuerySyntaxVisitor visitor, InvocationQuerySyntaxNode node)
        {
            // type(property, value) --> f.Type("property", value)
            var property = node.Arguments[0].AsIdentifierName();
            var value    = node.Arguments[1].AsEnumIdentifier <DataType>();

            return(f => f.Type(property, value));
        }
Exemplo n.º 6
0
        private static Func <IDocumentFilterBuilder, object> MatchInvocation(FuncFilterQuerySyntaxVisitor visitor, InvocationQuerySyntaxNode node)
        {
            // match(arrayProperty, filter) --> f.Match("arrayProperty", filter(f))
            var arrayProperty = node.Arguments[0].AsIdentifierName();
            var filter        = visitor.Visit(node.Arguments[1]);

            return(f => f.Match(arrayProperty, filter(f)));
        }
Exemplo n.º 7
0
        private static Func <IDocumentFilterBuilder, object> LteInvocation(FuncFilterQuerySyntaxVisitor visitor, InvocationQuerySyntaxNode node)
        {
            // lte(property, value) --> f.Lte("property", value)
            var property = node.Arguments[0].AsIdentifierName();
            var value    = visitor.Visit(node.Arguments[1]);

            return(f => f.Lte(property, value(f)));
        }
Exemplo n.º 8
0
        private static Func <IDocumentFilterBuilder, object> NotInInvocation(FuncFilterQuerySyntaxVisitor visitor, InvocationQuerySyntaxNode node)
        {
            // notIn(property, value1, value2, value3, ...) --> f.NotIn("property", new[] { value1, value2, value3, ... })
            var property = node.Arguments[0].AsIdentifierName();
            var values   = node.Arguments.Skip(1).Select(visitor.Visit);

            return(f => f.NotIn(property, values.Select(i => i(f))));
        }
Exemplo n.º 9
0
        private static Func <IDocumentFilterBuilder, object> TextInvocation(FuncFilterQuerySyntaxVisitor visitor, InvocationQuerySyntaxNode node)
        {
            // text('search', 'language', caseSensitive, diacriticSensitive) --> f.Text("search", "language", caseSensitive, diacriticSensitive)
            var search             = node.Arguments[0].AsStringLiteral();
            var language           = (node.Arguments.Count > 1) ? node.Arguments[1].AsStringLiteral() : null;
            var caseSensitive      = (node.Arguments.Count > 2) && node.Arguments[2].AsBooleanLiteral();
            var diacriticSensitive = (node.Arguments.Count > 3) && node.Arguments[3].AsBooleanLiteral();

            return(f => f.Text(search, language, caseSensitive, diacriticSensitive));
        }
Exemplo n.º 10
0
        private static Func <IDocumentFilterBuilder, object> RegexInvocation(FuncFilterQuerySyntaxVisitor visitor, InvocationQuerySyntaxNode node)
        {
            // regex(property, pattern, 'option1', 'option2', 'option3', ...) --> f.Regex("property", new Regex("pattern", option1 | option2 | option3 | ...))
            var property = node.Arguments[0].AsIdentifierName();
            var pattern  = node.Arguments[1].AsStringLiteral();
            var options  = node.Arguments.Skip(2).Aggregate(RegexOptions.None, (r, n) => r | n.AsEnumIdentifier <RegexOptions>());
            var regex    = new Regex(pattern, options);

            return(f => f.Regex(property, regex));
        }
Exemplo n.º 11
0
        private static Func <IDocumentFilterBuilder, object> ExistsInvocation(FuncFilterQuerySyntaxVisitor visitor, InvocationQuerySyntaxNode node)
        {
            // exists(property) --> f.Exists("property", true)
            // exists(property, true) --> f.Exists("property", true)
            // exists(property, false) --> f.Exists("property", false)
            var property = node.Arguments[0].AsIdentifierName();
            var exists   = (node.Arguments.Count < 2 || node.Arguments[1].AsBooleanLiteral());

            return(f => f.Exists(property, exists));
        }
        private Func <IDocumentFilterBuilder, object> BuildFilter(IHttpRequest request, string documentIdKey)
        {
            var filterMethod = ParseFilter(request, documentIdKey);

            if (filterMethod != null)
            {
                return(FuncFilterQuerySyntaxVisitor.CreateFilterExpression(filterMethod));
            }

            return(null);
        }
Exemplo n.º 13
0
 private static Func <IDocumentFilterBuilder, object> SizeLteInvocation(FuncFilterQuerySyntaxVisitor visitor, InvocationQuerySyntaxNode node)
 {
     // sizeLte(arrayProperty, item) --> f.SizeLte("arrayProperty", value)
     return(CreateSizeFilterForArrayProperty(visitor, node, (f, p, i) => f.SizeLte(p, i)));
 }
Exemplo n.º 14
0
 private static Func <IDocumentFilterBuilder, object> AnyNotInInvocation(FuncFilterQuerySyntaxVisitor visitor, InvocationQuerySyntaxNode node)
 {
     // anyNotIn(arrayProperty, item1, item2, item3, ...) --> f.AnyNotIn("arrayProperty", new[] { item1, item2, item3, ... })
     return(CreateFilterForArrayProperty(visitor, node, (f, p, i) => f.AnyNotIn(p, i)));
 }
Exemplo n.º 15
0
        // Helpers

        private static Func <IDocumentFilterBuilder, object> CreateFilterForArrayProperty(FuncFilterQuerySyntaxVisitor visitor, InvocationQuerySyntaxNode node, Func <IDocumentFilterBuilder, string, IEnumerable <object>, object> filter)
        {
            // filter(arrayProperty, item1, item2, item3, ...) --> filter("arrayProperty", new[] { item1, item2, item3, ... })
            var arrayProperty = node.Arguments[0].AsIdentifierName();
            var items         = node.Arguments.Skip(1).Select(visitor.Visit);

            return(f => filter(f, arrayProperty, items.Select(i => i(f))));
        }
Exemplo n.º 16
0
 private static Func <IDocumentFilterBuilder, object> AnyLtInvocation(FuncFilterQuerySyntaxVisitor visitor, InvocationQuerySyntaxNode node)
 {
     // anyLt(arrayProperty, item) --> f.AnyLt("arrayProperty", item)
     return(CreateAnyFilterForArrayProperty(visitor, node, (f, p, i) => f.AnyLt(p, i)));
 }
Exemplo n.º 17
0
        private static Func <IDocumentFilterBuilder, object> CreateSizeFilterForArrayProperty(FuncFilterQuerySyntaxVisitor visitor, InvocationQuerySyntaxNode node, Func <IDocumentFilterBuilder, string, int, object> filter)
        {
            // filter(arrayProperty, value) --> filter("arrayProperty", value)
            var arrayProperty = node.Arguments[0].AsIdentifierName();
            var value         = visitor.Visit(node.Arguments[1]);

            return(f => filter(f, arrayProperty, (int)value(f)));
        }