Exemplo n.º 1
0
        /// <summary>
        /// Configure sort type of result of facet
        /// </summary>
        /// <param name="parameter">Parameter to configure</param>
        /// <param name="sortType">Sort type of result of facet</param>
        public static IFacetRangeParameter <TDocument> SortType <TDocument>(this IFacetRangeParameter <TDocument> parameter, FacetSortType sortType)
            where TDocument : Document
        {
            parameter.SortType = sortType;

            return(parameter);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Configure list of tags to exclude in facet calculation
        /// </summary>
        /// <param name="parameter">Parameter to configure</param>
        /// <param name="excludes">List of tags to exclude in facet calculation</param>
        public static IFacetRangeParameter <TDocument> Excludes <TDocument>(this IFacetRangeParameter <TDocument> parameter, params string[] excludes)
            where TDocument : Document
        {
            parameter.Excludes = excludes;

            return(parameter);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Configure lower bound to make facet
        /// </summary>
        /// <param name="parameter">Parameter to configure</param>
        /// <param name="start">Lower bound to make facet</param>
        public static IFacetRangeParameter <TDocument> Start <TDocument>(this IFacetRangeParameter <TDocument> parameter, string start)
            where TDocument : Document
        {
            parameter.Start = start;

            return(parameter);
        }
Exemplo n.º 4
0
        /// <summary>
        /// Configure upper bound to make facet
        /// </summary>
        /// <param name="parameter">Parameter to configure</param>
        /// <param name="end">Upper bound to make facet</param>
        public static IFacetRangeParameter <TDocument> End <TDocument>(this IFacetRangeParameter <TDocument> parameter, string end)
            where TDocument : Document
        {
            parameter.End = end;

            return(parameter);
        }
Exemplo n.º 5
0
        /// <summary>
        /// Configure expression used to find field name
        /// </summary>
        /// <param name="parameter">Parameter to configure</param>
        /// <param name="fieldExpression">Expression used to find field name</param>
        public static IFacetRangeParameter <TDocument> FieldExpression <TDocument>(this IFacetRangeParameter <TDocument> parameter, Expression <Func <TDocument, object> > fieldExpression)
            where TDocument : Document
        {
            parameter.FieldExpression = fieldExpression;

            return(parameter);
        }
Exemplo n.º 6
0
        /// <summary>
        /// Configure size of each range bucket to make facet
        /// </summary>
        /// <param name="parameter">Parameter to configure</param>
        /// <param name="gap">Size of each range bucket to make facet</param>
        public static IFacetRangeParameter <TDocument> Gap <TDocument>(this IFacetRangeParameter <TDocument> parameter, string gap)
            where TDocument : Document
        {
            parameter.Gap = gap;

            return(parameter);
        }
Exemplo n.º 7
0
        /// <summary>
        /// Configure name of alias added in query
        /// </summary>
        /// <param name="parameter">Parameter to configure</param>
        /// <param name="aliasName">Name of alias added in query></param>
        public static IFacetRangeParameter <TDocument> AliasName <TDocument>(this IFacetRangeParameter <TDocument> parameter, string aliasName)
            where TDocument : Document
        {
            parameter.AliasName = aliasName;

            return(parameter);
        }
Exemplo n.º 8
0
        /// <summary>
        /// Configure value of hardend
        /// </summary>
        /// <param name="parameter">Parameter to configure</param>
        /// <param name="minimum">True to last bucket will end at “end” even if it is less than “gap” wide</param>
        public static IFacetRangeParameter <TDocument> HardEnd <TDocument>(this IFacetRangeParameter <TDocument> parameter, bool hardEnd)
            where TDocument : Document
        {
            parameter.HardEnd = hardEnd;

            return(parameter);
        }
Exemplo n.º 9
0
        /// <summary>
        /// Configure limit of itens in facet's result
        /// </summary>
        /// <param name="parameter">Parameter to configure</param>
        /// <param name="limit">Limit of itens in facet's result</param>
        public static IFacetRangeParameter <TDocument> Limit <TDocument>(this IFacetRangeParameter <TDocument> parameter, int limit)
            where TDocument : Document
        {
            parameter.Limit = limit;

            return(parameter);
        }
Exemplo n.º 10
0
        /// <summary>
        /// Configure minimum count of itens in facet's result
        /// </summary>
        /// <param name="parameter">Parameter to configure</param>
        /// <param name="minimum">Minimum count of itens in facet's result</param>
        public static IFacetRangeParameter <TDocument> Minimum <TDocument>(this IFacetRangeParameter <TDocument> parameter, int minimum)
            where TDocument : Document
        {
            parameter.Minimum = minimum;

            return(parameter);
        }
Exemplo n.º 11
0
        /// <summary>
        /// Configure counts should also be computed for all records with field values greater then the upper bound of the last range
        /// </summary>
        /// <param name="parameter">Parameter to configure</param>
        /// <param name="countAfter">Counts should also be computed for all records with field values greater then the upper bound of the last range</param>
        public static IFacetRangeParameter <TDocument> CountAfter <TDocument>(this IFacetRangeParameter <TDocument> parameter, bool countAfter)
            where TDocument : Document
        {
            parameter.CountAfter = countAfter;

            return(parameter);
        }
Exemplo n.º 12
0
        /// <summary>
        /// Configure counts should also be computed for all records with field values lower then lower bound of the first range
        /// </summary>
        /// <param name="parameter">Parameter to configure</param>
        /// <param name="countBefore">Counts should also be computed for all records with field values lower then lower bound of the first range</param>
        public static IFacetRangeParameter <TDocument> CountBefore <TDocument>(this IFacetRangeParameter <TDocument> parameter, bool countBefore)
            where TDocument : Document
        {
            parameter.CountBefore = countBefore;

            return(parameter);
        }
Exemplo n.º 13
0
        /// <summary>
        /// Configure filter or list of filters to be intersected with the incoming domain before faceting
        /// </summary>
        /// <typeparam name="TDocument"></typeparam>
        /// <param name="parameter"></param>
        /// <param name="configureFilter"></param>
        /// <returns></returns>
        public static IFacetRangeParameter <TDocument> Filter <TDocument>(this IFacetRangeParameter <TDocument> parameter, Action <SearchQuery <TDocument> > configureFilter)
            where TDocument : Document
        {
            var searchQuery = parameter.ServiceProvider.GetService <SearchQuery <TDocument> >();

            configureFilter.Invoke(searchQuery);

            parameter.Filter = searchQuery;

            return(parameter);
        }
Exemplo n.º 14
0
        private void ProcessFacetRangeBuckets(string root, IFacetRangeParameter <TDocument> facetParameter, string facetName, IFacetItem facetItem, Type fieldType)
        {
            this._jsonReader.Read();// Starts array

            while (this._jsonReader.Path.StartsWith($"{root}.{facetName}.buckets["))
            {
                var initialPath = this._jsonReader.Path;

                this._jsonReader.Read();// "val" property
                var rawMinimumValue = this._jsonReader.ReadAsString();

                this._jsonReader.Read();// "count" property
                var count = (long)this._jsonReader.ReadAsInt32();

                var value = GetFacetItemRangeValue(fieldType, rawMinimumValue);

                var maximumValue = GetMaximumValue(fieldType, value, facetParameter.Gap);

                value.SetMaximumValue(maximumValue);
                value.Quantity = count;

                // Go to next token to verify subfacet
                this._jsonReader.Read();

                // Subfacets
                if (this._jsonReader.TokenType != JsonToken.EndObject)
                {
                    this.GetFacetItems(
                        initialPath,
                        facetParameter.Facets,
                        out var facetItems);

                    value.Facets = facetItems;
                }

                ((List <IFacetItemRangeValue>)((FacetItemRange)facetItem).Values).Add(value);

                // Try closes bucket object
                while (this._jsonReader.TokenType != JsonToken.EndObject)
                {
                    this._jsonReader.Read();
                }

                this._jsonReader.Read();// Starts next bucket object
            }

            this._jsonReader.Read();// Ends array

            var values = ((List <IFacetItemRangeValue>)((FacetItemRange)facetItem).Values);

            if (facetParameter.HardEnd && values.Any())
            {
                var item  = values[values.Count - 1];
                var value = GetParsedRangeValue(fieldType, facetParameter.End);
                if (FirstGreaterThanSecond(fieldType, item.GetMaximumValue(), value))
                {
                    item.SetMaximumValue(value);
                }
            }

            IFacetItemRangeValue facetItemRangeValueBefore = null;

            if (this._jsonReader.Path.Equals($"{root}.{facetName}.before"))
            {
                facetItemRangeValueBefore = GetFacetItemRangeValue(fieldType, rawMaximumValue: facetParameter.Start);

                this._jsonReader.Read(); // Ends property
                this._jsonReader.Read(); // "count" property
                facetItemRangeValueBefore.Quantity = (long)this._jsonReader.ReadAsInt32();

                this._jsonReader.Read(); // Ends property
                this._jsonReader.Read(); // Ends object
            }

            if (this._jsonReader.Path.Equals($"{root}.{facetName}.after"))
            {
                var facetItemRangeValue = GetFacetItemRangeValue(fieldType, facetParameter.End);

                if (!facetParameter.HardEnd)
                {
                    var maximumValue = GetMaximumValue(fieldType, facetItemRangeValue, facetParameter.Gap);
                    facetItemRangeValue.SetMinimumValue(maximumValue);
                }

                this._jsonReader.Read(); // Ends property
                this._jsonReader.Read(); // "count" property
                facetItemRangeValue.Quantity = (long)this._jsonReader.ReadAsInt32();

                ((List <IFacetItemRangeValue>)((FacetItemRange)facetItem).Values).Add(facetItemRangeValue);

                this._jsonReader.Read(); // Ends property
                this._jsonReader.Read(); // Ends object
            }

            // ReSharper disable once InvertIf
            if (facetItemRangeValueBefore != null)
            {
                ((List <IFacetItemRangeValue>)((FacetItemRange)facetItem).Values).Insert(0, facetItemRangeValueBefore);
            }
        }