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