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); }
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); }
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; }