Esempio n. 1
0
        /// <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());
        }