private MdxObject ProcessActions(
            MdxObject baseObject,
            IEnumerable <DrillActionContainer> rootActions,
            DrillContext drillContext)
        {
            foreach (var rootAction in rootActions)
            {
                if (rootAction.Action != null)
                {
                    drillContext.MdxContext = new MdxActionContext(rootAction.HierarchyUniqueName, rootAction.MemberUniqueName);
                    drillContext.RootAction = rootAction;
                    drillContext.Processed  = false;
                    baseObject = this.ProcessConcreteObject(
                        baseObject,
                        drillContext,
                        null);
                    if (!drillContext.Processed)
                    {
                        baseObject = rootAction.Action.Process(baseObject, drillContext.MdxContext);
                    }
                }
                baseObject = this.ProcessActions(baseObject, rootAction.Children, drillContext);
            }

            return(baseObject);
        }
Esempio n. 2
0
        MdxObject CalculateLength(MdxObject MdxObject)
        {
            if (MdxObject == null)
            {
                return(null);
            }

            MdxObject = tryReduceIIF(MdxObject);

            if (MdxObject.ChildTokens != null)
            {
                MdxObject._Length = 0;
                foreach (var mdx in MdxObject.ChildTokens)
                {
                    var mdx1 = CalculateLength(mdx);
                    if (mdx1 != null)
                    {
                        MdxObject._Length += mdx1._Length;
                    }
                    else
                    {
                        MdxObject._Length += 80;
                    }
                }
            }
            else if (MdxObject.SelfToken == null)
            {
                MdxObject._Length = 0;
            }
            else
            {
                MdxObject._Length = MdxObject.SelfToken.Length + 1;                 // 1 - SPACE before token
            }
            return(MdxObject);
        }
		MdxObject CalculateLength(MdxObject MdxObject)
		{
			if (MdxObject == null)
				return null;

			MdxObject = tryReduceIIF(MdxObject);

			if (MdxObject.ChildTokens != null)
			{
				MdxObject._Length = 0;
				foreach (var mdx in MdxObject.ChildTokens)
				{
					var mdx1 = CalculateLength(mdx);
					if (mdx1 != null)
					{
						MdxObject._Length += mdx1._Length;
					}
					else
						MdxObject._Length += 80;
				}
			}
			else if (MdxObject.SelfToken == null)
				MdxObject._Length = 0;
			else
				MdxObject._Length = MdxObject.SelfToken.Length + 1; // 1 - SPACE before token

			return MdxObject;

		}
		public void GenerateMdxFromDom(MdxObject mdx, Stream outputStream, MdxGeneratorOptions options)
		{
			using (StreamWriter sw = new StreamWriter(outputStream))
			{
				this.CreateMdxGenerator().GenerateMdxFromDom(mdx, sw, options);
				sw.Flush();
			}
		}
		public void GenerateMdxFromDom(MdxObject mdx, string fileName, MdxGeneratorOptions options)
		{
			using (StreamWriter sw = new StreamWriter(fileName))
			{
				this.CreateMdxGenerator().GenerateMdxFromDom(mdx, sw, options);
				sw.Flush();
			}
		}
 public void GenerateMdxFromDom(MdxObject mdx, string fileName, MdxGeneratorOptions options)
 {
     using (StreamWriter sw = new StreamWriter(fileName))
     {
         this.CreateMdxGenerator().GenerateMdxFromDom(mdx, sw, options);
         sw.Flush();
     }
 }
 public void GenerateMdxFromDom(MdxObject mdx, Stream outputStream, MdxGeneratorOptions options)
 {
     using (StreamWriter sw = new StreamWriter(outputStream))
     {
         this.CreateMdxGenerator().GenerateMdxFromDom(mdx, sw, options);
         sw.Flush();
     }
 }
        private static string GetMdx(MdxObject obj)
        {
            using (var provider = Ranet.Olap.Mdx.Compiler.MdxDomProvider.CreateProvider())
            {
                var sb = new StringBuilder();
                provider.GenerateMdxFromDom(obj, sb, new Ranet.Olap.Mdx.Compiler.MdxGeneratorOptions());

                return(sb.ToString());
            }
        }
Esempio n. 9
0
 public void GenerateMdxFromDom(MdxObject mdx, TextWriter tw, MdxGeneratorOptions op)
 {
     this.tw            = tw;
     this.options       = op;
     this.NoSpaceBefore = true;
     curShift           = 0;
     curShiftStr        = "";
     mdx = CalculateLength(mdx);
     GenerateMdx(mdx);
 }
		public void GenerateMdxFromDom(MdxObject mdx, TextWriter tw, MdxGeneratorOptions op)
		{
			this.tw = tw;
			this.options = op;
			this.NoSpaceBefore = true;
			curShift = 0;
			curShiftStr = "";
			mdx = CalculateLength(mdx);
			GenerateMdx(mdx);
		}
		public void GenerateMdxFromDom(MdxObject mdx, StringBuilder builder, MdxGeneratorOptions options)
		{
			using (StringWriter sw = new StringWriter(builder))
			{
				try
				{
					this.CreateMdxGenerator().GenerateMdxFromDom(mdx, sw, options);
				}
				finally
				{
					sw.Flush();
				}
			}
		}
 public void GenerateMdxFromDom(MdxObject mdx, StringBuilder builder, MdxGeneratorOptions options)
 {
     using (StringWriter sw = new StringWriter(builder))
     {
         try
         {
             this.CreateMdxGenerator().GenerateMdxFromDom(mdx, sw, options);
         }
         finally
         {
             sw.Flush();
         }
     }
 }
        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)
            }));
        }
 public MdxObject Process(MdxObject mdx, MdxActionContext context)
 {
     return(this.ProcessCore(mdx, context));
 }
 public void GenerateMdxFromDom(MdxObject mdx, TextWriter writer, MdxGeneratorOptions options)
 {
     this.CreateMdxGenerator().GenerateMdxFromDom(mdx, writer, options);
 }
		MdxObject tryReduceIIF(MdxObject MdxObject)
		{
			var tuple= MdxObject as MdxTupleExpression;
			if (tuple!=null)
				if (tuple.Members.Count==1)
					return tryReduceIIF(tuple.Members[0]);
			
			if (!options.EvaluateConstantExpressions)
				return MdxObject;

			var Func = MdxObject as MdxFunctionExpression;
			if (Func == null)
				return MdxObject;

			if (Func.Name == null)
				return MdxObject;
			if (Func.Name.ToLower() != "iif")
				return MdxObject;
			if (Func.Arguments.Count != 3)
				return MdxObject;
				
			var cond = tryReduceIIF(Func.Arguments[0]) as MdxBinaryExpression;
			if (cond == null)
				return MdxObject;
			if (cond.Operator != "=")
				return MdxObject;
				
			var left=tryReduceIIF(cond.Left) as MdxConstantExpression;
			if (left == null)
				return MdxObject;
			var right = tryReduceIIF(cond.Right) as MdxConstantExpression;
			if (right == null)
				return MdxObject;

			if (left.Value == null)
				return MdxObject;
			if (right.Value == null)
				return MdxObject;

			if (ConstAsString(left) == ConstAsString(right))
				return tryReduceIIF(Func.Arguments[1]);
			else
				return tryReduceIIF(Func.Arguments[2]);
		}
Esempio n. 18
0
        MdxObject tryReduceIIF(MdxObject MdxObject)
        {
            var tuple = MdxObject as MdxTupleExpression;

            if (tuple != null)
            {
                if (tuple.Members.Count == 1)
                {
                    return(tryReduceIIF(tuple.Members[0]));
                }
            }

            if (!options.EvaluateConstantExpressions)
            {
                return(MdxObject);
            }

            var Func = MdxObject as MdxFunctionExpression;

            if (Func == null)
            {
                return(MdxObject);
            }

            if (Func.Name == null)
            {
                return(MdxObject);
            }
            if (Func.Name.ToLower() != "iif")
            {
                return(MdxObject);
            }
            if (Func.Arguments.Count != 3)
            {
                return(MdxObject);
            }

            var cond = tryReduceIIF(Func.Arguments[0]) as MdxBinaryExpression;

            if (cond == null)
            {
                return(MdxObject);
            }
            if (cond.Operator != "=")
            {
                return(MdxObject);
            }

            var left = tryReduceIIF(cond.Left) as MdxConstantExpression;

            if (left == null)
            {
                return(MdxObject);
            }
            var right = tryReduceIIF(cond.Right) as MdxConstantExpression;

            if (right == null)
            {
                return(MdxObject);
            }

            if (left.Value == null)
            {
                return(MdxObject);
            }
            if (right.Value == null)
            {
                return(MdxObject);
            }

            if (ConstAsString(left) == ConstAsString(right))
            {
                return(tryReduceIIF(Func.Arguments[1]));
            }
            else
            {
                return(tryReduceIIF(Func.Arguments[2]));
            }
        }
Esempio n. 19
0
        public void GenerateMdx(MdxObject mdx)
        {
            if (null == mdx)
            {
                Write("!ERROR while parsing MDX!");
                LastNeedNewLine = true;
                return;
            }
            mdx = tryReduceIIF(mdx);
            int    curShiftSave    = this.curShift;
            string curShiftStrSave = this.curShiftStr;

            try
            {
                if (mdx.ChildTokens != null)
                {
                    bool NeedNewLine = (mdx._Length + curShift) > 80;
                    foreach (MdxObject mdxChild in mdx.ChildTokens)
                    {
                        if (MdxObject.IncShift == mdxChild)
                        {
                            inc();
                        }
                        else if (MdxObject.DecShift == mdxChild)
                        {
                            dec();
                        }
                        else if (mdxChild == MdxObject.NewLine)
                        {
                            if (NeedNewLine)
                            {
                                LastNeedNewLine = true;
                            }
                        }
                        else
                        {
                            GenerateMdx(mdxChild);
                        }
                    }
                }
                else if (mdx.SelfToken != null)
                {
                    if (mdx.SelfToken.Length > 0)
                    {
                        if (LastNeedNewLine)
                        {
                            tw.WriteLine();
                            tw.Write(curShiftStr);
                        }
                        else if (!NoSpaceBefore)
                        {
                            if (mdx.SelfToken != ".")
                            {
                                tw.Write(" ");
                            }
                        }
                        Write(mdx.SelfToken);
                        if (mdx.SelfToken == ".")
                        {
                            NoSpaceBefore = true;
                        }
                        else
                        {
                            NoSpaceBefore = false;
                        }

                        LastNeedNewLine = false;
                        //LastNeedSpace = mdx.NeedSpaceAfter;
                    }
                }
                else
                {
                    tw.WriteLine();
                    tw.Write(curShiftStr);
                    Write("?Unknown token=" + mdx.ToString() + "?");
                    LastNeedNewLine = true;
                }
            }
            finally
            {
                this.curShift    = curShiftSave;
                this.curShiftStr = curShiftStrSave;
            }
        }
		public void GenerateMdx(MdxObject mdx)
		{
			if (null == mdx)
			{
				Write("!ERROR while parsing MDX!");
				LastNeedNewLine = true;
				return;
			}
			mdx = tryReduceIIF(mdx);
			int curShiftSave = this.curShift;
			string curShiftStrSave = this.curShiftStr;
			try
			{
				if (mdx.ChildTokens != null)
				{
					bool NeedNewLine = (mdx._Length + curShift) > 80;
					foreach (MdxObject mdxChild in mdx.ChildTokens)
						if (MdxObject.IncShift == mdxChild)
							inc();
						else if (MdxObject.DecShift == mdxChild)
							dec();
						else if (mdxChild == MdxObject.NewLine)
						{
							if (NeedNewLine)
								LastNeedNewLine = true;
						}
						else GenerateMdx(mdxChild);
				}
				else if (mdx.SelfToken != null)
				{
					if (mdx.SelfToken.Length > 0)
					{
						if (LastNeedNewLine)
						{
							tw.WriteLine();
							tw.Write(curShiftStr);
						}
						else if (!NoSpaceBefore)
						{
							if (mdx.SelfToken != ".")
							{
								tw.Write(" ");
							}
						}
						Write(mdx.SelfToken);
						if (mdx.SelfToken == ".")
							NoSpaceBefore = true;
						else
							NoSpaceBefore = false;

						LastNeedNewLine = false;
						//LastNeedSpace = mdx.NeedSpaceAfter;
					}
				}
				else
				{
					tw.WriteLine();
					tw.Write(curShiftStr);
					Write("?Unknown token=" + mdx.ToString() + "?");
					LastNeedNewLine = true;
				}
			}
			finally
			{
				this.curShift = curShiftSave;
				this.curShiftStr = curShiftStrSave;
			}
		}
        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"
                    )
            }
                       ));
        }
        private MdxObject ProcessConcreteObject(MdxObject baseObject, DrillContext context, Action <MdxExpression> assign)
        {
            if (baseObject == null)
            {
                return(null);
            }

            var concreteObject = this.ConcretizeMdxObject != null?
                                 this.ConcretizeMdxObject(baseObject, context.MdxContext) :
                                     baseObject;

            if (concreteObject != null)
            {
                Dictionary <MdxObject, ConcreteObjectAssigner> assigners;
                context.ConcreteObjects.TryGetValue(context.MdxContext.HierarchyUniqueName, out assigners);
                if (assigners == null)
                {
                    assigners = new Dictionary <MdxObject, ConcreteObjectAssigner>();
                    context.ConcreteObjects.Add(context.MdxContext.HierarchyUniqueName, assigners);
                }

                ConcreteObjectAssigner assigner;
                assigners.TryGetValue(baseObject, out assigner);
                if (assigner == null)
                {
                    assigner        = new ConcreteObjectAssigner();
                    assigner.Object = concreteObject;
                    assigner.Assign = assign;
                    assigners.Add(baseObject, assigner);
                }

                context.Processed = true;
                concreteObject    = context.RootAction.Action.Process(assigner.Object, context.MdxContext);

                //context.ConcreteObjects[context.MdxContext.HierarchyUniqueName]
                assigners[baseObject].Object = concreteObject;

                //concreteObject = this.ProcessActions2(baseObject, context.RootAction, context.MdxContext);
                //concreteObject = this.ProcessActions(
                //    concreteObject,
                //    context.RootAction,
                //    context.MdxContext);

                return(concreteObject);
            }

            if (baseObject is MdxBinaryExpression)
            {
                var binExpr = baseObject as MdxBinaryExpression;
                context.Parents.Push(baseObject);
                this.ProcessConcreteObject(binExpr.Left, context, left => binExpr.Left = left);
                //var left =
                //if (left != null)
                //{
                //    binExpr.Left = left;
                //}
                this.ProcessConcreteObject(binExpr.Right, context, right => binExpr.Right = right);
                context.Parents.Pop();
                //var right =
                //if (right != null)
                //{
                //    binExpr.Right = right;
                //}
            }
            if (baseObject is MdxCalcProperty)
            {
                var calcProp = baseObject as MdxCalcProperty;
                context.Parents.Push(baseObject);
                this.ProcessConcreteObject(calcProp.Expression, context, expr => calcProp.Expression = expr);
                //var expr =
                //if (expr != null)
                //{
                //    calcProp.Expression = expr;
                //}
                context.Parents.Pop();
            }
            if (baseObject is MdxCaseExpression)
            {
                var caseExpr = baseObject as MdxCaseExpression;
                context.Parents.Push(baseObject);
                this.ProcessConcreteObject(caseExpr.Value, context, value => caseExpr.Value = value);
                //var value =
                //if (value != null)
                //{
                //    caseExpr.Value = value;
                //}
                this.ProcessConcreteObject(caseExpr.Else, context, elseExpr => caseExpr.Else = elseExpr);
                //var elseExpr =
                //if (elseExpr != null)
                //{
                //    caseExpr.Else = elseExpr;
                //}
                foreach (var whenClause in caseExpr.When)
                {
                    this.ProcessConcreteObject(whenClause, context, null);
                }
                context.Parents.Pop();
            }
            //if (baseObject is MdxConstantExpression)
            //{
            //}
            if (baseObject is MdxFunctionExpression)
            {
                var funcExpr = baseObject as MdxFunctionExpression;
                context.Parents.Push(baseObject);
                for (int i = 0; i < funcExpr.Arguments.Count; i++)
                {
                    var j = i;
                    this.ProcessConcreteObject(funcExpr.Arguments[i], context, expr => funcExpr.Arguments[j] = expr);
                    //var expr =
                    //if (expr != null)
                    //{
                    //    funcExpr.Arguments[i] = expr;
                    //}
                }
                context.Parents.Pop();
            }
            //if (baseObject is MdxObjectList<>)
            //{
            //}
            //if (baseObject is MdxObjectReferenceExpression)
            //{
            //}
            //if (baseObject is MdxParameterExpression)
            //{
            //}
            if (baseObject is MdxPropertyExpression)
            {
                var propExpr = baseObject as MdxPropertyExpression;
                context.Parents.Push(baseObject);
                this.ProcessConcreteObject(propExpr.Object, context, propObj => propExpr.Object = propObj);
                //var propObj =
                //if (propObj != null)
                //{
                //    propExpr.Object = propObj;
                //}
                for (int i = 0; i < propExpr.Args.Count; i++)
                {
                    var j = i;
                    this.ProcessConcreteObject(propExpr.Args[i], context, argExpr => propExpr.Args[j] = argExpr);
                    //var argExpr =
                    //if (argExpr != null)
                    //{
                    //    propExpr.Args[i] = argExpr;
                    //}
                }
                context.Parents.Pop();
            }
            //if (baseObject is MdxSelectStatement)
            //{
            //}
            if (baseObject is MdxSetExpression)
            {
                var setExpr = baseObject as MdxSetExpression;
                context.Parents.Push(baseObject);
                for (int i = 0; i < setExpr.Expressions.Count; i++)
                {
                    var j = i;
                    this.ProcessConcreteObject(setExpr.Expressions[i], context, expr => setExpr.Expressions[j] = expr);
                    //var expr =
                    //if (expr != null)
                    //{
                    //    setExpr.Expressions[i] = expr;
                    //}
                }
                context.Parents.Pop();
            }
            if (baseObject is MdxTupleExpression)
            {
                var tupleExpr = baseObject as MdxTupleExpression;
                context.Parents.Push(baseObject);
                for (int i = 0; i < tupleExpr.Members.Count; i++)
                {
                    var j = i;
                    this.ProcessConcreteObject(tupleExpr.Members[i], context, memberExpr => tupleExpr.Members[j] = memberExpr);
                    //var memberExpr =
                    //if (memberExpr != null)
                    //{
                    //    tupleExpr.Members[i] = memberExpr;
                    //}
                }
                context.Parents.Pop();
            }
            if (baseObject is MdxUnaryExpression)
            {
                var unaryExpr = baseObject as MdxUnaryExpression;

                context.Parents.Push(baseObject);
                this.ProcessConcreteObject(unaryExpr.Expression, context, expr => unaryExpr.Expression = expr);
                //var expr =
                //if (expr != null)
                //{
                //    unaryExpr.Expression = expr;
                //}
                context.Parents.Pop();
            }
            if (baseObject is MdxWhenClause)
            {
                var whenClause = baseObject as MdxWhenClause;

                context.Parents.Push(baseObject);
                this.ProcessConcreteObject(whenClause.When, context, when => whenClause.When = when);
                //var when =
                //if (when != null)
                //{
                //    whenClause.When = when;
                //}
                this.ProcessConcreteObject(whenClause.Then, context, then => whenClause.Then = then);
                //var then =
                //if (then != null)
                //{
                //    whenClause.Then = then;
                //}
                context.Parents.Pop();
            }
            if (baseObject is MdxWhereClause)
            {
                var whereClause = baseObject as MdxWhereClause;
                context.Parents.Push(baseObject);
                this.ProcessConcreteObject(whereClause.Expression, context, expr => whereClause.Expression = expr);
                //var expr =
                //if (expr != null)
                //{
                //    whereClause.Expression = expr;
                //}
                context.Parents.Pop();
            }
            if (baseObject is MdxWithCalculatedCellItem)
            {
                var withCell = baseObject as MdxWithCalculatedCellItem;
                context.Parents.Push(baseObject);
                this.ProcessConcreteObject(withCell.AsExpression, context, asExpr => withCell.AsExpression = asExpr);
                //var asExpr =
                //if (asExpr != null)
                //{
                //    withCell.AsExpression = asExpr;
                //}
                this.ProcessConcreteObject(withCell.Expression, context, expr => withCell.Expression = expr);
                //var expr =
                //if (expr != null)
                //{
                //    withCell.Expression = expr;
                //}
                this.ProcessConcreteObject(withCell.ForExpression, context, forExpr => withCell.ForExpression = forExpr);
                //var forExpr =
                //if (forExpr != null)
                //{
                //    withCell.ForExpression = forExpr;
                //}
                this.ProcessConcreteObject(withCell.Name, context, nameExpr => withCell.Name = (MdxObjectReferenceExpression)nameExpr);
                //var nameExpr =
                //if (nameExpr != null)
                //{
                //    withCell.Name = nameExpr;
                //}
                foreach (var calcProp in withCell.CalcProperties)
                {
                    this.ProcessConcreteObject(calcProp, context, null);
                }
                context.Parents.Pop();
            }
            if (baseObject is MdxWithMemberItem)
            {
                var withMember = baseObject as MdxWithMemberItem;
                context.Parents.Push(baseObject);
                this.ProcessConcreteObject(withMember.Expression, context, expr => withMember.Expression = expr);
                //var expr =
                //if (expr != null)
                //{
                //    withMember.Expression = expr;
                //}
                this.ProcessConcreteObject(withMember.Name, context, nameExpr => withMember.Name = (MdxObjectReferenceExpression)nameExpr);
                //var nameExpr =
                //if (nameExpr != null)
                //{
                //    withMember.Name = nameExpr;
                //}
                foreach (var calcProp in withMember.CalcProperties)
                {
                    this.ProcessConcreteObject(calcProp, context, null);
                }
                context.Parents.Pop();
            }
            if (baseObject is MdxWithSetItem)
            {
                var withSet = baseObject as MdxWithSetItem;
                context.Parents.Push(baseObject);
                this.ProcessConcreteObject(withSet.Expression, context, expr => withSet.Expression = expr);
                //var expr =
                //if (expr != null)
                //{
                //    withSet.Expression = expr;
                //}
                this.ProcessConcreteObject(withSet.Name, context, nameExpr => withSet.Name = (MdxObjectReferenceExpression)nameExpr);
                //var nameExpr =
                //if (nameExpr != null)
                //{
                //    withSet.Name = nameExpr;
                //}
                foreach (var calcProp in withSet.CalcProperties)
                {
                    this.ProcessConcreteObject(calcProp, context, null);
                }

                context.Parents.Pop();
            }

            return(baseObject);
        }
 protected abstract MdxObject ProcessCore(MdxObject mdx, MdxActionContext context);
		public void GenerateMdxFromDom(MdxObject mdx, TextWriter writer, MdxGeneratorOptions options)
		{
			this.CreateMdxGenerator().GenerateMdxFromDom(mdx, writer, options);
		}