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