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 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;
		}