private static void ApplyAggregations(FacetBase facet, FacetToken token) { foreach (var aggregation in facet.Aggregations) { FacetAggregationToken aggregationToken; switch (aggregation.Key) { case FacetAggregation.Max: aggregationToken = FacetAggregationToken.Max(aggregation.Value); break; case FacetAggregation.Min: aggregationToken = FacetAggregationToken.Min(aggregation.Value); break; case FacetAggregation.Average: aggregationToken = FacetAggregationToken.Average(aggregation.Value); break; case FacetAggregation.Sum: aggregationToken = FacetAggregationToken.Sum(aggregation.Value); break; default: throw new NotSupportedException($"Unsupported aggregation method: {aggregation.Key}"); } token._aggregations.Add(aggregationToken); } }
/// <summary> /// Adds the Facet in the order it was received /// </summary> /// <param name="facetOn">The Facet</param> /// <exception cref="ArgumentNullException">Argument cannot be null</exception> /// <returns><see cref="FacetBuilder{T}"/></returns> public virtual FacetBuilder <T> On(FacetBase facetOn) { if (facetOn == null) { throw new ArgumentNullException(nameof(facetOn)); } this.FacetOptions.Facets.Add(facetOn); return(this); }
public static FacetToken Create(FacetBase facet, Func <object, string> addQueryParameter) { var optionsParameterName = facet.Options != null && facet.Options != FacetOptions.Default ? addQueryParameter(facet.Options) : null; string aggregateByField = null; List <string> ranges = null; var aggregationFacet = facet.AsFacet(); var rangeFacet = facet.AsRangeFacet(); if (aggregationFacet != null) { aggregateByField = aggregationFacet.FieldName; } if (rangeFacet != null) { ranges = rangeFacet.Ranges; } var token = new FacetToken(aggregateByField, facet.DisplayFieldName, ranges, optionsParameterName); foreach (var aggregation in facet.Aggregations) { FacetAggregationToken aggregationToken; switch (aggregation.Key) { case FacetAggregation.Max: aggregationToken = FacetAggregationToken.Max(aggregation.Value); break; case FacetAggregation.Min: aggregationToken = FacetAggregationToken.Min(aggregation.Value); break; case FacetAggregation.Average: aggregationToken = FacetAggregationToken.Average(aggregation.Value); break; case FacetAggregation.Sum: aggregationToken = FacetAggregationToken.Sum(aggregation.Value); break; default: throw new NotSupportedException($"Unsupported aggregation method: {aggregation.Key}"); } token._aggregations.Add(aggregationToken); } return(token); }
public void AggregateBy(FacetBase facet) { foreach (var token in SelectTokens) { if (token is FacetToken) { continue; } throw new InvalidOperationException($"Aggregation query can select only facets while it got {token.GetType().Name} token"); } SelectTokens.AddLast(FacetToken.Create(facet, AddQueryParameter)); }
private bool AreFacetsEqual <T>(FacetBase left, FacetBase right) { if (left is Facet leftFacet) { var rightFacet = (Facet)(Facet <T>)right; return(leftFacet.FieldName == rightFacet.FieldName); } var leftRangeFacet = (RangeFacet)left; var rightRangeFacet = (RangeFacet)(RangeFacet <T>)right; return(leftRangeFacet.Ranges.Count == rightRangeFacet.Ranges.Count && leftRangeFacet.Ranges.All(x => rightRangeFacet.Ranges.Contains(x))); }
private bool AreFacetsEqual(FacetBase left, FacetBase right) { if (left is Facet leftFacet) { var rightFacet = right.AsFacet(); return(leftFacet.FieldName == rightFacet.FieldName); } var leftRangeFacet = left.AsRangeFacet(); var rightRangeFacet = right.AsRangeFacet(); return(leftRangeFacet.Ranges.Count == rightRangeFacet.Ranges.Count && leftRangeFacet.Ranges.All(x => rightRangeFacet.Ranges.Contains(x))); }
public static FacetToken Create(FacetBase facet, Func <object, string> addQueryParameter) { // this is just a dispatcher return(facet.ToFacetToken(addQueryParameter)); }
private static string GetOptionsParameterName(FacetBase facet, Func <object, string> addQueryParameter) { return(facet.Options != null && facet.Options != FacetOptions.Default ? addQueryParameter(facet.Options) : null); }
private static void ThrowUnknownFacetType(FacetBase facet) { throw new InvalidOperationException($"Unsupported facet type: {facet.GetType().FullName}"); }
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); }
public new IAggregationDocumentQuery <T> AggregateBy(FacetBase facet) { base.AggregateBy(facet); return(new AggregationDocumentQuery <T>(this)); }
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); }