001 /* 002 // $Id: ParameterNode.java 243 2009-05-22 07:21:37Z 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 * A parameter to an MDX query. 018 * 019 * <p>Not all dialects of MDX support parameters. If a dialect supports 020 * parameters, the driver for that dialect should extend the parser to 021 * introduce a ParameterNode into the parse tree wherever a parameter is 022 * encountered. 023 * 024 * <p>For example, in Mondrian's dialect of MDX, a call to the <code>Param(name, 025 * type, defaultValueExpr)</code> function introduces a parameter, and 026 * <code>ParamRef(name)</code> creates a reference to a parameter defined 027 * elsewhere in the query. 028 * 029 * @version $Id: ParameterNode.java 243 2009-05-22 07:21:37Z jhyde $ 030 */ 031 public class ParameterNode implements ParseTreeNode { 032 private String name; 033 private Type type; 034 private ParseTreeNode defaultValueExpression; 035 private final ParseRegion region; 036 037 /** 038 * Creates a ParameterNode. 039 * 040 * <p>The <code>name</code> must not be null, and the 041 * <code>defaultValueExpression</code> must be consistent with the 042 * <code>type</code>. 043 * 044 * @param region Region of source code 045 * @param name Name of parameter 046 * @param type Type of parameter 047 * @param defaultValueExpression Expression which yields the default value 048 * of the parameter 049 */ 050 public ParameterNode( 051 ParseRegion region, 052 String name, 053 Type type, 054 ParseTreeNode defaultValueExpression) 055 { 056 assert name != null; 057 assert type != null; 058 assert defaultValueExpression != null; 059 this.region = region; 060 this.name = name; 061 this.type = type; 062 this.defaultValueExpression = defaultValueExpression; 063 } 064 065 public ParseRegion getRegion() { 066 return region; 067 } 068 069 public <T> T accept(ParseTreeVisitor<T> visitor) { 070 final T t = visitor.visit(this); 071 defaultValueExpression.accept(visitor); 072 return t; 073 } 074 075 public void unparse(ParseTreeWriter writer) { 076 PrintWriter pw = writer.getPrintWriter(); 077 pw.print("Param("); 078 pw.print(MdxUtil.quoteForMdx(name)); 079 pw.print(", "); 080 pw.print(type); 081 pw.print(", "); 082 defaultValueExpression.unparse(writer); 083 pw.print(")"); 084 } 085 086 public Type getType() { 087 // not an expression 088 return null; 089 } 090 091 /** 092 * Returns the name of this parameter. 093 * 094 * @return name of this parameter 095 */ 096 public String getName() { 097 return name; 098 } 099 100 /** 101 * Sets the name of this parameter. 102 * 103 * @param name Parameter name 104 */ 105 public void setName(String name) { 106 this.name = name; 107 } 108 109 /** 110 * Sets the type of this parameter. 111 * 112 * @param type Type 113 */ 114 public void setType(Type type) { 115 this.type = type; 116 } 117 118 119 /** 120 * Returns the expression which yields the default value of this parameter. 121 * 122 * @return expression which yields the default value of this parameter 123 */ 124 public ParseTreeNode getDefaultValueExpression() { 125 return defaultValueExpression; 126 } 127 128 /** 129 * Sets the expression which yields the default value of this parameter. 130 * 131 * @param defaultValueExpression default value expression 132 */ 133 public void setDefaultValueExpression(ParseTreeNode defaultValueExpression) 134 { 135 this.defaultValueExpression = defaultValueExpression; 136 } 137 138 public ParameterNode deepCopy() { 139 return new ParameterNode( 140 this.region, 141 this.name, 142 this.type, // types are immutable 143 this.defaultValueExpression.deepCopy()); 144 } 145 } 146 147 // End ParameterNode.java