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); }
//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); }
protected MdxWithClauseItem(MdxObjectReferenceExpression name, MdxExpression exp, IEnumerable <MdxCalcProperty> props) : this(name, exp) { if (props != null) { CalcProperties.AddRange(props); } }
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); }
public MdxAxis( string name, MdxExpression expression, MdxExpression having, IEnumerable <MdxExpression> DimensionProperties) : this(name, expression) { this.Having = having; if (DimensionProperties != null) { this.DimensionProperties.AddRange(DimensionProperties); } }
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) })); }
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); }
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); }
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); }
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; }
public abstract MdxExpression Process(MdxExpression mdx);
public MdxPropertyExpression(MdxExpression expr, MdxFunctionExpression func) : this(expr, func.Name) { this.Args.AddRange(func.Arguments); this.IsFunction = true; }
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) { }
//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; }
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 }); }
public MdxCaseExpression(IEnumerable<MdxWhenClause> whenItems, MdxExpression elseItem) : this(whenItems) { _Else = elseItem; }
public MdxWithSetItem(MdxObjectReferenceExpression name, MdxExpression exp, IEnumerable <MdxCalcProperty> props) : base(name, exp, props) { }
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; }