private static AggregationResponse GetAggregation(AggregationRequest aggregationRequest, IDictionary <string, Filter> valueFilters, IndexSearcher searcher, bool sortValues, int?maxValuesCount, ICollection <string> availableFields) { AggregationResponse result = null; if (aggregationRequest != null) { if (valueFilters != null) { var commonFilter = LuceneSearchFilterBuilder.GetFilterRecursive(aggregationRequest.Filter, availableFields); var values = valueFilters.Select(kvp => GetAggregationValue(kvp.Key, kvp.Value, commonFilter, searcher)) .Where(v => v != null); if (sortValues) { values = values .OrderByDescending(v => v.Count) .ThenBy(v => v.Id); } if (maxValuesCount > 0) { values = values.Take(maxValuesCount.Value); } result = new AggregationResponse { Id = aggregationRequest.Id ?? aggregationRequest.FieldName, Values = values.ToArray(), }; } } return(result); }
private static AggregationResponse CreateTermAggregationResponse(TermAggregationRequest termAggregationRequest, IndexSearcher searcher, ICollection <string> availableFields) { AggregationResponse result = null; if (termAggregationRequest != null) { var fieldName = GetFacetFieldName(termAggregationRequest.FieldName, availableFields); Dictionary <string, Filter> valueFilters; if (!string.IsNullOrEmpty(fieldName)) { var values = termAggregationRequest.Values ?? searcher.IndexReader.GetAllFieldValues(fieldName); valueFilters = values.Distinct().ToDictionary(v => v, v => LuceneSearchFilterBuilder.CreateTermsFilter(fieldName, v)); } else { var aggregationValueId = termAggregationRequest.Id ?? termAggregationRequest.FieldName; valueFilters = new Dictionary <string, Filter> { { aggregationValueId, null } }; } result = GetAggregation(termAggregationRequest, valueFilters, searcher, true, termAggregationRequest.Size, availableFields); } return(result); }
private static AggregationResponseValue GetAggregationValue(string valueId, Filter valueFilter, Filter commonFilter, IndexSearcher searcher) { AggregationResponseValue result = null; var filter = LuceneSearchFilterBuilder.JoinNonEmptyFilters(new[] { commonFilter, valueFilter }, Occur.MUST); if (filter != null) { var count = CalculateFacetCount(searcher, filter); if (count > 0) { result = new AggregationResponseValue { Id = valueId, Count = count }; } } return(result); }
private static Filter GetFilters(SearchRequest request, ICollection <string> availableFields) { return(LuceneSearchFilterBuilder.GetFilterRecursive(request.Filter, availableFields)); }
private static AggregationResponse CreateRangeAggregationResponse(RangeAggregationRequest rangeAggregationRequest, IndexSearcher searcher, ICollection <string> availableFields) { AggregationResponse result = null; if (rangeAggregationRequest != null) { var fieldName = LuceneSearchHelper.ToLuceneFieldName(rangeAggregationRequest.FieldName); var valueFilters = rangeAggregationRequest.Values?.ToDictionary(v => v.Id, v => LuceneSearchFilterBuilder.CreateRangeFilterForValue(fieldName, v.Lower, v.Upper, v.IncludeLower, v.IncludeUpper)); result = GetAggregation(rangeAggregationRequest, valueFilters, searcher, false, null, availableFields); } return(result); }