public Task BuildAsync <T>(QueryBuilderContext <T> ctx) where T : class, new()
        {
            var searchQuery = ctx.GetSourceAs <ISearchQuery>();

            if (searchQuery == null)
            {
                return(Task.CompletedTask);
            }

            if (!String.IsNullOrEmpty(searchQuery.Filter))
            {
                var result = _parser.Parse(searchQuery.Filter);
                searchQuery.Filter = GenerateQueryVisitor.Run(AliasedQueryVisitor.Run(result, _aliasMap, ctx), ctx);

                ctx.Filter &= new QueryFilter {
                    Query = new QueryStringQuery {
                        Query           = searchQuery.Filter,
                        DefaultOperator = Operator.And,
                        AnalyzeWildcard = false
                    }.ToContainer()
                };
            }

            if (!String.IsNullOrEmpty(searchQuery.Criteria))
            {
                var result = _parser.Parse(searchQuery.Criteria);
                searchQuery.Criteria = GenerateQueryVisitor.Run(AliasedQueryVisitor.Run(result, _aliasMap, ctx), ctx);

                ctx.Query &= new QueryStringQuery {
                    Query           = searchQuery.Criteria,
                    DefaultOperator = searchQuery.DefaultCriteriaOperator == SearchOperator.Or ? Operator.Or : Operator.And,
                    AnalyzeWildcard = true
                };
            }

            if (!String.IsNullOrEmpty(searchQuery.Sort))
            {
                var result = _parser.Parse(searchQuery.Sort);
                var opt    = ctx.GetOptionsAs <IElasticQueryOptions>();
                TermToFieldVisitor.Run(result, ctx);
                AliasedQueryVisitor.Run(result, _aliasMap, ctx);
                var fields = GetReferencedFieldsQueryVisitor.Run(result);
                // TODO: Check referenced fields against opt.AllowedSortFields

                var sort = GetSortFieldsVisitor.Run(result, ctx);
                ctx.Search.Sort(sort);
            }

            return(Task.CompletedTask);
        }
Ejemplo n.º 2
0
        public Task BuildAsync <T>(QueryBuilderContext <T> ctx) where T : class, new()
        {
            string filter = ctx.Source.GetFilterExpression();
            string search = ctx.Source.GetSearchExpression();
            string sort   = ctx.Source.GetSortExpression();

            if (!String.IsNullOrEmpty(filter))
            {
                var result = _parser.Parse(filter);
                filter = GenerateQueryVisitor.Run(FieldResolverQueryVisitor.Run(result, _aliasMap, ctx), ctx);

                ctx.Filter &= new QueryStringQuery {
                    Query           = filter,
                    DefaultOperator = Operator.And,
                    AnalyzeWildcard = false
                };
            }

            if (!String.IsNullOrEmpty(search))
            {
                var result = _parser.Parse(search);
                search = GenerateQueryVisitor.Run(FieldResolverQueryVisitor.Run(result, _aliasMap, ctx), ctx);

                ctx.Query &= new QueryStringQuery {
                    Query           = search,
                    DefaultOperator = ctx.Source.GetSearchExpressionDefaultOperator() == SearchOperator.Or ? Operator.Or : Operator.And,
                    AnalyzeWildcard = true
                };
            }

            if (!String.IsNullOrEmpty(sort))
            {
                var result = _parser.Parse(sort);
                TermToFieldVisitor.Run(result, ctx);
                FieldResolverQueryVisitor.Run(result, _aliasMap, ctx);
                var fields = GetReferencedFieldsQueryVisitor.Run(result);
                // TODO: Check referenced fields against opt.AllowedSortFields

                var sortFields = GetSortFieldsVisitor.Run(result, ctx).ToList();

                ctx.Search.Sort(sortFields);
            }

            return(Task.CompletedTask);
        }
Ejemplo n.º 3
0
        public override async Task VisitAsync(TermNode node, IQueryVisitorContext context)
        {
            var filteredNode = ApplyFilter(node, context);

            if (filteredNode is GroupNode newGroupNode)
            {
                await base.VisitAsync(newGroupNode, context);

                return;
            }

            if (String.Equals(node.Field, "status", StringComparison.OrdinalIgnoreCase) &&
                !node.IsNegated.GetValueOrDefault() &&
                String.Equals(node.Term, "open", StringComparison.OrdinalIgnoreCase))
            {
                HasStatusOpen = true;
            }

            if (QueryMode != EventStackFilterQueryMode.InvertedStacks)
            {
                return;
            }

            if (_stackNonInvertedFields.Contains(filteredNode.Field))
            {
                return;
            }

            var groupNode = node.GetGroupNode();

            // check to see if we already inverted the group
            if (groupNode.Data.ContainsKey("@IsInverted"))
            {
                return;
            }

            var referencedFields = await GetReferencedFieldsQueryVisitor.RunAsync(groupNode, context);

            if (referencedFields.Any(f => _stackNonInvertedFields.Contains(f)))
            {
                // if we have referenced fields that are on the list of non-inverted fields and the operator is an OR then its an issue, mark invert unsuccessful
                if (node.GetOperator(context) == GroupOperator.Or)
                {
                    IsInvertSuccessful = false;
                    return;
                }

                node.IsNegated = node.IsNegated.HasValue ? !node.IsNegated : true;
                return;
            }

            // negate the entire group
            if (groupNode.Left != null)
            {
                groupNode.IsNegated = groupNode.IsNegated.HasValue ? !groupNode.IsNegated : true;
                if (groupNode.Right != null)
                {
                    groupNode.HasParens = true;
                }
            }

            groupNode.Data["@IsInverted"] = true;
        }