private void Validate(IEnumerable <Facet> facets) { foreach (var facet in facets) { if (FacetedQueryHelper.IsAggregationNumerical(facet.Aggregation) && FacetedQueryHelper.IsAggregationTypeNumerical(facet.AggregationType) && FacetedQueryHelper.GetSortOptionsForFacet(facet.AggregationField, _fields) == SortOptions.None) { throw new InvalidOperationException(string.Format("Index '{0}' does not have sorting enabled for a numerical field '{1}'.", _indexName, facet.AggregationField)); } } }
private void ApplyAggregation(Facet facet, FacetValue value, ArraySegment <int> docsInQuery, IndexReader indexReader, int docBase) { var sortOptionsForFacet = FacetedQueryHelper.GetSortOptionsForFacet(facet.AggregationField, _fields); switch (sortOptionsForFacet) { case SortOptions.String: case SortOptions.StringVal: //case SortOptions.Custom: // TODO arek case SortOptions.None: throw new InvalidOperationException(string.Format("Cannot perform numeric aggregation on index field '{0}'. You must set the Sort mode of the field to Int, Float, Long or Double.", FacetedQueryHelper.TryTrimRangeSuffix(facet.AggregationField))); case SortOptions.NumericLong: var longs = FieldCache_Fields.DEFAULT.GetLongs(indexReader, facet.AggregationField); for (int index = 0; index < docsInQuery.Count; index++) { var doc = docsInQuery.Array[index]; var currentVal = longs[doc - docBase]; if (facet.Aggregation.HasFlag(FacetAggregation.Max)) { value.Max = Math.Max(value.Max ?? double.MinValue, currentVal); } if (facet.Aggregation.HasFlag(FacetAggregation.Min)) { value.Min = Math.Min(value.Min ?? double.MaxValue, currentVal); } if (facet.Aggregation.HasFlag(FacetAggregation.Sum)) { value.Sum = currentVal + (value.Sum ?? 0d); } if (facet.Aggregation.HasFlag(FacetAggregation.Average)) { value.Average = currentVal + (value.Average ?? 0d); } } break; case SortOptions.NumericDouble: var doubles = FieldCache_Fields.DEFAULT.GetDoubles(indexReader, facet.AggregationField); for (int index = 0; index < docsInQuery.Count; index++) { var doc = docsInQuery.Array[index]; var currentVal = doubles[doc - docBase]; if (facet.Aggregation.HasFlag(FacetAggregation.Max)) { value.Max = Math.Max(value.Max ?? double.MinValue, currentVal); } if (facet.Aggregation.HasFlag(FacetAggregation.Min)) { value.Min = Math.Min(value.Min ?? double.MaxValue, currentVal); } if (facet.Aggregation.HasFlag(FacetAggregation.Sum)) { value.Sum = currentVal + (value.Sum ?? 0d); } if (facet.Aggregation.HasFlag(FacetAggregation.Average)) { value.Average = currentVal + (value.Average ?? 0d); } } break; default: throw new ArgumentOutOfRangeException($"Not supported sort option for aggregation: {sortOptionsForFacet}"); } }