Exemple #1
0
        protected AggregationFilterModel <TParameters> MultiTermFilterFor(string filterName)
        {
            var propertyInfo = ParameterPropertyCache.FirstOrDefault(c => c.Key == filterName);

            if (string.IsNullOrWhiteSpace(propertyInfo.Key))
            {
                throw new ArgumentOutOfRangeException(nameof(filterName), $"Unable to find parameter named '{filterName}', ensure that either the parameters has a matching property or that a JsonProperty attribute is assigned");
            }

            var filterValue = ((IEnumerable <string>)propertyInfo.Value.GetValue(Parameters))?.ToList() ?? Enumerable.Empty <string>();

            var model = new AggregationFilterModel <TParameters>();
            var agg   = AggregationHelper.Terms(filterName);

            if (agg == null)
            {
                return(model);
            }

            model.Name        = filterName;
            model.Meta        = agg.Meta;
            model.Type        = agg.SearchifyAggregationType();
            model.DisplayName = agg.SearchifyDisplayName() ?? model.Name;

            model.Items = agg.Buckets.Select(item =>
            {
                var parameters = QueryStringParser <TParameters> .Copy(Parameters);

                var term  = item.Key;
                var value = item.Key;

                if (FilterField.TryParse(item.Key, out FilterField filterField))
                {
                    term  = filterField.Text;
                    value = filterField.Value;
                }

                var filterValueList = new HashSet <string>(filterValue);

                var isSelected = filterValue.Contains(value);

                if (isSelected)
                {
                    filterValueList.Remove(value);
                }
                else
                {
                    filterValueList.Add(value);
                }

                propertyInfo.Value.SetValue(parameters, filterValueList);

                return(new TermFilterItemModel <TParameters>()
                {
                    Term = term,
                    Value = value,
                    DocCount = item.DocCount,
                    Selected = isSelected,
                    Parameters = parameters
                });
            }).ToList();

            return(model);
        }
Exemple #2
0
        protected AggregationFilterModel <TParameters> TermFilterFor(string filterName)
        {
            var propertyInfo = ParameterPropertyCache.FirstOrDefault(c => c.Key == filterName);

            if (string.IsNullOrWhiteSpace(propertyInfo.Key))
            {
                throw new ArgumentOutOfRangeException(nameof(filterName), $"Unable to find parameter named '{filterName}', ensure that either the parameters has a matching property or that a JsonProperty attribute is assigned");
            }

            if (propertyInfo.Value.PropertyType != typeof(string))
            {
                return(MultiTermFilterFor(filterName));
            }

            var filterValue = propertyInfo.Value.GetValue(Parameters);

            var model = new AggregationFilterModel <TParameters>();
            var agg   = AggregationHelper.Terms(filterName);

            if (agg == null)
            {
                return(model);
            }

            model.Name        = filterName;
            model.Meta        = agg.Meta;
            model.Type        = agg.SearchifyAggregationType();
            model.DisplayName = agg.SearchifyDisplayName() ?? model.Name;

            model.Items = agg.Buckets.Select(item =>
            {
                var parameters = QueryStringParser <TParameters> .Copy(Parameters);

                var term  = item.Key;
                var value = item.Key;

                if (FilterField.TryParse(item.Key, out FilterField filterField))
                {
                    term  = filterField.Text;
                    value = filterField.Value;
                }

                var isSelected = value.Equals(filterValue);

                if (propertyInfo.Value != null)
                {
                    var convertablePropertyInfo = Nullable.GetUnderlyingType(propertyInfo.Value.PropertyType) ??
                                                  propertyInfo.Value.PropertyType;
                    propertyInfo.Value.SetValue(parameters,
                                                isSelected ? null : Convert.ChangeType(value, convertablePropertyInfo));
                }

                return(new TermFilterItemModel <TParameters>()
                {
                    Term = term,
                    Value = value,
                    DocCount = item.DocCount,
                    Selected = isSelected,
                    Parameters = parameters
                });
            }).ToList();

            return(model);
        }