Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        public void ItShouldParseSimpleQuery()
        {
            var c = GetContext("(PartitionKey eq 'test')");

            var resultNode = new QueryFilterVisitor().Visit(c);

            resultNode.Should().BeOfType(typeof(InfixExpressionNode));
        }
Exemplo n.º 3
0
        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)));
        }
Exemplo n.º 5
0
 public void ItShouldParseWhenPK_IsEmail()
 {
     var c       = GetContext("(PartitionKey eq '*****@*****.**') and(IsDoNotDisturb eq true)");
     var visitor = new QueryFilterVisitor().Visit(c);
 }
Exemplo n.º 6
0
 public void ItShouldParseNormalQuery()
 {
     var c       = GetContext("(PartitionKey eq 'test') and (IsDoNotDisturb eq true)");
     var visitor = new QueryFilterVisitor().Visit(c);
 }
Exemplo n.º 7
0
 public void ItShouldParseComplexQuery()
 {
     var c       = GetContext("((PartitionKey eq 'test') and (IsDoNotDisturb eq true)) and (PartitionKey eq 'random')");
     var visitor = new QueryFilterVisitor().Visit(c);
 }
Exemplo n.º 8
0
        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;
        }