Пример #1
0
        protected virtual IList <IFilter> GetFilters(CategorySearchCriteria criteria)
        {
            var result = new List <IFilter>();

            if (!string.IsNullOrEmpty(criteria.SearchPhrase))
            {
                var parseResult = _searchPhraseParser.Parse(criteria.SearchPhrase);
                criteria.SearchPhrase = parseResult.SearchPhrase;
                result.AddRange(parseResult.Filters);
            }

            if (criteria.ObjectIds != null)
            {
                result.Add(new IdsFilter {
                    Values = criteria.ObjectIds
                });
            }

            if (!string.IsNullOrEmpty(criteria.CatalogId))
            {
                result.Add(FiltersHelper.CreateTermFilter("catalog", criteria.CatalogId.ToLowerInvariant()));
            }

            result.Add(FiltersHelper.CreateOutlineFilter(criteria));

            var terms = criteria.GetTerms();

            result.AddRange(terms.Select(term => FiltersHelper.CreateTermFilter(term.Key, term.Values)));

            return(result);
        }
        protected virtual IList <IFilter> GetPermanentFilters(ProductIndexedSearchCriteria criteria)
        {
            var result = new List <IFilter>();

            if (!string.IsNullOrEmpty(criteria.Keyword))
            {
                var parseResult = _searchPhraseParser.Parse(criteria.Keyword);
                criteria.Keyword = parseResult.Keyword;
                result.AddRange(parseResult.Filters);
            }

            if (criteria.ObjectIds != null)
            {
                result.Add(new IdsFilter {
                    Values = criteria.ObjectIds
                });
            }

            if (!string.IsNullOrEmpty(criteria.CatalogId))
            {
                result.Add(FiltersHelper.CreateTermFilter("catalog", criteria.CatalogId.ToLowerInvariant()));
            }

            result.Add(FiltersHelper.CreateOutlineFilter(criteria));

            if (criteria.StartDateFrom.HasValue)
            {
                result.Add(FiltersHelper.CreateDateRangeFilter("startdate", criteria.StartDateFrom, criteria.StartDate, false, true));
            }

            if (criteria.EndDate.HasValue)
            {
                result.Add(FiltersHelper.CreateDateRangeFilter("enddate", criteria.EndDate, null, false, false));
            }

            if (!criteria.ClassTypes.IsNullOrEmpty())
            {
                result.Add(FiltersHelper.CreateTermFilter("__type", criteria.ClassTypes));
            }

            if (!criteria.WithHidden)
            {
                result.Add(FiltersHelper.CreateTermFilter("status", "visible"));
            }

            if (criteria.PriceRange != null)
            {
                var range = criteria.PriceRange;
                result.Add(FiltersHelper.CreatePriceRangeFilter(criteria.Currency, criteria.Pricelists, range.Lower, range.Upper, range.IncludeLower, range.IncludeUpper));
            }

            if (criteria.GeoDistanceFilter != null)
            {
                result.Add(criteria.GeoDistanceFilter);
            }

            return(result);
        }
Пример #3
0
        public IndexSearchRequestBuilder ParseFacets(ISearchPhraseParser phraseParser, string facetPhrase, IList <AggregationRequest> predefinedAggregations = null)
        {
            if (phraseParser == null)
            {
                throw new ArgumentNullException(nameof(phraseParser));
            }
            SearchRequest.Aggregations = predefinedAggregations ?? new List <AggregationRequest>();

            if (string.IsNullOrEmpty(facetPhrase))
            {
                return(this);
            }

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

            //Term facets
            if (!string.IsNullOrEmpty(parseResult.Keyword))
            {
                var termFacetExpressions = parseResult.Keyword.Split(" ");
                parseResult.Filters.AddRange(termFacetExpressions.Select(x => new TermFilter
                {
                    FieldName = x,
                    Values    = new List <string>()
                }));
            }

            SearchRequest.Aggregations = parseResult.Filters
                                         .Select <IFilter, AggregationRequest>(filter =>
            {
                FilterSyntaxMapper.MapFilterAdditionalSyntax(filter);

                return(filter switch
                {
                    RangeFilter rangeFilter => new RangeAggregationRequest
                    {
                        Id = filter.Stringify(),
                        FieldName = rangeFilter.FieldName,
                        Values = rangeFilter.Values.Select(x => new RangeAggregationRequestValue
                        {
                            Id = x.Stringify(),
                            Lower = x.Lower,
                            Upper = x.Upper,
                            IncludeLower = x.IncludeLower,
                            IncludeUpper = x.IncludeUpper
                        }).ToList()
                    },
                    TermFilter termFilter => new TermAggregationRequest
                    {
                        FieldName = termFilter.FieldName,
                        Id = filter.Stringify(),
                        Filter = termFilter
                    },
                    _ => null,
                });
            })
        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);
        }
Пример #5
0
        public CartSearchCriteriaBuilder ParseFilters(string filterPhrase)
        {
            if (string.IsNullOrEmpty(filterPhrase))
            {
                return(this);
            }
            if (_phraseParser == null)
            {
                throw new OperationCanceledException("phrase parser must be initialized");
            }

            var parseResult = _phraseParser.Parse(filterPhrase);

            _mapper.Map(parseResult.Filters, _searchCriteria);

            return(this);
        }
        public DynamicPropertySearchCriteriaBuilder ParseFilters(string filterPhrase)
        {
            if (filterPhrase == null)
            {
                return(this);
            }
            if (_phraseParser == null)
            {
                throw new OperationCanceledException("phrase parser must be set");
            }

            var parseResult = _phraseParser.Parse(filterPhrase);

            _mapper.Map(parseResult.Filters, _searchCriteria);

            return(this);
        }
Пример #7
0
        protected virtual IList <IFilter> GetFilters(MembersSearchCriteria criteria)
        {
            var result = new List <IFilter>();

            if (!string.IsNullOrEmpty(criteria.Keyword))
            {
                var parseResult = _searchPhraseParser.Parse(criteria.Keyword);
                criteria.Keyword = parseResult.Keyword;
                result.AddRange(parseResult.Filters);
            }

            if (criteria.ObjectIds?.Any() == true)
            {
                result.Add(new IdsFilter {
                    Values = criteria.ObjectIds
                });
            }

            if (criteria.MemberTypes?.Any() == true)
            {
                result.Add(CreateTermFilter("MemberType", criteria.MemberTypes));
            }

            if (criteria.Groups?.Any() == true)
            {
                result.Add(CreateTermFilter("Groups", criteria.Groups));
            }

            if (!string.IsNullOrEmpty(criteria.MemberId))
            {
                result.Add(CreateTermFilter("ParentOrganizations", criteria.MemberId));
                // TODO: criteria.DeepSearch requires something like outlines in the catalog module
            }
            else if (!criteria.DeepSearch)
            {
                result.Add(CreateTermFilter("HasParentOrganizations", "false"));
            }

            return(result);
        }
Пример #8
0
        public virtual async Task <FiltersContainer> GetTermFiltersAsync(ProductIndexedSearchCriteria criteria)
        {
            var result = new FiltersContainer();

            var terms = criteria.GetTerms();

            if (terms.Any())
            {
                var browseFilters = await _browseFilterService.GetBrowseFiltersAsync(criteria);

                var filtersAndValues = browseFilters
                                       ?.Select(f => new { Filter = f, Values = f.GetValues() })
                                       .ToList();

                foreach (var term in terms)
                {
                    var browseFilter = browseFilters?.SingleOrDefault(x => x.Key.EqualsInvariant(term.Key));

                    // Handle special filter term with a key = "tags", it contains just values and we need to determine which filter to use
                    if (browseFilter == null && term.Key == "tags")
                    {
                        foreach (var termValue in term.Values)
                        {
                            // Try to find filter by value
                            var filterAndValues = filtersAndValues?.FirstOrDefault(x => x.Values?.Any(v => v.Id.Equals(termValue)) == true);
                            if (filterAndValues != null)
                            {
                                var filter = ConvertBrowseFilter(filterAndValues.Filter, term.Values, criteria);
                                result.PermanentFilters.Add(filter);
                            }
                            else
                            {
                                // Unknown term values should produce empty result
                                result.PermanentFilters.Add(new IdsFilter {
                                    Values = new[] { string.Empty }
                                });
                            }
                        }
                    }
                    else if (browseFilter != null) // Predefined filter
                    {
                        var filter = ConvertBrowseFilter(browseFilter, term.Values, criteria);
                        result.RemovableFilters.Add(new KeyValuePair <string, IFilter>(browseFilter.Key, filter));
                    }
                    else // Custom term
                    {
                        IFilter filter = null;
                        //Workaround VP-5872: Try to parse range filter from terms first
                        if (term.Values.Count() == 1 && _searchPhraseParser != null)
                        {
                            filter = _searchPhraseParser.Parse($"{term.Key}:{term.Values.First()}").Filters.OfType <RangeFilter>().FirstOrDefault();
                        }
                        if (filter == null)
                        {
                            filter = FiltersHelper.CreateTermFilter(term.Key, term.Values);
                        }
                        result.PermanentFilters.Add(filter);
                    }
                }
            }

            return(result);
        }
        public IndexSearchRequestBuilder ParseFilters(ISearchPhraseParser phraseParser, string filterPhrase)
        {
            if (phraseParser == null)
            {
                throw new ArgumentNullException(nameof(phraseParser));
            }

            if (string.IsNullOrEmpty(filterPhrase))
            {
                return(this);
            }

            var parseResult = phraseParser.Parse(filterPhrase);

            var filters = new List <IFilter>();

            foreach (var filter in parseResult.Filters)
            {
                FilterSyntaxMapper.MapFilterAdditionalSyntax(filter);

                if (filter is TermFilter termFilter)
                {
                    var wildcardValues = termFilter.Values.Where(x => new[] { "?", "*" }.Any(x.Contains)).ToArray();

                    if (wildcardValues.Any())
                    {
                        var orFilter = new OrFilter
                        {
                            ChildFilters = new List <IFilter>()
                        };

                        var wildcardTermFilters = wildcardValues.Select(x => new WildCardTermFilter
                        {
                            FieldName = termFilter.FieldName,
                            Value     = x
                        }).ToList();

                        orFilter.ChildFilters.AddRange(wildcardTermFilters);

                        termFilter.Values = termFilter.Values.Except(wildcardValues).ToList();

                        if (termFilter.Values.Any())
                        {
                            orFilter.ChildFilters.Add(termFilter);
                        }

                        filters.Add(orFilter);
                    }
                    else
                    {
                        filters.Add(termFilter);
                    }
                }
                else
                {
                    filters.Add(filter);
                }
            }

            AddFiltersToSearchRequest(filters.ToArray());

            return(this);
        }