001 /* 002 // $Id: //open/mondrian/src/main/mondrian/olap/type/SetType.java#11 $ 003 // This software is subject to the terms of the Common Public License 004 // Agreement, available at the following URL: 005 // http://www.opensource.org/licenses/cpl.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 mondrian.olap.type; 011 012 import mondrian.olap.*; 013 014 /** 015 * Set type. 016 * 017 * @author jhyde 018 * @since Feb 17, 2005 019 * @version $Id: //open/mondrian/src/main/mondrian/olap/type/SetType.java#11 $ 020 */ 021 public class SetType implements Type { 022 023 private final Type elementType; 024 private final String digest; 025 026 /** 027 * Creates a type representing a set of elements of a given type. 028 * 029 * @param elementType The type of the elements in the set, or null if not 030 * known 031 */ 032 public SetType(Type elementType) { 033 if (elementType != null) { 034 assert elementType instanceof MemberType || 035 elementType instanceof TupleType; 036 } 037 this.elementType = elementType; 038 this.digest = "SetType<" + elementType + ">"; 039 } 040 041 public int hashCode() { 042 return digest.hashCode(); 043 } 044 045 public boolean equals(Object obj) { 046 if (obj instanceof SetType) { 047 SetType that = (SetType) obj; 048 return Util.equals(this.elementType, that.elementType); 049 } else { 050 return false; 051 } 052 } 053 054 public String toString() { 055 return digest; 056 } 057 058 /** 059 * Returns the type of the elements of this set. 060 * 061 * @return the type of the elements in this set 062 */ 063 public Type getElementType() { 064 return elementType; 065 } 066 067 public boolean usesDimension(Dimension dimension, boolean definitely) { 068 if (elementType == null) { 069 return definitely; 070 } 071 return elementType.usesDimension(dimension, definitely); 072 } 073 074 public Dimension getDimension() { 075 return elementType == null ? null : 076 elementType.getDimension(); 077 } 078 079 public Hierarchy getHierarchy() { 080 return elementType == null ? null : 081 elementType.getHierarchy(); 082 } 083 084 public Level getLevel() { 085 return elementType == null ? null : 086 elementType.getLevel(); 087 } 088 089 /** 090 * Returns the dimensionality of this SetType. If set contains members, 091 * returns 1, otherwise returns the width of the tuples. 092 * 093 * @return Dimensionality of this SetType 094 */ 095 public int getArity() { 096 return elementType instanceof TupleType ? 097 ((TupleType) elementType).elementTypes.length : 098 1; 099 } 100 101 public Type computeCommonType(Type type, int[] conversionCount) { 102 if (!(type instanceof SetType)) { 103 return null; 104 } 105 SetType that = (SetType) type; 106 final Type mostGeneralElementType = 107 this.getElementType().computeCommonType( 108 that.getElementType(), conversionCount); 109 if (mostGeneralElementType == null) { 110 return null; 111 } 112 return new SetType(mostGeneralElementType); 113 } 114 } 115 116 // End SetType.java