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); }
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); }