コード例 #1
0
ファイル: SearchFilter.cs プロジェクト: carlingkirk/emergence
 public override AggregationContainerDescriptor <T> ToAggregationContainerDescriptor(AggregationContainerDescriptor <T> aggregationDescriptor)
 => aggregationDescriptor
 .Filter(Name, f => f.Filter(f => f.Nested(n => n.Path(Path).Query(q => q.Term(Path + "." + FilterField, FilterValue)))))
 .Nested(Name, n => n
         .Path(Path)
         .Aggregations(a => a
                       .Terms(Name, t => t.Field(Path + "." + Field).Size(100))));
コード例 #2
0
        public static AggregationContainerDescriptor <T> GetStatsDescriptor <T>(this AggregationContainerDescriptor <T> agg, Expression <Func <T, object> > fieldGetter, AggType aggType, Expression <Func <T, bool> > filterRule = null) where T : class
        {
            var aggFunc = GetAggregationFunc <T>(fieldGetter, aggType);

            if (filterRule == null)
            {
                return(aggFunc(agg));
            }

            var filterName = filterRule.GenerateFilterName();

            agg.Filter(filterName, f => f.Filter(fd => filterRule.Body.GenerateFilterDescription <T>()).Aggregations(aggFunc));
            return(agg);
        }
コード例 #3
0
        public static AggregationContainerDescriptor <dynamic> AggregationSelector(this AggregationContainerDescriptor <dynamic> agg, IEnumerable <Facet> aggregationFacets,
                                                                                   IDictionary <string, QueryContainer> aggregationFilterQueries = null, QueryContainer dateRangeQuery = null)
        {
            foreach (var facet in aggregationFacets)
            {
                var name           = System.Web.HttpUtility.UrlEncode(facet.Name);
                var aggFilterQuery = GetFilterQueryForAggregationByName(aggregationFilterQueries, facet.Name);

                if (facet.ContainsTaxonomy)
                {
                    // Facet with taxonomy will use named filters with query match queries for aggragations
                    agg.Filter(name, q => q
                               .Filter(aq => aggFilterQuery && dateRangeQuery)
                               .Aggregations(childAggs => childAggs
                                             .Filters("result", filter => filter.NamedFilters(f =>
                    {
                        return(AddNamedFiltersforTaxonomy(facet));
                    }
                                                                                              ))
                                             )
                               );
                }
                else
                {
                    // Facet without taxonomies will use terms aggregations
                    agg.Filter(name, q => q
                               .Filter(aq => aggFilterQuery && dateRangeQuery)
                               .Aggregations(childAggs => childAggs
                                             .Terms("result", ter => ter.Field(facet.Name + ".outbound.value").Size(1000).MinimumDocumentCount(0))
                                             )
                               );
                }
            }

            return(agg);
        }
コード例 #4
0
        public static AggregationContainerDescriptor <T> SumBy <T>(this AggregationContainerDescriptor <T> agg, Expression <Func <T, object> > fieldGetter, Expression <Func <T, bool> > filterRule = null) where T : class
        {
            var aggName = fieldGetter.GetAggName(AggType.Sum);

            if (filterRule == null)
            {
                return(agg.Sum(aggName, x => x.Field(fieldGetter)));
            }

            var filterName = filterRule.GenerateFilterName();

            agg.Filter(filterName,
                       f =>
                       f.Filter(fd => filterRule.Body.GenerateFilterDescription <T>())
                       .Aggregations(innerAgg => innerAgg.Sum(aggName, field => field.Field(fieldGetter))));
            return(agg);
        }
コード例 #5
0
ファイル: SearchFilter.cs プロジェクト: carlingkirk/emergence
        public override AggregationContainerDescriptor <T> ToAggregationContainerDescriptor(AggregationContainerDescriptor <T> aggregationDescriptor)
        {
            if ((MinValue != null && !string.IsNullOrEmpty(MinValue?.ToString())) || (MaxValue != null && !string.IsNullOrEmpty(MaxValue.ToString())))
            {
                int.TryParse(MinValue?.ToString(), out var minValue);
                int.TryParse(MaxValue?.ToString(), out var maxValue);

                return(aggregationDescriptor
                       .Filter(Name, f => f.Filter(f =>
                {
                    QueryContainer query = null;
                    if (minValue > 0 && maxValue > 0)
                    {
                        var values = new List <int>();
                        for (var i = minValue; i <= maxValue; i++)
                        {
                            values.Add(i);
                        }
                        query = f.Terms(t => t.Field(Field).Terms(values));
                    }
                    else
                    {
                        if (minValue > 0)
                        {
                            query = f.Term(Field, minValue);
                        }
                        else if (maxValue > 0)
                        {
                            query = f.Term(Field, maxValue);
                        }
                    }

                    return query;
                }))
                       .Terms(Name, t => t
                              .Field(Field)));
            }
            else
            {
                return(aggregationDescriptor
                       .Terms(Name, t => t
                              .Field(Field)));
            }
        }