Beispiel #1
0
            /// <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);
            }
Beispiel #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);
            }
        }