public SearchRequestBuilder ParseFacets(string facetPhrase)
        {
            if (facetPhrase == null)
            {
                return(this);
            }

            if (_phraseParser == null)
            {
                throw new OperationCanceledException("phrase parser must be initialized");
            }

            //TODO: Support aliases for Facet expressions e.g price.usd[TO 200) as price_below_200
            //TODO: Need to create a new  Antlr file with g4-lexer rules and generate parser especially for facets expression that will return proper AggregationRequests objects
            var parseResult = _phraseParser.Parse(facetPhrase);
            var aggrs       = new List <AggregationRequest>();

            //Term facets
            if (!string.IsNullOrEmpty(parseResult.Keyword))
            {
                var termFacetExpressions = parseResult.Keyword.Split(" ");
                aggrs.AddRange(termFacetExpressions.Select(x => new TermAggregationRequest {
                    FieldName = x, Id = x
                }));
            }

            foreach (var filter in parseResult.Filters)
            {
                FilterSyntaxMapper.MapFilterSyntax(filter);
                //Range facets
                if (filter is RangeFilter rangeFilter)
                {
                    aggrs.Add(new RangeAggregationRequest
                    {
                        Id        = rangeFilter.FieldName + "range",
                        FieldName = rangeFilter.FieldName,
                        Values    = rangeFilter.Values.Select(x => new RangeAggregationRequestValue
                        {
                            Id           = (x.Lower ?? "*") + "-" + (x.Upper ?? "*"),
                            Lower        = x.Lower,
                            Upper        = x.Upper,
                            IncludeLower = x.IncludeLower,
                            IncludeUpper = x.IncludeUpper
                        }).ToList()
                    });
                }
                //Filter facets
                if (filter is TermFilter termFilter)
                {
                    aggrs.Add(new TermAggregationRequest {
                        FieldName = termFilter.FieldName, Id = termFilter.ToString(), Filter = termFilter
                    });
                }
            }

            SearchRequest.Aggregations = aggrs;

            return(this);
        }
        public SearchRequestBuilder ParseFilters(string filterPhrase)
        {
            if (filterPhrase == null)
            {
                return(this);
            }
            if (_phraseParser == null)
            {
                throw new OperationCanceledException("phrase parser must be initialized");
            }
            var parseResult = _phraseParser.Parse(filterPhrase);
            var filters     = new List <IFilter>();

            foreach (var filter in parseResult.Filters)
            {
                FilterSyntaxMapper.MapFilterSyntax(filter);
                if (filter is TermFilter termFilter)
                {
                    var wildcardValues = termFilter.Values.Where(x => new[] { "?", "*" }.Any(x.Contains));
                    if (wildcardValues.Any())
                    {
                        filters.AddRange(wildcardValues.Select(x => new WildCardTermFilter {
                            FieldName = termFilter.FieldName, Value = x
                        }));
                        termFilter.Values = termFilter.Values.Except(wildcardValues).ToList();
                    }
                    if (termFilter.Values.Any())
                    {
                        filters.Add(termFilter);
                    }
                }
                else
                {
                    filters.Add(filter);
                }
            }
            ((AndFilter)SearchRequest.Filter).ChildFilters.AddRange(filters);

            return(this);
        }