private static FacetResult ProcessFacet(FacetBase facet, List <QueryExpression> facetRanges, FacetQuery query) { var result = new FacetResult { Result = new Raven.Client.Documents.Queries.Facets.FacetResult(), Options = facet.Options }; string fieldName = null; if (facet is Facet aggregationOnlyFacet) { result.AggregateBy = aggregationOnlyFacet.FieldName ?? Constants.Documents.Querying.Facet.AllResults; fieldName = result.AggregateBy; } else if (facet is RangeFacet) { Debug.Assert(facetRanges != null && facetRanges.Count > 0); RangeType?rangeType = null; var ranges = new List <ParsedRange>(); foreach (var range in facetRanges) { var parsedRange = ParseRange(range, query, out var type); if (rangeType.HasValue == false) { rangeType = type; } else if (rangeType.Value != type) { ThrowDifferentTypesOfRangeValues(query, rangeType.Value, type, parsedRange.Field); } ranges.Add(parsedRange); if (fieldName == null) { fieldName = parsedRange.Field; } else { if (fieldName != parsedRange.Field) { ThrowRangeDefinedOnDifferentFields(query, fieldName, parsedRange.Field); } } } result.AggregateBy = fieldName; result.Ranges = ranges; result.RangeType = rangeType.Value; } else { ThrowUnknownFacetType(facet); } result.Result.Name = facet.DisplayFieldName ?? fieldName; foreach (var kvp in facet.Aggregations) { if (query.Legacy && kvp.Value.Count > 1) { throw new InvalidQueryException($"Detected duplicate facet aggregation operation '{kvp.Key}'. Each facet can only contain one of each available operations."); } foreach (var v in kvp.Value) { if (result.Aggregations.TryGetValue(v, out var value) == false) { result.Aggregations[v] = value = new FacetResult.Aggregation(); } switch (kvp.Key) { case FacetAggregation.Max: value.Max = true; break; case FacetAggregation.Min: value.Min = true; break; case FacetAggregation.Average: value.Average = true; break; case FacetAggregation.Sum: value.Sum = true; break; } } } return(result); }
private static FacetResult ProcessFacet(FacetBase facet, List <QueryExpression> facetRanges, FacetQuery query) { var result = new FacetResult { Result = new Raven.Client.Documents.Queries.Facets.FacetResult(), Options = facet.Options }; string fieldName = null; if (facet is Facet aggregationOnlyFacet) { result.AggregateBy = aggregationOnlyFacet.FieldName; fieldName = result.AggregateBy; } else if (facet is RangeFacet) { Debug.Assert(facetRanges != null && facetRanges.Count > 0); RangeType?rangeType = null; var ranges = new List <ParsedRange>(); foreach (var range in facetRanges) { var parsedRange = ParseRange(range, query, out var type); if (rangeType.HasValue == false) { rangeType = type; } else if (rangeType.Value != type) { ThrowDifferentTypesOfRangeValues(query, rangeType.Value, type, parsedRange.Field); } ranges.Add(parsedRange); result.Result.Values.Add(new FacetValue { Range = parsedRange.RangeText }); if (fieldName == null) { fieldName = parsedRange.Field; } else { if (fieldName != parsedRange.Field) { ThrowRangeDefinedOnDifferentFields(query, fieldName, parsedRange.Field); } } } result.AggregateBy = fieldName; result.Ranges = ranges; result.RangeType = rangeType.Value; } else { ThrowUnknownFacetType(facet); } result.Result.Name = facet.DisplayFieldName ?? fieldName; foreach (var kvp in facet.Aggregations) { if (result.Aggregations.TryGetValue(kvp.Value, out var value) == false) { result.Aggregations[kvp.Value] = value = new FacetResult.Aggregation(); } switch (kvp.Key) { case FacetAggregation.Max: value.Max = true; break; case FacetAggregation.Min: value.Min = true; break; case FacetAggregation.Average: value.Average = true; break; case FacetAggregation.Sum: value.Sum = true; break; } } return(result); }