Esempio n. 1
0
 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));
         }
     }
 }
Esempio n. 2
0
        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}");
            }
        }