Example #1
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        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));
        }
Example #5
0
        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)));
        }
Example #6
0
        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)));
        }
Example #7
0
 public static FacetToken Create(FacetBase facet, Func <object, string> addQueryParameter)
 {
     // this is just a dispatcher
     return(facet.ToFacetToken(addQueryParameter));
 }
Example #8
0
 private static string GetOptionsParameterName(FacetBase facet, Func <object, string> addQueryParameter)
 {
     return(facet.Options != null && facet.Options != FacetOptions.Default ? addQueryParameter(facet.Options) : null);
 }
Example #9
0
 private static void ThrowUnknownFacetType(FacetBase facet)
 {
     throw new InvalidOperationException($"Unsupported facet type: {facet.GetType().FullName}");
 }
Example #10
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 #11
0
        public new IAggregationDocumentQuery <T> AggregateBy(FacetBase facet)
        {
            base.AggregateBy(facet);

            return(new AggregationDocumentQuery <T>(this));
        }
Example #12
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);
        }