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