/// <summary> /// Applies term filters to an <see cref="IQuery{T}"/> /// </summary> public async ValueTask <IQuery <T> > ExecuteAsync(QueryExecutionContext <T> context) { var visitor = new QueryFilterVisitor <T>(); foreach (var term in _terms.Values) { // TODO optimize value task. await VisitTerm(TermOptions, context, visitor, term); } // Execute always run terms. These are not added to the terms list. foreach (var termOption in TermOptions) { if (!termOption.Value.AlwaysRun) { continue; } if (!_terms.ContainsKey(termOption.Key)) { var alwaysRunNode = new NamedTermNode(termOption.Key, new UnaryNode(String.Empty, OperateNodeQuotes.None)); await VisitTerm(TermOptions, context, visitor, alwaysRunNode); } } return(context.Item); }
public void ItShouldParseSimpleQuery() { var c = GetContext("(PartitionKey eq 'test')"); var resultNode = new QueryFilterVisitor().Visit(c); resultNode.Should().BeOfType(typeof(InfixExpressionNode)); }
public void ItShouldDoSimpleOps_OR() { var c = GetContext("(RowKey eq 'rowkey1') or (PartitionKey eq 'partitionkey1')"); var resultNode = new QueryFilterVisitor().Visit(c) as InfixExpressionNode; var astVisitor = new AstVisitor <MyEntity>(); var resultingTable = astVisitor.VisitInfix(resultNode, GetSimpleTable()); resultingTable.Should().ContainKeys("partitionkey1", "partitionkey2"); }
/// <summary> /// In memory implementation of <see cref="ExecuteQuerySegmentedAsync{T}(TableQuery{T}, TableContinuationToken)"/> /// </summary> public override Task <TableQuerySegment <T> > ExecuteQuerySegmentedAsync <T>(TableQuery <T> query, TableContinuationToken token) { var inputStream = new AntlrInputStream(query.FilterString); var lexer = new QueryFilterLexer(inputStream); var commonTokenStream = new CommonTokenStream(lexer); var parser = new QueryFilterParser(commonTokenStream); var queryContext = parser.query(); var resultNode = new QueryFilterVisitor().Visit(queryContext) as InfixExpressionNode; var astVisitor = new AstVisitor <T>(); var result = astVisitor.VisitInfix(resultNode, _table); var resultList = new List <T>(); foreach (var key in result.Keys) { resultList.AddRange(result[key].Select(kvp => kvp.Value).Cast <T>().ToList()); } var resultSegment = TableQueryFactory.Construct(resultList); return(Task.FromResult(TableQueryFactory.Construct(resultSegment))); }
public void ItShouldParseWhenPK_IsEmail() { var c = GetContext("(PartitionKey eq '*****@*****.**') and(IsDoNotDisturb eq true)"); var visitor = new QueryFilterVisitor().Visit(c); }
public void ItShouldParseNormalQuery() { var c = GetContext("(PartitionKey eq 'test') and (IsDoNotDisturb eq true)"); var visitor = new QueryFilterVisitor().Visit(c); }
public void ItShouldParseComplexQuery() { var c = GetContext("((PartitionKey eq 'test') and (IsDoNotDisturb eq true)) and (PartitionKey eq 'random')"); var visitor = new QueryFilterVisitor().Visit(c); }
private async static Task VisitTerm(IReadOnlyDictionary <string, QueryTermOption <T> > termOptions, QueryExecutionContext <T> context, QueryFilterVisitor <T> visitor, TermNode term) { context.CurrentTermOption = termOptions[term.TermName]; var termQuery = visitor.Visit(term, context); context.Item = await termQuery.Invoke(context.Item); context.CurrentTermOption = null; }