001    /*
002    // $Id: HierarchyNode.java 482 2012-01-05 23:27:27Z jhyde $
003    //
004    // Licensed to Julian Hyde under one or more contributor license
005    // agreements. See the NOTICE file distributed with this work for
006    // additional information regarding copyright ownership.
007    //
008    // Julian Hyde licenses this file to you under the Apache License,
009    // Version 2.0 (the "License"); you may not use this file except in
010    // compliance with the License. You may obtain a copy of the License at:
011    //
012    // http://www.apache.org/licenses/LICENSE-2.0
013    //
014    // Unless required by applicable law or agreed to in writing, software
015    // distributed under the License is distributed on an "AS IS" BASIS,
016    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017    // See the License for the specific language governing permissions and
018    // limitations under the License.
019    */
020    package org.olap4j.mdx;
021    
022    import org.olap4j.metadata.Hierarchy;
023    import org.olap4j.type.HierarchyType;
024    import org.olap4j.type.Type;
025    
026    /**
027     * Usage of a {@link org.olap4j.metadata.Hierarchy} as an expression in an MDX
028     * parse tree.
029     *
030     * @author jhyde
031     * @version $Id: HierarchyNode.java 482 2012-01-05 23:27:27Z jhyde $
032     * @since Jun 4, 2007
033     */
034    public class HierarchyNode implements ParseTreeNode {
035        private final ParseRegion region;
036        private final Hierarchy hierarchy;
037    
038        /**
039         * Creates a HierarchyNode.
040         *
041         * @param region Region of source code
042         * @param hierarchy Hierarchy which is used in the expression
043         */
044        public HierarchyNode(
045            ParseRegion region,
046            Hierarchy hierarchy)
047        {
048            this.region = region;
049            this.hierarchy = hierarchy;
050        }
051    
052        public ParseRegion getRegion() {
053            return region;
054        }
055    
056        /**
057         * Returns the Hierarchy used in this expression.
058         *
059         * @return hierarchy used in this expression
060         */
061        public Hierarchy getHierarchy() {
062            return hierarchy;
063        }
064    
065        public <T> T accept(ParseTreeVisitor<T> visitor) {
066            return visitor.visit(this);
067        }
068    
069        public Type getType() {
070            return new HierarchyType(
071                hierarchy.getDimension(),
072                hierarchy);
073        }
074    
075        public void unparse(ParseTreeWriter writer) {
076            writer.getPrintWriter().print(hierarchy.getUniqueName());
077        }
078    
079        public String toString() {
080            return hierarchy.getUniqueName();
081        }
082    
083        public HierarchyNode deepCopy() {
084            // HierarchyNode is immutable
085            return this;
086        }
087    }
088    
089    // End HierarchyNode.java