001 /* 002 // $Id: TupleType.java 247 2009-06-20 05:52:40Z 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-2009 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.Dimension; 013 import org.olap4j.metadata.Hierarchy; 014 import org.olap4j.metadata.Level; 015 import org.olap4j.OlapException; 016 017 /** 018 * Tuple type. 019 * 020 * @author jhyde 021 * @since Feb 17, 2005 022 * @version $Id: TupleType.java 247 2009-06-20 05:52:40Z jhyde $ 023 */ 024 public class TupleType implements Type { 025 final Type[] elementTypes; 026 private final String digest; 027 028 /** 029 * Creates a type representing a tuple whose fields are the given types. 030 * 031 * @param elementTypes Array of field types 032 */ 033 public TupleType(Type[] elementTypes) { 034 assert elementTypes != null; 035 this.elementTypes = elementTypes.clone(); 036 037 final StringBuilder buf = new StringBuilder("TupleType<"); 038 for (int i = 0; i < elementTypes.length; i++) { 039 Type elementType = elementTypes[i]; 040 if (i > 0) { 041 buf.append(", "); 042 } 043 buf.append(elementType.toString()); 044 } 045 buf.append(">"); 046 digest = buf.toString(); 047 } 048 049 public String toString() { 050 return digest; 051 } 052 053 public boolean usesDimension(Dimension dimension, boolean maybe) { 054 for (Type elementType : elementTypes) { 055 if (elementType.usesDimension(dimension, maybe)) { 056 return true; 057 } 058 } 059 return false; 060 } 061 062 public Dimension getDimension() { 063 return null; 064 } 065 066 public Hierarchy getHierarchy() { 067 return null; 068 } 069 070 public Level getLevel() { 071 return null; 072 } 073 074 // not part of public olap4j API 075 private Type getValueType() throws OlapException { 076 for (Type elementType : elementTypes) { 077 if (elementType instanceof MemberType) { 078 MemberType memberType = (MemberType) elementType; 079 if (memberType.getDimension().getDimensionType() 080 == Dimension.Type.MEASURE) 081 { 082 return memberType.getValueType(); 083 } 084 } 085 } 086 return new ScalarType(); 087 } 088 089 // not part of public olap4j API 090 boolean isUnionCompatibleWith(TupleType that) throws OlapException { 091 if (this.elementTypes.length != that.elementTypes.length) { 092 return false; 093 } 094 for (int i = 0; i < this.elementTypes.length; i++) { 095 if (!TypeUtil.isUnionCompatible( 096 this.elementTypes[i], 097 that.elementTypes[i])) 098 { 099 return false; 100 } 101 } 102 return true; 103 } 104 } 105 106 // End TupleType.java