001    /*
002    // $Id: MemberType.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.type;
021    
022    import org.olap4j.OlapException;
023    import org.olap4j.metadata.*;
024    
025    /**
026     * The type of an expression which represents a member.
027     *
028     * @author jhyde
029     * @since Feb 17, 2005
030     * @version $Id: MemberType.java 482 2012-01-05 23:27:27Z jhyde $
031     */
032    public class MemberType implements Type {
033        private final Hierarchy hierarchy;
034        private final Dimension dimension;
035        private final Level level;
036        private final Member member;
037        private final String digest;
038    
039        // not part of public olap4j public API
040        private static final MemberType Unknown =
041            new MemberType(null, null, null, null);
042    
043        /**
044         * Creates a type representing a member.
045         *
046         * @param dimension Dimension the member belongs to, or null if not known.
047         *
048         * @param hierarchy Hierarchy the member belongs to, or null if not known.
049         *
050         * @param level Level the member belongs to, or null if not known
051         *
052         * @param member The precise member, or null if not known
053         */
054        public MemberType(
055            Dimension dimension,
056            Hierarchy hierarchy,
057            Level level,
058            Member member)
059        {
060            this.dimension = dimension;
061            this.hierarchy = hierarchy;
062            this.level = level;
063            this.member = member;
064            if (member != null) {
065                assert level != null;
066                assert member.getLevel().equals(level);
067            }
068            if (level != null) {
069                assert hierarchy != null;
070                assert level.getHierarchy().equals(hierarchy);
071            }
072            if (hierarchy != null) {
073                assert dimension != null;
074                assert hierarchy.getDimension().equals(dimension);
075            }
076            StringBuilder buf = new StringBuilder("MemberType<");
077            if (member != null) {
078                buf.append("member=").append(member.getUniqueName());
079            } else if (level != null) {
080                buf.append("level=").append(level.getUniqueName());
081            } else if (hierarchy != null) {
082                buf.append("hierarchy=").append(hierarchy.getUniqueName());
083            } else if (dimension != null) {
084                buf.append("dimension=").append(dimension.getUniqueName());
085            }
086            buf.append(">");
087            this.digest = buf.toString();
088        }
089    
090        public String toString() {
091            return digest;
092        }
093    
094        public Hierarchy getHierarchy() {
095            return hierarchy;
096        }
097    
098        public Level getLevel() {
099            return level;
100        }
101    
102        /**
103         * Returns the member of this type, or null if not known.
104         *
105         * @return member of this type
106         */
107        public Member getMember() {
108            return member;
109        }
110    
111        public boolean usesDimension(Dimension dimension, boolean maybe) {
112            if (this.dimension == null) {
113                return maybe;
114            } else {
115                return this.dimension.equals(dimension);
116            }
117        }
118    
119        // not part of public olap4j API
120        Type getValueType() {
121            // todo: when members have more type information (double vs. integer
122            // vs. string), return better type if member != null.
123            return new ScalarType();
124        }
125    
126        public Dimension getDimension() {
127            return dimension;
128        }
129    
130        // not part of public olap4j API
131        static MemberType forType(Type type) throws OlapException {
132            if (type instanceof MemberType) {
133                return (MemberType) type;
134            } else {
135                return new MemberType(
136                    type.getDimension(),
137                    type.getHierarchy(),
138                    type.getLevel(),
139                    null);
140            }
141        }
142    }
143    
144    // End MemberType.java
145