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