001 /*
002 // $Id: WithSetNode.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.io.PrintWriter;
015
016 /**
017 * Parse tree node which declares a calculated set. Represented as the
018 * <code>WITH SET</code> clause of an MDX <code>SELECT</code> statement.
019 *
020 * @version $Id: WithSetNode.java 229 2009-05-08 19:11:29Z jhyde $
021 * @author jhyde
022 */
023 public class WithSetNode implements ParseTreeNode {
024
025 private final ParseRegion region;
026 /** name of set */
027 private final IdentifierNode name;
028
029 /** defining expression */
030 private ParseTreeNode expression;
031
032 /**
033 * Creates a declaration of a named set.
034 *
035 * @param region Region of source code
036 * @param name Name of set
037 * @param expression Expression to calculate set
038 */
039 public WithSetNode(
040 ParseRegion region,
041 IdentifierNode name,
042 ParseTreeNode expression)
043 {
044 this.region = region;
045 this.name = name;
046 this.expression = expression;
047 }
048
049 public ParseRegion getRegion() {
050 return region;
051 }
052
053 public void unparse(ParseTreeWriter writer) {
054 PrintWriter pw = writer.getPrintWriter();
055 pw.print("SET ");
056 name.unparse(writer);
057 pw.print(" AS '");
058 expression.unparse(writer);
059 pw.print("'");
060 }
061
062 /**
063 * Returns the name of the set.
064 *
065 * @return name of the set
066 */
067 public IdentifierNode getIdentifier() {
068 return name;
069 }
070
071 /**
072 * Returns the expression which calculates the set.
073 *
074 * @return expression which calculates the set
075 */
076 public ParseTreeNode getExpression() {
077 return expression;
078 }
079
080 /**
081 * Sets the expression which calculates the set.
082 *
083 * @param expression expression which calculates the set
084 */
085 public void setExpression(ParseTreeNode expression) {
086 this.expression = expression;
087 }
088
089 public <T> T accept(ParseTreeVisitor<T> visitor) {
090 final T t = visitor.visit(this);
091 name.accept(visitor);
092 expression.accept(visitor);
093 return t;
094 }
095
096 public Type getType() {
097 // not an expression
098 throw new UnsupportedOperationException();
099 }
100
101 public WithSetNode deepCopy() {
102 return new WithSetNode(
103 this.region,
104 this.name.deepCopy(),
105 this.expression.deepCopy());
106 }
107 }
108
109 // End WithSetNode.java