Example #1
0
        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);
        }
Example #2
0
        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);
        }