001/*
002// $Id: Position.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;
021
022import org.olap4j.metadata.Member;
023
024import java.util.List;
025
026/**
027 * Position on one of the {@link CellSetAxis} objects in a {@link CellSet}.
028 *
029 * <p>An axis has a particular dimensionality, that is, a set of one or more
030 * dimensions which will appear on that axis, and every position on that axis
031 * will have a member of each of those dimensions. For example, in the MDX
032 * query</p>
033 *
034 * <blockquote>
035 *  <code>SELECT {[Measures].[Unit Sales], [Measures].[Store Sales]} ON
036 *  COLUMNS,<br>
037 * &nbsp;&nbsp;&nbsp; CrossJoin(<br>
038 * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {[Gender].Members},<br>
039 * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {[Product].[Food],
040 *  [Product].[Drink]}) ON ROWS<br>
041 *  FROM [Sales]</code>
042 * </blockquote>
043 *
044 * <p>the <code>COLUMNS</code> axis has dimensionality
045 * {<code>[Measures]</code>} and the <code>ROWS</code> axis has dimensionality
046 * {<code>[Gender]</code>, <code>[Product]</code>}. In the result,</p>
047 *
048 *  <table border="1" id="table1" cellpadding="3">
049 *      <tr>
050 *          <td bgcolor="#E0E0E0"><b><i>Gender</i></b></td>
051 *          <td bgcolor="#E0E0E0"><b><i>Product</i></b></td>
052 *          <td bgcolor="#E0E0E0"><b>Unit Sales</b></td>
053 *          <td bgcolor="#E0E0E0"><b>Store Sales</b></td>
054 *      </tr>
055 *      <tr>
056 *          <td bgcolor="#E0E0E0"><b>All Gender</b></td>
057 *          <td bgcolor="#E0E0E0"><b>Food</b></td>
058 *          <td align="right">191,940</td>
059 *          <td align="right">409,035.59</td>
060 *      </tr>
061 *      <tr>
062 *          <td bgcolor="#E0E0E0"><b>All Gender</b></td>
063 *          <td bgcolor="#E0E0E0"><b>Drink</b></td>
064 *          <td align="right">24,597</td>
065 *          <td align="right">48,836.21</td>
066 *      </tr>
067 *      <tr>
068 *          <td bgcolor="#E0E0E0"><b>F</b></td>
069 *          <td bgcolor="#E0E0E0"><b>Food</b></td>
070 *          <td align="right">94,814</td>
071 *          <td align="right">203,094.17</td>
072 *      </tr>
073 *      <tr>
074 *          <td bgcolor="#E0E0E0"><b>F</b></td>
075 *          <td bgcolor="#E0E0E0"><b>Drink</b></td>
076 *          <td align="right">12,202</td>
077 *          <td align="right">24,457.37</td>
078 *      </tr>
079 *      <tr>
080 *          <td bgcolor="#E0E0E0"><b>M</b></td>
081 *          <td bgcolor="#E0E0E0"><b>Food</b></td>
082 *          <td align="right">97,126</td>
083 *          <td align="right">205,941.42</td>
084 *      </tr>
085 *      <tr>
086 *          <td bgcolor="#E0E0E0"><b>M</b></td>
087 *          <td bgcolor="#E0E0E0"><b>Drink</b></td>
088 *          <td align="right">12,395</td>
089 *          <td align="right">24,378.84</td>
090 *      </tr>
091 *  </table>
092 *
093 * <p>each of the six positions on the <code>ROWS</code> axis has two members,
094 * consistent with its dimensionality of 2. The <code>COLUMNS</code> axis has
095 * two positions, each with one member.</p>
096 *
097 * @author jhyde
098 * @version $Id: Position.java 482 2012-01-05 23:27:27Z jhyde $
099 * @since Aug 22, 2006
100 */
101public interface Position {
102    /**
103     * Returns the list of Member objects at this position.
104     *
105     * <p>Recall that the {@link CellSetAxisMetaData#getHierarchies()}
106     * method describes the hierarchies which occur on an axis. The positions on
107     * that axis must conform. Suppose that the ROWS axis of a given statement
108     * returns <code>{[Gender], [Store]}</code>. Then every Position on
109     * that axis will have two members: the first a member of the [Gender]
110     * dimension, the second a member of the [Store] dimension.</p>
111     *
112     * @return A list of Member objects at this Position.
113     */
114    public List<Member> getMembers();
115
116    /**
117     * Returns the zero-based ordinal of this Position on its
118     * {@link CellSetAxis}.
119     *
120     * @return ordinal of this Position
121     */
122    int getOrdinal();
123}
124
125// End Position.java