/// <summary> /// Returns filters containing variables which exist in the store. /// If variable in the filter is filtered - use parent vararible. /// </summary> /// <param name="filters"></param> /// <returns></returns> private IVariableFilter[] GetFiltersInParent(IEnumerable <IVariableFilter> filters) { if (filters.Count() == 0 && Filters.Count == 0) { return(new IVariableFilter[0]); } var allFilters = new List <IVariableFilter>(); //convert variableValuefilter to parent..some assumptions here refactor to a more decorated architecture foreach (IVariableFilter filter in filters) { //TODO : refactor to a base class or something if ((filter is IVariableValueFilter) && (filter.Variable.Parent != null)) { var valueFilter = (filter as IVariableValueFilter); var parentVariable = (IVariable)(valueFilter.Variable.Parent); allFilters.Add(parentVariable.CreateValuesFilter(valueFilter.Values)); } else if ((filter is VariableIndexRangesFilter) && (filter.Variable.Parent != null)) { //this assumen indexes in the parent are the same.. VariableIndexRangesFilter indexFilter = (filter as VariableIndexRangesFilter); allFilters.Add(new VariableIndexRangesFilter((IVariable)(indexFilter.Variable.Parent), indexFilter.IndexRanges)); } else if ((filter is VariableAggregationFilter) && (filter.Variable.Parent != null)) { //this assumen indexes in the parent are the same.. VariableAggregationFilter aggregationFilter = (filter as VariableAggregationFilter); VariableAggregationFilter clone = (VariableAggregationFilter)aggregationFilter.Clone(); clone.Variable = (IVariable)filter.Variable.Parent; allFilters.Add(clone); } else { allFilters.Add(filter); } } if (Filters.Count != 0) { allFilters = Filters.Concat(allFilters).ToList(); } List <IVariableFilter> uniqueFilters = CombineCompatibleFilters(allFilters); if (uniqueFilters.OfType <IVariableValueFilter>().Any(f => f.Values.Count == 0)) { throw new InvalidOperationException("Variable value filters should have values!"); } return(uniqueFilters.ToArray()); }
private static int[] GetVariableIndexRangesFilterIndexes(VariableIndexRangesFilter variableIndexRangeFilter) { IList <int> indexesList = new List <int>(); foreach (var range in variableIndexRangeFilter.IndexRanges) { // do not assume the indices are ascending int step = (range.First < range.Second) ? 1 : -1; int number = Math.Abs(range.First - range.Second) + 1; for (int i = 0; i < number; i++) { indexesList.Add(range.First + (i * step)); } } return(indexesList.ToArray()); }