001    /*
002    // $Id: PropertyValueNode.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    /**
015     * Parse tree node representing a property-value pair.
016     *
017     * <p>Property-value pairs are used to define properties of calculated members.
018     * For example, in
019     *
020     * <blockquote>
021     * <code>WITH MEMBER [Measures].[Foo] AS ' [Measures].[Unit Sales] ',<br/>
022     * &nbsp;&nbsp;FORMAT_STRING = 'Bold',<br/>
023     * &nbsp;&nbsp;SOLVE_ORDER = 2<br/>
024     * SELECT ...</code>
025     * </blockquote>
026     *
027     * there are two property-value pairs FORMAT_STRING and SOLVE_ORDER.
028     *
029     * @version $Id: PropertyValueNode.java 243 2009-05-22 07:21:37Z jhyde $
030     * @author jhyde
031     */
032    public class PropertyValueNode implements ParseTreeNode {
033    
034        private final ParseRegion region;
035        private final String name;
036        private ParseTreeNode expression;
037    
038        /**
039         * Creates a PropertyValueNode.
040         *
041         * @param region Region of source code
042         * @param name Name of property
043         * @param expression Expression for value of property (often a literal)
044         */
045        public PropertyValueNode(
046            ParseRegion region,
047            String name,
048            ParseTreeNode expression)
049        {
050            this.region = region;
051            this.name = name;
052            this.expression = expression;
053        }
054    
055        public ParseRegion getRegion() {
056            return region;
057        }
058    
059        public Type getType() {
060            return expression.getType();
061        }
062    
063        /**
064         * Returns the expression by which the value of the property is derived.
065         *
066         * @return the expression by which the value of the property is derived
067         */
068        public ParseTreeNode getExpression() {
069            return expression;
070        }
071    
072        /**
073         * Returns the name of the property
074         *
075         * @return name of the property
076         */
077        public String getName() {
078            return name;
079        }
080    
081        public <T> T accept(ParseTreeVisitor<T> visitor) {
082            return visitor.visit(this);
083        }
084    
085        public void unparse(ParseTreeWriter writer) {
086            writer.getPrintWriter().print(name + " = ");
087            expression.unparse(writer);
088        }
089    
090        public PropertyValueNode deepCopy() {
091            return new PropertyValueNode(
092                this.region,
093                this.name,
094                this.expression.deepCopy());
095        }
096    }
097    
098    // End PropertyValueNode.java