/// <summary> /// Reverse member selection of each attributes /// </summary> public QuerySets ReverseMembers() { List <QuerySet> list = new List <QuerySet>(); this.ForEach(set => { Attribute attr = null; if (set.Count > 0) { IQueryMember first = set[0]; attr = first is AttributeMember ? ((AttributeMember)first).Attribute : ((HierarchyMember)first).Attribute; if (attr != null) { QuerySet qs = new QuerySet(); qs.AddRange(attr.Levels[1].Members.Except(set)); list.Add(qs); } } }); return(list.Count > 0 ? new QuerySets(list) : QuerySets.Empty); }
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); } }