001 /*
002 // $Id: Type.java 229 2009-05-08 19:11:29Z 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-2008 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
016 /**
017 * Type of an MDX expression.
018 *
019 * <p>All type objects are immutable.
020 *
021 * @author jhyde
022 * @since Feb 17, 2005
023 * @version $Id: Type.java 229 2009-05-08 19:11:29Z jhyde $
024 */
025 public interface Type {
026 /**
027 * Returns whether this type contains a given dimension.<p/>
028 *
029 * For example:
030 * <ul>
031 * <li><code>DimensionType([Gender])</code> uses only the
032 * <code>[Gender]</code> dimension.</li>
033 * <li><code>TupleType(MemberType([Gender]), MemberType([Store]))</code>
034 * uses <code>[Gender]</code> and <code>[Store]</code>
035 * dimensions.</li>
036 * </ul><p/>
037 *
038 * The <code>maybe</code> parameter comes into play when the
039 * dimensional information is incomplete. For example, when applied to
040 * <code>TupleType(MemberType(null), MemberType([Store]))</code>,
041 * <code>usesDimension([Gender], false)</code> returns true because it
042 * is possible that the expression returns a member of the
043 * <code>[Gender]</code> dimension.
044 *
045 * @param dimension Dimension
046 * @param maybe If true, returns true only if this type definitely
047 * uses the dimension
048 *
049 * @return whether this type definitely (or if <code>maybe</code> is true,
050 * possibly) uses the given dimension
051 */
052 boolean usesDimension(Dimension dimension, boolean maybe);
053
054 /**
055 * Returns the dimension of this type, or null if not known.
056 *
057 * @return dimension of this type
058 */
059 Dimension getDimension();
060
061 /**
062 * Returns the hierarchy of this type. If not applicable, throws.
063 *
064 * @return hierarchy of this type
065 */
066 Hierarchy getHierarchy();
067
068 /**
069 * Returns the level of this type, or null if not known.
070 *
071 * @return level of this type
072 */
073 Level getLevel();
074
075 }
076
077 // End Type.java