/** * */ package org.olap4j.driver.olap4ld.helper; import java.util.ArrayList; import java.util.List; import org.olap4j.mdx.AxisNode; import org.olap4j.mdx.CallNode; import org.olap4j.mdx.CubeNode; import org.olap4j.mdx.DimensionNode; import org.olap4j.mdx.DrillThroughNode; import org.olap4j.mdx.HierarchyNode; import org.olap4j.mdx.IdentifierNode; import org.olap4j.mdx.IdentifierSegment; import org.olap4j.mdx.LevelNode; import org.olap4j.mdx.LiteralNode; import org.olap4j.mdx.MemberNode; import org.olap4j.mdx.ParameterNode; import org.olap4j.mdx.ParseTreeNode; import org.olap4j.mdx.ParseTreeVisitor; import org.olap4j.mdx.PropertyValueNode; import org.olap4j.mdx.SelectNode; import org.olap4j.mdx.Syntax; import org.olap4j.mdx.WithMemberNode; import org.olap4j.mdx.WithSetNode; /** * * * * @author benedikt * * @param <Object> */ public class PreprocessMdxVisitor<Object> implements ParseTreeVisitor<Object> { @Override public Object visit(SelectNode selectNode) { List<AxisNode> list = selectNode.getAxisList(); for (AxisNode axisNode : list) { axisNode.accept(this); } return null; } @Override public Object visit(AxisNode axis) { // TODO Auto-generated method stub return null; } @Override public Object visit(WithMemberNode calcMemberNode) { // TODO Auto-generated method stub return null; } @Override public Object visit(WithSetNode calcSetNode) { // TODO Auto-generated method stub return null; } /** * If we have an identifier node ending with members, we do our magic. * * For now, this is very basic, since we assume that there is only one argument in the call node. */ public Object visit(CallNode call) { List<ParseTreeNode> arglist = call.getArgList(); ParseTreeNode myParseTreeNode = null; CallNode myMembersCallNode = null; for (ParseTreeNode parseTreeNode : arglist) { if (parseTreeNode instanceof IdentifierNode) { IdentifierNode id = (IdentifierNode) parseTreeNode; List<IdentifierSegment> segmentlist = id.getSegmentList(); if (segmentlist.get(segmentlist.size()-1).getName().toLowerCase().equals("members")) { // Now, we 1) remove segment from list 2) create a new CallNode "Members" List<IdentifierSegment> newsegmentlist = new ArrayList<IdentifierSegment>(); for (IdentifierSegment identifierSegment : segmentlist) { if (!identifierSegment.getName().toLowerCase().equals("members")) { newsegmentlist.add(identifierSegment); } } List<ParseTreeNode> args = new ArrayList<ParseTreeNode>(); IdentifierNode id2 = new IdentifierNode(newsegmentlist); args.add(id2); myMembersCallNode = new CallNode(null, "Members", Syntax.Function, args); myParseTreeNode = parseTreeNode; } } } // Replace if (myParseTreeNode != null && myMembersCallNode != null) { arglist.set(arglist.indexOf(myParseTreeNode), myMembersCallNode); } return null; } @Override public Object visit(IdentifierNode id) { // TODO Auto-generated method stub return null; } @Override public Object visit(ParameterNode parameterNode) { // TODO Auto-generated method stub return null; } @Override public Object visit(CubeNode cubeNode) { // TODO Auto-generated method stub return null; } @Override public Object visit(DimensionNode dimensionNode) { // TODO Auto-generated method stub return null; } @Override public Object visit(HierarchyNode hierarchyNode) { // TODO Auto-generated method stub return null; } @Override public Object visit(LevelNode levelNode) { // TODO Auto-generated method stub return null; } @Override public Object visit(MemberNode memberNode) { // TODO Auto-generated method stub return null; } @Override public Object visit(LiteralNode literalNode) { // TODO Auto-generated method stub return null; } @Override public Object visit(PropertyValueNode propertyValueNode) { // TODO Auto-generated method stub return null; } @Override public Object visit(DrillThroughNode drillThroughNode) { // TODO Auto-generated method stub return null; } }