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