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") } ) })); }
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" ) } )); }
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 }); }
// $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; }