public MdxUpdateStatement(MdxObject Cube, MdxExpression Destination, MdxExpression Source)
			: this()
		{
			this.Cube = Cube;
			this.Destination = Destination;
			this.Source = Source;
		}
        MdxExpression SortExpression(MdxExpression expr, SortDescriptor descr)
        {
            if (descr == null)
            {
                return(expr);
            }

            if (!String.IsNullOrEmpty(descr.SortBy))
            {
                String orderType = String.Empty;
                if (descr.Type == SortTypes.Ascending)
                {
                    orderType = "BASC";
                }
                if (descr.Type == SortTypes.Descending)
                {
                    orderType = "BDESC";
                }

                if (!String.IsNullOrEmpty(orderType))
                {
                    expr = new MdxFunctionExpression("ORDER",
                                                     new MdxExpression[] {
                        expr,
                        new MdxObjectReferenceExpression(String.Format("({0})", descr.SortBy)),
                        new MdxConstantExpression(orderType)
                    });
                }
            }
            return(expr);
        }
 public MdxUpdateStatement(MdxObject Cube, MdxExpression Destination, MdxExpression Source)
     : this()
 {
     this.Cube        = Cube;
     this.Destination = Destination;
     this.Source      = Source;
 }
        //static MemberActionDrillDown GetMaxDrillAction(MemberActionDrillDown maxDrillDownAction, MemberActionDrillDown Action)
        //{
        //  if (Action == null)
        //    return maxDrillDownAction;
        //  if (maxDrillDownAction == null)
        //    return Action;
        //  return maxDrillDownAction.ReturnMostRestrictive(Action);
        //}

        //private MdxExpression GetWrappedExpression2(MdxExpression expr/*, Func<MdxObject, MdxActionContext, MdxObject> ConcretizeMdxObject*/)
        //{
        //  MemberActionDrillDown maxDrillDownAction = null;

        //  foreach (var Action in this.Actions)
        //    maxDrillDownAction = GetMaxDrillAction(maxDrillDownAction, Action as MemberActionDrillDown);

        //  if (maxDrillDownAction != null)
        //    expr = maxDrillDownAction.Process(expr);

        //  foreach (var Action in this.Actions)
        //  {
        //    if (Action is MemberActionDrillDown)
        //      continue;

        //    if (maxDrillDownAction != null)
        //      if (maxDrillDownAction.OutOfScope(Action))
        //        continue;

        //    expr = Action.Process(expr);
        //  }
        //  return expr;
        //}
        private MdxExpression GetWrappedExpression(MdxExpression expr)
        {
            foreach (var Action in this.Actions)
            {
                expr = Action.Process(expr);
            }
            return(expr);
        }
Exemple #5
0
 protected MdxWithClauseItem(MdxObjectReferenceExpression name, MdxExpression exp, IEnumerable <MdxCalcProperty> props)
     : this(name, exp)
 {
     if (props != null)
     {
         CalcProperties.AddRange(props);
     }
 }
Exemple #6
0
 public MdxBinaryExpression(
     MdxExpression leftExpression,
     MdxExpression rightExpression,
     string op)
 {
     this.Left     = leftExpression;
     this.Right    = rightExpression;
     this.Operator = op;
 }
Exemple #7
0
 public MdxWithCalculatedCellItem
     (MdxExpression ForExpression
     , MdxExpression AsExpression
     )
     : base(new MdxObjectReferenceExpression("CELL CALCULATION"), AsExpression)
 {
     this._ForExpression = ForExpression;
     this._AsExpression  = AsExpression;
 }
		public MdxBinaryExpression(
				MdxExpression leftExpression,
				MdxExpression rightExpression,
				string op)
		{
			this.Left = leftExpression;
			this.Right = rightExpression;
			this.Operator = op;
		}
		public MdxWithCalculatedCellItem
			(MdxExpression ForExpression
			, MdxExpression AsExpression
			)
			: base(new MdxObjectReferenceExpression("CELL CALCULATION"), AsExpression)
		{
			this._ForExpression = ForExpression;
			this._AsExpression = AsExpression;
		}
		public MdxAxis(
				string name,
				MdxExpression expression,
				MdxExpression having,
				IEnumerable<MdxExpression> DimensionProperties)
			: this(name, expression)
		{
			this.Having = having;
			if (DimensionProperties != null)
				this.DimensionProperties.AddRange(DimensionProperties);
		}
Exemple #11
0
 public MdxAxis(
     string name,
     MdxExpression expression,
     MdxExpression having,
     IEnumerable <MdxExpression> DimensionProperties)
     : this(name, expression)
 {
     this.Having = having;
     if (DimensionProperties != null)
     {
         this.DimensionProperties.AddRange(DimensionProperties);
     }
 }
Exemple #12
0
        private MdxSelectStatement CreateWrappedStatement()
        {
            if (!string.IsNullOrEmpty(Query) && m_OriginalStatement == null)
            {
                using (MdxDomProvider provider = MdxDomProvider.CreateProvider())
                {
                    m_OriginalStatement = provider.ParseMdx(this.Query) as MdxSelectStatement;
                }
            }

            MdxSelectStatement select = null;

            try
            {
                if (m_OriginalStatement != null)
                {
                    select = m_OriginalStatement.Clone() as MdxSelectStatement; // (MdxSelectStatement)Serializer.Deserialize(Serializer.Serialize(m_OriginalStatement));
                    if (select != null)
                    {
                        if (History.CurrentHistoryItem != null)
                        {
                            if (select.Axes.Count > 0)
                            {
                                select.Axes[0] = GetWrappedAxis(select.Axes[0], History.CurrentHistoryItem.ColumnsActionChain);
                                if (select.Axes.Count > 1)
                                {
                                    select.Axes[1] = GetWrappedAxis(select.Axes[1], History.CurrentHistoryItem.RowsActionChain);
                                }

                                // Переворот осей
                                if (RotateAxes)
                                {
                                    if (select.Axes.Count > 1)
                                    {
                                        MdxExpression axis0_expression = select.Axes[0].Expression;
                                        select.Axes[0].Expression = select.Axes[1].Expression;
                                        select.Axes[1].Expression = axis0_expression;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return(select);
        }
        protected override MdxObject ProcessCore(MdxObject mdx, MdxActionContext context)
        {
            MdxExpression expr = mdx as MdxExpression;

            if (expr == null)
            {
                return(mdx);
            }

            /*
             * Формируем запрос вида:
             *    SELECT
             * HIERARCHIZE(
             * FILTER(
             * DRILLUPMEMBER(HIERARCHIZE(CROSSJOIN(DRILLDOWNMEMBER({[Customer].[Customer Geography].[Country].[Australia]},[Customer].[Customer Geography].[Country].&[Australia]),{[Sales Territory].[Sales Territory].[Sales Territory Group].Members})),[Customer].[Customer Geography].[State-Province].&[NSW]&[AU])
             * ,
             * IsSibling([Customer].[Customer Geography].CURRENTMEMBER,[Customer].[Customer Geography].[State-Province].&[NSW]&[AU].PARENT)
             * )
             * ) ON 0,
             * HIERARCHIZE(HIERARCHIZE(head({[Product].[Product Categories].[Category].Members},10))) ON 1
             * FROM [Adventure Works]
             */
            MdxExpression drillUpExpr = new MdxFunctionExpression(
                "DRILLUPMEMBER",
                new MdxExpression[]
            {
                expr,
                new MdxObjectReferenceExpression(context.MemberUniqueName)
            });

            return(new MdxFunctionExpression(
                       "FILTER",
                       new MdxExpression[]
            {
                drillUpExpr,
                new MdxFunctionExpression(
                    "IsSibling",
                    new MdxExpression[]
                {
                    new MdxPropertyExpression(
                        new MdxObjectReferenceExpression(context.HierarchyUniqueName),
                        "CURRENTMEMBER"),
                    new MdxPropertyExpression(
                        new MdxObjectReferenceExpression(context.MemberUniqueName),
                        "PARENT")
                }
                    )
            }));
        }
        protected override MdxObject ProcessCore(MdxObject mdx, MdxActionContext context)
        {
            MdxExpression expr = mdx as MdxExpression;

            if (expr == null)
            {
                return(mdx);
            }

            return(new MdxFunctionExpression(
                       "DRILLUPMEMBER",
                       new MdxExpression[]
            {
                expr,
#warning Use context.MemberUniqueName instead this.MemberUniqueName?
                new MdxObjectReferenceExpression(context.MemberUniqueName)
            }));
        }
Exemple #15
0
        public MdxExpression Process(MdxExpression baseExpression)
        {
            //var hierarchies = new Dictionary<string, List<DrillActionContainer>>();
            //foreach (var action in this.Actions)
            //{
            //    List<DrillActionContainer> hierarchyActions;
            //    hierarchies.TryGetValue(action.HierarchyUniqueName, out hierarchyActions);
            //    if (hierarchyActions == null)
            //    {
            //        hierarchyActions = new List<DrillActionContainer>();
            //        hierarchies.Add(action.HierarchyUniqueName, hierarchyActions);
            //    }

            //    hierarchyActions.Add(action);
            //}

            var processedExpression = baseExpression;
            //foreach (var kv in hierarchies)
            //{
            //var flatList = new List<DrillActionContainer>();
            //this.GetFlatList(this.Actions, flatList);
            //flatList.Sort((a, b) => Comparer<int>.Default.Compare(b.Created, a.Created));
            //flatList)
            //{
            var drillContext = new DrillContext();

            processedExpression = this.ProcessActions(
                processedExpression,
                this.Actions,
                drillContext
                ) as MdxExpression;
            foreach (var co in drillContext.ConcreteObjects.Values)
            {
                if (co.Assign != null)
                {
                    co.Commit();
                }
            }
            //}
            //}

            return(processedExpression);
        }
Exemple #16
0
        private MdxExpression GetWrappedExpression(MdxExpression expr, IList <DrillActionContainer> actions)
        {
            if (actions == null)
            {
                return(expr);
            }

            //foreach (DrillActionContainer container in actions)
            //{
            //    if (container.Action != null)
            //    {
            //        if (container.Action is MdxActionBase)
            //        {
            //            if (passedHierarchies.Contains(container.HierarchyUniqueName))
            //            {
            //                ((MdxActionBase)container.Action).ConcretizeMdxObject = null;
            //            }
            //            else
            //            {
            //                ((MdxActionBase)container.Action).ConcretizeMdxObject = this.ConcretizeMdxObject;
            //            }
            //        }

            //        MdxExpression newExpr = container.Action.Process(expr, new MdxActionContext(container.HierarchyUniqueName, container.MemberUniqueName)) as MdxExpression;
            //        if (!passedHierarchies.Contains(container.HierarchyUniqueName))
            //        {
            //            passedHierarchies.Add(container.HierarchyUniqueName);
            //        }
            //        if (newExpr != null)
            //            expr = newExpr;
            //    }

            //    if (container.Children != null && container.Children.Count > 0)
            //        expr = GetWrappedExpression(expr, container.Children);
            //}

            var processor = new DrillActionProcessor(actions, this.ConcretizeMdxObject);

            expr = processor.Process(expr);
            return(expr);
        }
Exemple #17
0
        public override MdxExpression Process(MdxExpression expr)
        {
            if (expr == null)
            {
                return(null);
            }

            MdxExpression filter = new MdxUnaryExpression
                                       ("NOT"
                                       , new MdxFunctionExpression
                                           ("ISANCESTOR"
                                           , new MdxObjectReferenceExpression(args.Member.UniqueName)
                                           , new MdxObjectReferenceExpression(args.Member.HierarchyUniqueName + ".CURRENTMEMBER")
                                           )
                                       );
            var tupleBase = GenTupleBase();

            if (tupleBase.Members.Count > 0)
            {
                filter = new MdxBinaryExpression
                             (filter
                             , new MdxUnaryExpression
                                 ("NOT"
                                 , new MdxBinaryExpression
                                     (GenTupleBaseCurrent()
                                     , GenTupleBase()
                                     , "IS"
                                     )
                                 )
                             , "OR"
                             );
            }

            return(new MdxFunctionExpression
                       ("FILTER"
                       , expr
                       , filter
                       ));
        }
        public MdxExpression Process(MdxExpression baseExpression)
        {
            var processedExpression = baseExpression;
            var drillContext        = new DrillContext();

            processedExpression = this.ProcessActions(
                processedExpression,
                this.Actions,
                drillContext
                ) as MdxExpression;
            foreach (var assigners in drillContext.ConcreteObjects.Values)
            {
                foreach (var co in assigners.Values)
                {
                    if (co.Assign != null)
                    {
                        co.Commit();
                    }
                }
            }

            return(processedExpression);
        }
Exemple #19
0
        public override MdxExpression Process(MdxExpression expr)
        {
            if (expr == null)
            {
                return(null);
            }

            var tuple = GenTuple();

            if (tuple.Members.Count == 1)
            {
                return(new MdxFunctionExpression
                           ("DRILLDOWNMEMBER"
                           , expr
                           , tuple
                           ));
            }
            expr = new MdxBinaryExpression
                       (expr
                       , new MdxFunctionExpression(
                           "DRILLDOWNMEMBER"
                           , new MdxFunctionExpression
                               ("FILTER"
                               , expr
                               , new MdxBinaryExpression
                                   (GenTupleBaseCurrent()
                                   , GenTupleBase()
                                   , "IS"
                                   )
                               )
                           , new MdxObjectReferenceExpression(args.Member.UniqueName)
                           )
                       , "+"
                       );
            return(expr);
        }
		public MdxWhereClause(MdxExpression Expression)
		{
			this.Expression = Expression;
		}
		MdxExpression SortExpression(MdxExpression expr, SortDescriptor descr)
		{
			if (descr == null)
				return expr;

			if (!String.IsNullOrEmpty(descr.SortBy))
			{
				String orderType = String.Empty;
				if (descr.Type == SortTypes.Ascending)
					orderType = "BASC";
				if (descr.Type == SortTypes.Descending)
					orderType = "BDESC";

				if (!String.IsNullOrEmpty(orderType))
				{
					expr = new MdxFunctionExpression("ORDER",
					new MdxExpression[] {
                                expr,
                                new MdxObjectReferenceExpression(String.Format("({0})", descr.SortBy)),
                                new MdxConstantExpression(orderType) 
                            });
				}
			}
			return expr;
		}
		public MdxAxis(string name, MdxExpression expression)
			: this()
		{
			this.Name = name;
			this.Expression = expression;
		}
		public MdxCaseExpression(MdxExpression ValueItem, IEnumerable<MdxWhenClause> whenItems, MdxExpression elseItem)
			: this(whenItems, elseItem)
		{
			this._Value = ValueItem;
		}
Exemple #24
0
 public abstract MdxExpression Process(MdxExpression mdx);
		public MdxPropertyExpression(MdxExpression expr, MdxFunctionExpression func)
			: this(expr, func.Name)
		{
			this.Args.AddRange(func.Arguments);
			this.IsFunction = true;
		}
Exemple #26
0
        private MdxAxis GetWrappedAxis(MdxAxis ax, IList <DrillActionContainer> actions)
        {
            MdxExpression axisExpression = ax.Expression;

            // 1. Если первым на оси стоит ключевое слово NON EMPTY то выражение формируем из его аргументов, а уже потом все это выражение обрамляем ключевым словом NON EMPTY
            // 2. Если запрос на оси обрамлен функцией HIERARCHIZE, то выражение формируем из ее аргумента, а уже потом все это выражение обрамляем функцией HIERARCHIZE

            /*
             * Флаг NonEmpty перенесен в MdxAxis. Проверок не требуется.
             *
             * MdxNonEmptyExpression nonEmpty = ax.Expression as MdxNonEmptyExpression;
             * if (actions != null && actions.Count > 0)
             * {
             *  if (nonEmpty != null)
             *  {
             *      MdxExpression expression = nonEmpty.Expression;
             *      MdxFunctionExpression hierarchize = expression as MdxFunctionExpression;
             *      if (hierarchize != null && hierarchize.Name.ToLower() == "hierarchize" && hierarchize.Arguments.Count == 1)
             *      {
             *          expression = hierarchize.Arguments[0];
             *      }
             *
             *      axisExpression = new MdxNonEmptyExpression(
             *          new MdxFunctionExpression("HIERARCHIZE",
             *              new MdxExpression[]
             *          {
             *              GetWrappedExpression(expression, actions)
             *          }));
             *  }
             *  else
             *  {
             *      MdxExpression expression = ax.Expression;
             *      MdxFunctionExpression hierarchize = expression as MdxFunctionExpression;
             *      if (hierarchize != null && hierarchize.Name.ToLower() == "hierarchize" && hierarchize.Arguments.Count == 1)
             *      {
             *          expression = hierarchize.Arguments[0];
             *      }
             *
             *      axisExpression = new MdxFunctionExpression(
             *                   "HIERARCHIZE",
             *                   new MdxExpression[]
             *          {
             *              GetWrappedExpression(expression, actions)
             *          });
             *  }
             * }
             */

            if (actions.Count > 0)
            {
                var expression  = ax.Expression;
                var hierarchize = expression as MdxFunctionExpression;
                if (hierarchize != null && hierarchize.Name.ToLower() == "hierarchize" && hierarchize.Arguments.Count == 1)
                {
                    expression = hierarchize.Arguments[0];
                }

                axisExpression = new MdxFunctionExpression(
                    "HIERARCHIZE",
                    new MdxExpression[]
                {
                    GetWrappedExpression(expression, actions)
                });
            }


            // Возможность убрать пустые колонки

            /*
             * if (nonEmpty == null && actions == History.CurrentHistoryItem.ColumnsActionChain && HideEmptyColumns)
             * {
             *  axisExpression = new MdxNonEmptyExpression(axisExpression);
             * }
             */
            // Возможность убрать пустые строки

            /*
             * if (nonEmpty == null && actions == History.CurrentHistoryItem.RowsActionChain && HideEmptyRows)
             * {
             *  axisExpression = new MdxNonEmptyExpression(axisExpression);
             * }
             */
            if (History.CurrentHistoryItem.ColumnsActionChain.Equals(actions) && HideEmptyColumns)
            {
                ax.NonEmpty = true;
            }
            if (History.CurrentHistoryItem.RowsActionChain.Equals(actions) && HideEmptyRows)
            {
                ax.NonEmpty = true;
            }

            return(new MdxAxis(
                       ax.Name,
                       axisExpression,
                       ax.Having,
                       ax.DimensionProperties
                       )
            {
                NonEmpty = ax.NonEmpty
            });
        }
		public MdxUnaryExpression(string Operand, MdxExpression Expression)
		{
			this.Operand = Operand;
			this.Expression = Expression;
		}
		public MdxPropertyExpression(MdxExpression expr, string PropertyName)
		{
			this.Object = expr;
			this.Name = PropertyName;
			this.Args.ListChanged += Args_ListChanged;
		}
		protected MdxWithClauseItem(MdxObjectReferenceExpression Name, MdxExpression Expression)
		{
			this.Name = Name;
			this.Expression = Expression;
			this.CalcProperties.ListChanged+=_ClearChildTokens;
		}
		protected MdxWithClauseItem(MdxObjectReferenceExpression name, MdxExpression exp, IEnumerable<MdxCalcProperty> props)
			: this(name, exp)
		{
			if (props != null)
				CalcProperties.AddRange(props);
		}
		public MdxWithSetItem(MdxObjectReferenceExpression name, MdxExpression exp, IEnumerable<MdxCalcProperty> props)
			: base(name, exp, props)
		{
		}
 public MdxUnaryExpression(string Operand, MdxExpression Expression)
 {
     this.Operand    = Operand;
     this.Expression = Expression;
 }
		//static MemberActionDrillDown GetMaxDrillAction(MemberActionDrillDown maxDrillDownAction, MemberActionDrillDown Action)
		//{
		//  if (Action == null)
		//    return maxDrillDownAction;
		//  if (maxDrillDownAction == null)
		//    return Action;
		//  return maxDrillDownAction.ReturnMostRestrictive(Action);
		//}

		//private MdxExpression GetWrappedExpression2(MdxExpression expr/*, Func<MdxObject, MdxActionContext, MdxObject> ConcretizeMdxObject*/)
		//{
		//  MemberActionDrillDown maxDrillDownAction = null;

		//  foreach (var Action in this.Actions)
		//    maxDrillDownAction = GetMaxDrillAction(maxDrillDownAction, Action as MemberActionDrillDown);

		//  if (maxDrillDownAction != null)
		//    expr = maxDrillDownAction.Process(expr);

		//  foreach (var Action in this.Actions)
		//  {
		//    if (Action is MemberActionDrillDown)
		//      continue;

		//    if (maxDrillDownAction != null)
		//      if (maxDrillDownAction.OutOfScope(Action))
		//        continue;

		//    expr = Action.Process(expr);
		//  }
		//  return expr;
		//}
		private MdxExpression GetWrappedExpression(MdxExpression expr)
		{
			foreach (var Action in this.Actions)
			{
				expr = Action.Process(expr);
			}
			return expr;
		}
		public override MdxExpression Process(MdxExpression expr)
		{
			if (expr == null)
				return null;

			MdxExpression filter = new MdxUnaryExpression
							("NOT"
							, new MdxFunctionExpression
								("ISANCESTOR"
								, new MdxObjectReferenceExpression(args.Member.UniqueName)
								, new MdxObjectReferenceExpression(args.Member.HierarchyUniqueName + ".CURRENTMEMBER")
								)
							);
			var tupleBase = GenTupleBase();
			if (tupleBase.Members.Count > 0)
			{
				filter = new MdxBinaryExpression
						(filter
						, new MdxUnaryExpression
							("NOT"
							, new MdxBinaryExpression
								(GenTupleBaseCurrent()
								, GenTupleBase()
								, "IS"
								)
							)
						, "OR"
						);
			}

			return new MdxFunctionExpression
					("FILTER"
					, expr
					, filter
					);
		}
 public MdxCalcProperty(string Name, MdxExpression Expression)
 {
     this.Name       = Name;
     this.Expression = Expression;
 }
		public override MdxExpression Process(MdxExpression expr)
		{
			if (expr == null)
				return null;

			string uniqueName = args.Member.UniqueName;
			string hierarchyUniqueName = args.Member.HierarchyUniqueName;

			var drillDownExpr =
				new MdxFunctionExpression
				("Distinct"
				, new MdxFunctionExpression
					("DrillDownMember"
					, expr
					, new MdxObjectReferenceExpression(uniqueName)
					)
				);
			MdxExpression filter = new MdxFunctionExpression
						("IsAncestor"
						, new MdxObjectReferenceExpression(uniqueName)
						, new MdxObjectReferenceExpression(hierarchyUniqueName + ".CURRENTMEMBER")
						);

			MdxExpression isSelf = new MdxBinaryExpression
							(new MdxObjectReferenceExpression(uniqueName)
							, new MdxObjectReferenceExpression(hierarchyUniqueName + ".CURRENTMEMBER")
							, "IS"
							);

			if (HideSelf)
			{
				isSelf =
						new MdxBinaryExpression
						(isSelf
						, new MdxFunctionExpression
							("IsLeaf"
							, new MdxObjectReferenceExpression(uniqueName)
							)
						, "AND"
						);
			};

			filter =
					new MdxBinaryExpression
					(filter
					, isSelf
					, "OR"
					);
			if (!SingleDimension)
			{
				var tupleBase = GenTupleBase();
				if (tupleBase.Members.Count > 0)
				{
					filter = new MdxBinaryExpression
							(filter
							, new MdxBinaryExpression
									(GenTupleBaseCurrent()
									, GenTupleBase()
									, "IS"
									)
							, "AND"
							);
				}
			}
			return new MdxFunctionExpression("FILTER", drillDownExpr, filter);

		}
 public MdxCaseExpression(MdxExpression ValueItem, IEnumerable <MdxWhenClause> whenItems, MdxExpression elseItem)
     : this(whenItems, elseItem)
 {
     this._Value = ValueItem;
 }
        private MdxExpression GetWrappedExpression(MdxExpression expr, IList<DrillActionContainer> actions)
        {
            if (actions == null)
                return expr;

            //foreach (DrillActionContainer container in actions)
            //{
            //    if (container.Action != null)
            //    {
            //        if (container.Action is MdxActionBase)
            //        {
            //            if (passedHierarchies.Contains(container.HierarchyUniqueName))
            //            {
            //                ((MdxActionBase)container.Action).ConcretizeMdxObject = null;
            //            }
            //            else
            //            {
            //                ((MdxActionBase)container.Action).ConcretizeMdxObject = this.ConcretizeMdxObject;
            //            }
            //        }

            //        MdxExpression newExpr = container.Action.Process(expr, new MdxActionContext(container.HierarchyUniqueName, container.MemberUniqueName)) as MdxExpression;
            //        if (!passedHierarchies.Contains(container.HierarchyUniqueName))
            //        {
            //            passedHierarchies.Add(container.HierarchyUniqueName);
            //        }
            //        if (newExpr != null)
            //            expr = newExpr;
            //    }

            //    if (container.Children != null && container.Children.Count > 0)
            //        expr = GetWrappedExpression(expr, container.Children);
            //}

            var processor = new DrillActionProcessor(actions, this.ConcretizeMdxObject);
            expr = processor.Process(expr);
            return expr;
        }
Exemple #39
0
 public MdxAxis(string name, MdxExpression expression)
     : this()
 {
     this.Name       = name;
     this.Expression = expression;
 }
		public MdxCalcProperty(string Name, MdxExpression Expression)
		{
			this.Name = Name;
			this.Expression = Expression;
		}
 public MdxWhereClause(MdxExpression Expression)
 {
     this.Expression = Expression;
 }
 public MdxCaseExpression(IEnumerable <MdxWhenClause> whenItems, MdxExpression elseItem)
     : this(whenItems)
 {
     _Else = elseItem;
 }
        protected override MdxObject ProcessCore(MdxObject mdx, MdxActionContext context)
        {
            MdxExpression expr = mdx as MdxExpression;

            if (expr == null)
            {
                return(mdx);
            }

            /*
             * WITH
             * MEMBER [Сценарий].[Сценарии].[Сценарий] AS 'iif (1,[Сценарий].[Сценарии].&[План],[Сценарий].[Сценарии].&[Факт])'
             * SELECT
             * HIERARCHIZE({Descendants([Период].[ГКМ].[Год].&[2008],[Период].[ГКМ].[Месяц])}) DIMENSION PROPERTIES PARENT_UNIQUE_NAME ON 0,
             * HIERARCHIZE(
             * // ФИЛЬТР
             * FILTER
             * (
             *  DRILLDOWNMEMBER(FILTER(DRILLDOWNMEMBER(Crossjoin({StrToSet('[Персона].[Персонал].[Весь персонал]')},{[Номенклатура].[Вид-Группа-Номенклатура].[Вид].&[Технологические работы].Children}),[Номенклатура].[Вид-Группа-Номенклатура].[Группа].&[Абонентское и гарантийное обслуживание]),(((not ([Номенклатура].[Вид-Группа-Номенклатура].CURRENTMEMBER is [Номенклатура].[Вид-Группа-Номенклатура].[Группа].&[Абонентское и гарантийное обслуживание]))AND(not IsSibling([Номенклатура].[Вид-Группа-Номенклатура].CURRENTMEMBER,[Номенклатура].[Вид-Группа-Номенклатура].[Группа].&[Абонентское и гарантийное обслуживание])))AND(not IsAncestor([Номенклатура].[Вид-Группа-Номенклатура].CURRENTMEMBER,[Номенклатура].[Вид-Группа-Номенклатура].[Группа].&[Абонентское и гарантийное обслуживание])))),[Номенклатура].[Вид-Группа-Номенклатура].[Номенклатура].&[0x80000000000000DE])
             * ,
             * // УСЛОВИЕ ДЛЯ ФИЛЬТРА
             *  (
             *  // ПЕРВОЕ УСЛОВИЕ - Убираем сам элемент если у него количество дочерних не равно 0
             *                          not (
             *                                          ([Номенклатура].[Вид-Группа-Номенклатура].CURRENTMEMBER is [Номенклатура].[Вид-Группа-Номенклатура].[Номенклатура].&[0x80000000000000DE])
             *                                  and ([Номенклатура].[Вид-Группа-Номенклатура].[Номенклатура].&[0x80000000000000DE].Children.Count <> 0)
             *                                  )
             *                  AND
             *  // ВТОРОЕ УСЛОВИЕ - Убираем соседей, кроме самого элемента
             *                          not (
             *                                          IsSibling([Номенклатура].[Вид-Группа-Номенклатура].CURRENTMEMBER,[Номенклатура].[Вид-Группа-Номенклатура].[Номенклатура].&[0x80000000000000DE])
             *                                  and
             *                                          not([Номенклатура].[Вид-Группа-Номенклатура].CURRENTMEMBER is [Номенклатура].[Вид-Группа-Номенклатура].[Номенклатура].&[0x80000000000000DE])
             *                                  )
             *                  AND
             *  // ТРЕТЬЕ УСЛОВИЕ - Убираем предков элемента
             *                          not IsAncestor([Номенклатура].[Вид-Группа-Номенклатура].CURRENTMEMBER,[Номенклатура].[Вид-Группа-Номенклатура].[Номенклатура].&[0x80000000000000DE])
             *                  // ЧЕТВЕРТОЕ УСЛОВИЕ - Оставляем только потомков
             *                  AND
             *                  (
             *                          IsAncestor([Номенклатура].[Вид-Группа-Номенклатура].[Номенклатура].&[0x80000000000000DE], [Номенклатура].[Вид-Группа-Номенклатура].CURRENTMEMBER) or ([Номенклатура].[Вид-Группа-Номенклатура].CURRENTMEMBER is [Номенклатура].[Вид-Группа-Номенклатура].[Номенклатура].&[0x80000000000000DE])
             *                  )
             *  )
             * )
             *
             * ) DIMENSION PROPERTIES PARENT_UNIQUE_NAME ON 1
             *
             * FROM [Бюджет]
             * WHERE(
             * [Measures].[Количество],
             * [Статья].[Статьи].&[и_Ресурсы_Загрузка],
             * [ЦФО].[Менеджмент].&[У-5],
             * [Подразделение].[Подразделения].[Все подразделения].UNKNOWNMEMBER,
             * [Сценарий].[Сценарии].&[План]
             * )
             */
            MdxExpression drillDownExpr = new MdxFunctionExpression(
                "DRILLDOWNMEMBER",
                new MdxExpression[]
            {
                expr,
                new MdxObjectReferenceExpression(context.MemberUniqueName)
            });

            return(new MdxFunctionExpression(
                       "FILTER",
                       new MdxExpression[]
            {
                drillDownExpr,

                new MdxBinaryExpression(
                    new MdxBinaryExpression(

                        new MdxBinaryExpression
                        (
                            // ПЕРВОЕ УСЛОВИЕ - Убираем сам элемент если у него количество дочерних не равно 0
                            new MdxUnaryExpression
                            (
                                "not ",
                                new MdxBinaryExpression
                                (
                                    // Левый операнд
                                    // Кусок([Номенклатура].[Вид-Группа-Номенклатура].CURRENTMEMBER is [Номенклатура].[Вид-Группа-Номенклатура].[Номенклатура].&[0x80000000000000DE])
                                    new MdxBinaryExpression(
                                        new MdxPropertyExpression(
                                            new MdxObjectReferenceExpression(context.HierarchyUniqueName),
                                            "CURRENTMEMBER")
                                        ,
                                        new MdxObjectReferenceExpression(context.MemberUniqueName),
                                        " is "
                                        ),
                                    // Правый операнд
                                    // Кусок ([Номенклатура].[Вид-Группа-Номенклатура].[Номенклатура].&[0x80000000000000DE].Children.Count <> 0)
                                    new MdxBinaryExpression(
                                        // Левый операнд
                                        new MdxPropertyExpression(
                                            new MdxPropertyExpression(
                                                new MdxObjectReferenceExpression(context.MemberUniqueName),
                                                "Children"),
                                            "Count"),
                                        // Правый операнд
                                        new MdxConstantExpression("0", MdxConstantKind.Integer),
                                        // Операция
                                        "<>"
                                        ),
                                    // Операция
                                    "AND"
                                )

                            ),
                            // ВТОРОЕ УСЛОВИЕ - Убираем соседей, кроме самого элемента
                            new MdxUnaryExpression
                            (
                                "not ",
                                new MdxBinaryExpression
                                (
                                    // Левый операнд
                                    // Кусок IsSibling([Номенклатура].[Вид-Группа-Номенклатура].CURRENTMEMBER,[Номенклатура].[Вид-Группа-Номенклатура].[Номенклатура].&[0x80000000000000DE])
                                    new MdxFunctionExpression
                                    (
                                        "IsSibling",
                                        new MdxExpression[]
                {
                    new MdxPropertyExpression(
                        new MdxObjectReferenceExpression(context.HierarchyUniqueName),
                        "CURRENTMEMBER"),
                    new MdxObjectReferenceExpression(context.MemberUniqueName)
                }
                                    ),
                                    // Правый операнд
                                    // Кусок not([Номенклатура].[Вид-Группа-Номенклатура].CURRENTMEMBER is [Номенклатура].[Вид-Группа-Номенклатура].[Номенклатура].&[0x80000000000000DE])
                                    new MdxUnaryExpression
                                    (
                                        "not ",
                                        new MdxBinaryExpression
                                        (
                                            new MdxPropertyExpression(
                                                new MdxObjectReferenceExpression(context.HierarchyUniqueName),
                                                "CURRENTMEMBER")
                                            ,
                                            new MdxObjectReferenceExpression(context.MemberUniqueName),
                                            " is "
                                        )
                                    )
                                    ,
                                    // Операция
                                    "AND"
                                )
                            )
                            ,
                            // Операция
                            "AND"
                        ),
                        // ТРЕТЬЕ УСЛОВИЕ - Убираем предков элемента
                        new MdxUnaryExpression
                        (
                            "not ",
                            new MdxFunctionExpression(
                                "IsAncestor",
                                new MdxExpression[]
                {
                    new MdxPropertyExpression(
                        new MdxObjectReferenceExpression(context.HierarchyUniqueName),
                        "CURRENTMEMBER"),
                    new MdxObjectReferenceExpression(context.MemberUniqueName)
                })
                        )
                        ,
                        // Операция
                        "AND"
                        )
                    ,

                    // ЧЕТВЕРТОЕ УСЛОВИЕ - Оставляем только потомков
                    // Кусок IsAncestor([Номенклатура].[Вид-Группа-Номенклатура].[Номенклатура].&[0x80000000000000DE], [Номенклатура].[Вид-Группа-Номенклатура].CURRENTMEMBER) or ([Номенклатура].[Вид-Группа-Номенклатура].CURRENTMEMBER is [Номенклатура].[Вид-Группа-Номенклатура].[Номенклатура].&[0x80000000000000DE])
                    new MdxBinaryExpression
                    (
                        new MdxFunctionExpression
                        (
                            "IsAncestor",
                            new MdxExpression[]
                {
                    new MdxObjectReferenceExpression(context.MemberUniqueName),
                    new MdxPropertyExpression(
                        new MdxObjectReferenceExpression(context.HierarchyUniqueName),
                        "CURRENTMEMBER")
                }
                        ),
                        new MdxBinaryExpression
                        (
                            new MdxPropertyExpression(
                                new MdxObjectReferenceExpression(context.HierarchyUniqueName),
                                "CURRENTMEMBER")
                            ,
                            new MdxObjectReferenceExpression(context.MemberUniqueName),
                            " is "
                        ),
                        "OR"
                    )
                    ,
                    // Операция
                    "AND"
                    )
            }
                       ));
        }
        internal MdxAxis GetWrappedAxis(MdxAxis ax /*, Func<MdxObject, MdxActionContext, MdxObject> ConcretizeMdxObject */)
        {
            MdxExpression axisExpression = ax.Expression;

            // 1. Если первым на оси стоит ключевое слово NON EMPTY то выражение формируем из его аргументов, а уже потом все это выражение обрамляем ключевым словом NON EMPTY
            // 2. Если запрос на оси обрамлен функцией HIERARCHIZE, то выражение формируем из ее аргумента, а уже потом все это выражение обрамляем функцией HIERARCHIZE

            /*
             * Флаг NonEmpty перенесен в MdxAxis. Проверок не требуется.
             *
             * MdxNonEmptyExpression nonEmpty = ax.Expression as MdxNonEmptyExpression;
             * if (actions != null && actions.Count > 0)
             * {
             *              if (nonEmpty != null)
             *              {
             *                              MdxExpression expression = nonEmpty.Expression;
             *                              MdxFunctionExpression hierarchize = expression as MdxFunctionExpression;
             *                              if (hierarchize != null && hierarchize.Name.ToLower() == "hierarchize" && hierarchize.Arguments.Count == 1)
             *                              {
             *                                              expression = hierarchize.Arguments[0];
             *                              }
             *
             *                              axisExpression = new MdxNonEmptyExpression(
             *                                              new MdxFunctionExpression("HIERARCHIZE",
             *                                                              new MdxExpression[]
             *                                              {
             *                                                              GetWrappedExpression(expression, actions)
             *                                              }));
             *              }
             *              else
             *              {
             *                              MdxExpression expression = ax.Expression;
             *                              MdxFunctionExpression hierarchize = expression as MdxFunctionExpression;
             *                              if (hierarchize != null && hierarchize.Name.ToLower() == "hierarchize" && hierarchize.Arguments.Count == 1)
             *                              {
             *                                              expression = hierarchize.Arguments[0];
             *                              }
             *
             *                              axisExpression = new MdxFunctionExpression(
             *                                                                               "HIERARCHIZE",
             *                                                                               new MdxExpression[]
             *                                              {
             *                                                              GetWrappedExpression(expression, actions)
             *                                              });
             *              }
             * }
             */

            if (Actions.Count > 0)
            {
                var expression = ax.Expression;
                axisExpression = this.GetWrappedExpression(expression /*, ConcretizeMdxObject*/);
            }
            axisExpression = SortExpression(axisExpression, MeasuresSort);

            return(new MdxAxis(
                       ax.Name,
                       axisExpression,
                       ax.Having,
                       ax.DimensionProperties
                       )
            {
                // Возможность убрать пустые колонки
                NonEmpty = HideEmpty
            });
        }
Exemple #45
0
 public MdxPropertyExpression(MdxExpression expr, MdxFunctionExpression func)
     : this(expr, func.Name)
 {
     this.Args.AddRange(func.Arguments);
     this.IsFunction = true;
 }
		public MdxCaseExpression(IEnumerable<MdxWhenClause> whenItems, MdxExpression elseItem)
			: this(whenItems)
		{
			_Else = elseItem;
		}
Exemple #47
0
 public MdxPropertyExpression(MdxExpression expr, string PropertyName)
 {
     this.Object            = expr;
     this.Name              = PropertyName;
     this.Args.ListChanged += Args_ListChanged;
 }
Exemple #48
0
 public MdxWithSetItem(MdxObjectReferenceExpression name, MdxExpression exp, IEnumerable <MdxCalcProperty> props)
     : base(name, exp, props)
 {
 }
		public abstract MdxExpression Process(MdxExpression mdx);
Exemple #50
0
        public override MdxExpression Process(MdxExpression expr)
        {
            if (expr == null)
            {
                return(null);
            }

            string uniqueName          = args.Member.UniqueName;
            string hierarchyUniqueName = args.Member.HierarchyUniqueName;

            var drillDownExpr =
                new MdxFunctionExpression
                    ("Distinct"
                    , new MdxFunctionExpression
                        ("DrillDownMember"
                        , expr
                        , new MdxObjectReferenceExpression(uniqueName)
                        )
                    );
            MdxExpression filter = new MdxFunctionExpression
                                       ("IsAncestor"
                                       , new MdxObjectReferenceExpression(uniqueName)
                                       , new MdxObjectReferenceExpression(hierarchyUniqueName + ".CURRENTMEMBER")
                                       );

            MdxExpression isSelf = new MdxBinaryExpression
                                       (new MdxObjectReferenceExpression(uniqueName)
                                       , new MdxObjectReferenceExpression(hierarchyUniqueName + ".CURRENTMEMBER")
                                       , "IS"
                                       );

            if (HideSelf)
            {
                isSelf =
                    new MdxBinaryExpression
                        (isSelf
                        , new MdxFunctionExpression
                            ("IsLeaf"
                            , new MdxObjectReferenceExpression(uniqueName)
                            )
                        , "AND"
                        );
            }
            ;

            filter =
                new MdxBinaryExpression
                    (filter
                    , isSelf
                    , "OR"
                    );
            if (!SingleDimension)
            {
                var tupleBase = GenTupleBase();
                if (tupleBase.Members.Count > 0)
                {
                    filter = new MdxBinaryExpression
                                 (filter
                                 , new MdxBinaryExpression
                                     (GenTupleBaseCurrent()
                                     , GenTupleBase()
                                     , "IS"
                                     )
                                 , "AND"
                                 );
                }
            }
            return(new MdxFunctionExpression("FILTER", drillDownExpr, filter));
        }
		public override MdxExpression Process(MdxExpression expr)
		{
			if (expr == null)
				return null;

			var tuple = GenTuple();
			if (tuple.Members.Count == 1)
			{
				return new MdxFunctionExpression
				("DRILLDOWNMEMBER"
				, expr
				, tuple
				);
			}
			expr = new MdxBinaryExpression
			 (expr
			 , new MdxFunctionExpression(
				 "DRILLDOWNMEMBER"
				 , new MdxFunctionExpression
						("FILTER"
						, expr
						, new MdxBinaryExpression
							(GenTupleBaseCurrent()
							, GenTupleBase()
							, "IS"
							)
						)
				 , new MdxObjectReferenceExpression(args.Member.UniqueName)
				 )
				, "+"
				);
			return expr;
		}
 public MdxWhenClause(MdxExpression when, MdxExpression then)
 {
     this._When = when;
     this._Then = then;
 }
		public MdxWhenClause(MdxExpression when, MdxExpression then)
		{
			this._When = when;
			this._Then = then;
		}