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