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);
        }
        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")
                }
                    )
            }));
        }
Beispiel #3
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));
        }
        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"
                    )
            }
                       ));
        }
Beispiel #5
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
            });
        }
Beispiel #6
0
    // $ANTLR end "expressions_list"


    // $ANTLR start "expression_function"
    // D:\\tfs\\Ranet.UILibrary.OLAP4\\trunk\\UILibrary.Olap\\Ranet.Olap.Mdx\\Compiler\\Parser\\mdx.g:324:1: expression_function returns [MdxFunctionExpression value] : id1= identifier ( '!' id2= identifier )* '(' ( expressions_list )? ')' ;
    public MdxFunctionExpression expression_function() // throws RecognitionException [1]
    {   

        MdxFunctionExpression value = default(MdxFunctionExpression);

        string id1 = default(string);

        string id2 = default(string);

        List<MdxExpression> expressions_list36 = default(List<MdxExpression>);


        try 
    	{
            // D:\\tfs\\Ranet.UILibrary.OLAP4\\trunk\\UILibrary.Olap\\Ranet.Olap.Mdx\\Compiler\\Parser\\mdx.g:325:2: (id1= identifier ( '!' id2= identifier )* '(' ( expressions_list )? ')' )
            // D:\\tfs\\Ranet.UILibrary.OLAP4\\trunk\\UILibrary.Olap\\Ranet.Olap.Mdx\\Compiler\\Parser\\mdx.g:325:4: id1= identifier ( '!' id2= identifier )* '(' ( expressions_list )? ')'
            {
            	PushFollow(FOLLOW_identifier_in_expression_function1802);
            	id1 = identifier();
            	state.followingStackPointer--;

            	 var  funcName = id1; 
            	// D:\\tfs\\Ranet.UILibrary.OLAP4\\trunk\\UILibrary.Olap\\Ranet.Olap.Mdx\\Compiler\\Parser\\mdx.g:326:4: ( '!' id2= identifier )*
            	do 
            	{
            	    int alt46 = 2;
            	    int LA46_0 = input.LA(1);

            	    if ( (LA46_0 == 76) )
            	    {
            	        alt46 = 1;
            	    }


            	    switch (alt46) 
            		{
            			case 1 :
            			    // D:\\tfs\\Ranet.UILibrary.OLAP4\\trunk\\UILibrary.Olap\\Ranet.Olap.Mdx\\Compiler\\Parser\\mdx.g:326:5: '!' id2= identifier
            			    {
            			    	Match(input,76,FOLLOW_76_in_expression_function1810); 
            			    	PushFollow(FOLLOW_identifier_in_expression_function1814);
            			    	id2 = identifier();
            			    	state.followingStackPointer--;

            			    	 funcName += "!"+ id2; 

            			    }
            			    break;

            			default:
            			    goto loop46;
            	    }
            	} while (true);

            	loop46:
            		;	// Stops C# compiler whining that label 'loop46' has no statements

            	Match(input,61,FOLLOW_61_in_expression_function1824); 
            	// D:\\tfs\\Ranet.UILibrary.OLAP4\\trunk\\UILibrary.Olap\\Ranet.Olap.Mdx\\Compiler\\Parser\\mdx.g:327:7: ( expressions_list )?
            	int alt47 = 2;
            	int LA47_0 = input.LA(1);

            	if ( (LA47_0 == PROPERTIES || LA47_0 == DIMENSION || LA47_0 == INTEGER || LA47_0 == RANET_EXPRESSION || LA47_0 == NOT || (LA47_0 >= STRING && LA47_0 <= CASE) || (LA47_0 >= ID && LA47_0 <= QUOTED_ID) || LA47_0 == 61 || (LA47_0 >= 68 && LA47_0 <= 69) || LA47_0 == 74) )
            	{
            	    alt47 = 1;
            	}
            	switch (alt47) 
            	{
            	    case 1 :
            	        // D:\\tfs\\Ranet.UILibrary.OLAP4\\trunk\\UILibrary.Olap\\Ranet.Olap.Mdx\\Compiler\\Parser\\mdx.g:327:9: expressions_list
            	        {
            	        	PushFollow(FOLLOW_expressions_list_in_expression_function1828);
            	        	expressions_list36 = expressions_list();
            	        	state.followingStackPointer--;


            	        }
            	        break;

            	}

            	Match(input,62,FOLLOW_62_in_expression_function1833); 
            	 value = new MdxFunctionExpression(funcName,expressions_list36); 

            }

        }
        catch (RecognitionException re) 
    	{
            ReportError(re);
            Recover(input,re);
        }
        finally 
    	{
        }
        return value;
    }