// 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))); }
public static Func <IDocumentFilterBuilder, object> CreateFilterExpression(InvocationQuerySyntaxNode node) { var visitor = new FuncFilterQuerySyntaxVisitor(); var filterBody = visitor.Visit(node); return(filterBody); }
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)))); }
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); }
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)); }
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))); }
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))); }
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)))); }
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)); }
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)); }
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); }
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))); }
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))); }
// 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)))); }
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))); }
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))); }