001/*
002// $Id: TupleType.java 482 2012-01-05 23:27:27Z jhyde $
003//
004// Licensed to Julian Hyde under one or more contributor license
005// agreements. See the NOTICE file distributed with this work for
006// additional information regarding copyright ownership.
007//
008// Julian Hyde licenses this file to you under the Apache License,
009// Version 2.0 (the "License"); you may not use this file except in
010// compliance with the License. You may obtain a copy of the License at:
011//
012// http://www.apache.org/licenses/LICENSE-2.0
013//
014// Unless required by applicable law or agreed to in writing, software
015// distributed under the License is distributed on an "AS IS" BASIS,
016// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017// See the License for the specific language governing permissions and
018// limitations under the License.
019*/
020package org.olap4j.type;
021
022import org.olap4j.OlapException;
023import org.olap4j.metadata.*;
024
025/**
026 * Tuple type.
027 *
028 * @author jhyde
029 * @since Feb 17, 2005
030 * @version $Id: TupleType.java 482 2012-01-05 23:27:27Z jhyde $
031 */
032public class TupleType implements Type {
033    final Type[] elementTypes;
034    private final String digest;
035
036    /**
037     * Creates a type representing a tuple whose fields are the given types.
038     *
039     * @param elementTypes Array of field types
040     */
041    public TupleType(Type[] elementTypes) {
042        assert elementTypes != null;
043        this.elementTypes = elementTypes.clone();
044
045        final StringBuilder buf = new StringBuilder("TupleType<");
046        for (int i = 0; i < elementTypes.length; i++) {
047            Type elementType = elementTypes[i];
048            if (i > 0) {
049                buf.append(", ");
050            }
051            buf.append(elementType.toString());
052        }
053        buf.append(">");
054        digest = buf.toString();
055    }
056
057    public String toString() {
058        return digest;
059    }
060
061    public boolean usesDimension(Dimension dimension, boolean maybe) {
062        for (Type elementType : elementTypes) {
063            if (elementType.usesDimension(dimension, maybe)) {
064                return true;
065            }
066        }
067        return false;
068    }
069
070    public Dimension getDimension() {
071        return null;
072    }
073
074    public Hierarchy getHierarchy() {
075        return null;
076    }
077
078    public Level getLevel() {
079        return null;
080    }
081
082    // not part of public olap4j API
083    private Type getValueType() throws OlapException {
084        for (Type elementType : elementTypes) {
085            if (elementType instanceof MemberType) {
086                MemberType memberType = (MemberType) elementType;
087                if (memberType.getDimension().getDimensionType()
088                    == Dimension.Type.MEASURE)
089                {
090                    return memberType.getValueType();
091                }
092            }
093        }
094        return new ScalarType();
095    }
096
097    // not part of public olap4j API
098    boolean isUnionCompatibleWith(TupleType that) throws OlapException {
099        if (this.elementTypes.length != that.elementTypes.length) {
100            return false;
101        }
102        for (int i = 0; i < this.elementTypes.length; i++) {
103            if (!TypeUtil.isUnionCompatible(
104                    this.elementTypes[i],
105                    that.elementTypes[i]))
106            {
107                return false;
108            }
109        }
110        return true;
111    }
112}
113
114// End TupleType.java