示例#1
0
        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);
        }
示例#2
0
        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);
            }
        }