protected FilterParenthood <Filter.Filter, Filter.Group> GetFirstSubGroupFilter(Filter.Filter filter)
        {
            var e = VisitAllSubGroupFilters(filter).GetEnumerator();

            if (e.MoveNext())
            {
                return(e.Current);
            }
            return(new FilterParenthood <Filter.Filter, Filter.Group>());
        }
        protected FilterParenthood <Filter.Filter, Filter.Group> GetDeepestGroupFilter(Filter.Filter filter)
        {
            foreach (var f in filter.SubFilters())
            {
                var sgf = GetDeepestGroupFilter(f);
                if (sgf.child != null)
                {
                    return(sgf);
                }

                if (f is Filter.Group)
                {
                    Filter.Group gf = (Filter.Group)f;
                    return(new FilterParenthood <Filter.Filter, Filter.Group>(filter, gf));
                }
            }

            return(new FilterParenthood <Filter.Filter, Filter.Group>());
        }
 protected IEnumerable <FilterParenthood <Filter.Filter, Filter.Group> > VisitAllSubGroupFilters(Filter.Filter filter)
 {
     foreach (var f in filter.SubFilters())
     {
         if (f is Filter.Group)
         {
             Filter.Group gf = (Filter.Group)f;
             yield return(new FilterParenthood <Filter.Filter, Filter.Group>(filter, gf));
         }
         foreach (var f2 in VisitAllSubGroupFilters(f))
         {
             yield return(f2);
         }
     }
 }