001 /*
002 // $Id: ParseTreeNode.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-2009 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 /**
015 * Node in a parse tree representing a parsed MDX statement.
016 *
017 * <p>To convert a parse tree to an MDX string, use a {@link ParseTreeWriter}
018 * and the {@link #unparse(ParseTreeWriter)} method.
019 *
020 * @author jhyde
021 * @version $Id: ParseTreeNode.java 229 2009-05-08 19:11:29Z jhyde $
022 * @since Jun 4, 2007
023 */
024 public interface ParseTreeNode {
025 /**
026 * Accepts a visitor to this MDX parse tree node.
027 *
028 * <p>The implementation should generally dispatches to the
029 * {@link ParseTreeVisitor#visit} method appropriate to the type of expression.
030 *
031 * @param visitor Visitor
032 * @return T, the specific return type of the visitor
033 */
034 <T> T accept(ParseTreeVisitor<T> visitor);
035
036 /**
037 * Returns the type of this expression.
038 *
039 * <p>Returns null if this node is not an expression, for instance a
040 * <code>SELECT</code> node.
041 *
042 * @return type of this expression
043 */
044 Type getType();
045
046 /**
047 * Converts this node into MDX text.
048 *
049 * @param writer Parse tree writer
050 */
051 void unparse(ParseTreeWriter writer);
052
053 /**
054 * Returns the region of the source code which this node was created from,
055 * if it was created by parsing.
056 *
057 * <p>A non-leaf node's region will encompass the regions of all of its
058 * children. For example, a the region of a function call node
059 * <code>Crossjoin([Gender], {[Store].[USA]})</code> stretches from
060 * the first character of the function name to the closing parenthesis.
061 *
062 * <p>Region may be null, if the node was created programmatically, not
063 * from a piece of source code.
064 *
065 * @return Region of the source code this node was created from, if it was
066 * created by parsing
067 */
068 ParseRegion getRegion();
069
070 /**
071 * Creates a deep copy of this ParseTreeNode object.
072 *
073 * <p>Note: implementing classes can return the concrete type instead
074 * of ParseTreeNode (using Java 1.5 covariant return types)
075 *
076 * @return The deep copy of this ParseTreeNode
077 */
078 ParseTreeNode deepCopy();
079
080 }
081
082 // End ParseTreeNode.java