001 /*
002 // $Id: WithMemberNode.java 229 2009-05-08 19:11:29Z jhyde $
003 // This software is subject to the terms of the Eclipse Public License v1.0
004 // Agreement, available at the following URL:
005 // http://www.eclipse.org/legal/epl-v10.html.
006 // Copyright (C) 2007-2008 Julian Hyde
007 // All Rights Reserved.
008 // You must accept the terms of that agreement to use this software.
009 */
010 package org.olap4j.mdx;
011
012 import org.olap4j.type.Type;
013
014 import java.util.List;
015 import java.io.PrintWriter;
016
017 /**
018 * Parse tree node which declares a calculated member. Represented as the
019 * <code>WITH MEMBER</code> clause of an MDX <code>SELECT</code> statement.
020 *
021 * @version $Id: WithMemberNode.java 229 2009-05-08 19:11:29Z jhyde $
022 * @author jhyde
023 */
024 public class WithMemberNode implements ParseTreeNode {
025
026 private final ParseRegion region;
027
028 /** name of set or member */
029 private final IdentifierNode name;
030
031 /** defining expression */
032 private ParseTreeNode expression;
033
034 // properties of member, such as SOLVE_ORDER
035 private final List<PropertyValueNode> memberPropertyList;
036
037 /**
038 * Constructs a formula specifying a member.
039 *
040 * @param region Source code region
041 * @param name Name of member being declared
042 * @param exp Expression for value of member
043 * @param memberPropertyList Collection of properties of member
044 */
045 public WithMemberNode(
046 ParseRegion region,
047 IdentifierNode name,
048 ParseTreeNode exp,
049 List<PropertyValueNode> memberPropertyList)
050 {
051 this.region = region;
052 this.name = name;
053 this.expression = exp;
054 this.memberPropertyList = memberPropertyList;
055 }
056
057 public ParseRegion getRegion() {
058 return region;
059 }
060
061 public void unparse(ParseTreeWriter writer) {
062 PrintWriter pw = writer.getPrintWriter();
063 pw.print("MEMBER ");
064 name.unparse(writer);
065 pw.print(" AS '");
066 expression.unparse(writer);
067 pw.print("'");
068 if (memberPropertyList != null) {
069 for (PropertyValueNode memberProperty : memberPropertyList) {
070 pw.print(", ");
071 memberProperty.unparse(writer);
072 }
073 }
074 }
075
076 /**
077 * Returns the name of the member declared.
078 *
079 * <p>The name is as specified in the parse tree; it may not be identical
080 * to the unique name of the member.
081 *
082 * @return Name of member
083 */
084 public IdentifierNode getIdentifier() {
085 return name;
086 }
087
088 /**
089 * Returns the expression to evaluate to calculate the member.
090 *
091 * @return expression
092 */
093 public ParseTreeNode getExpression() {
094 return expression;
095 }
096
097 /**
098 * Sets the expression to evaluate to calculate the member.
099 *
100 * @param expression Expression
101 */
102 public void setExpression(ParseTreeNode expression) {
103 this.expression = expression;
104 }
105
106
107 public <T> T accept(ParseTreeVisitor<T> visitor) {
108 T t = visitor.visit(this);
109 name.accept(visitor);
110 expression.accept(visitor);
111 return t;
112 }
113
114 public Type getType() {
115 // not an expression
116 throw new UnsupportedOperationException();
117 }
118
119 /**
120 * Returns the list of properties of this member.
121 *
122 * <p>The list may be empty, but is never null.
123 * Each entry is a (name, expression) pair.
124 *
125 * @return list of properties
126 */
127 public List<PropertyValueNode> getMemberPropertyList() {
128 return memberPropertyList;
129 }
130
131 public WithMemberNode deepCopy() {
132 return new WithMemberNode(
133 this.region, // immutable
134 this.name.deepCopy(),
135 this.expression.deepCopy(),
136 MdxUtil.deepCopyList(memberPropertyList));
137 }
138 }
139
140 // End WithMemberNode.java