private RearrangedSets Rearrange() { RearrangedSets sets = new RearrangedSets(); Attribute measures = GetMeasuresAttribute(); foreach (QuerySet set in this) { if (set.Attributes != null) { sets.AddRange(set.GetQuerySets()); } } if (measures.Levels[0].Members.Count > 0) { sets.Add(new QuerySet(measures.Levels[0].Members)); } return(sets); }
public JoinedMembers JoinMembers(Aggregation agg, bool shouldCleanUp = false) { if (agg == null && Attributes.Length == 0) { if (Measures.Length > 0) { Measure[] ms = Measures; JoinedMembers result = new JoinedMembers(); foreach (Measure m in ms) { AttributeMember mm = new AttributeMember(m.Name); mm.LinkedMeasure = m; result.Add(new AttributeMember[] { mm }); } return(result); } else { return(JoinedMembers.Empty); } } else { RearrangedSets sets = Rearrange(); if (shouldCleanUp) { sets.CleanUp(); } // return empty if no sets left after cleaned up if (sets.Count == 0) { return(JoinedMembers.Empty); } int depth = sets.Count; int[] indices = new int[depth]; int[] ceilings = new int[depth]; List <List <AttributeMember> > list = new List <List <AttributeMember> >(); for (int i = 0; i < depth; i++) { indices[i] = 0; ceilings[i] = sets[i].Count; } Join(0); void Join(int level) { for (int i = 0; i < ceilings[level]; i++) { indices[level] = i; if (level == depth - 1) { List <AttributeMember> members = new List <AttributeMember>(); for (int j = 0; j < depth; j++) { IQueryMember member = sets[j][indices[j]]; members.Add(member is AttributeMember ? (AttributeMember)member : ((HierarchyMember)member).Origin); } if (agg.GetIndex(members) > -1) { list.Add(members); } } else { Join(level + 1); } } } JoinedMembers result = new JoinedMembers(); list.ForEach(_ => result.Add(_.ToArray())); return(result); } }