001 /*
002 // $Id: Axis.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;
021
022 import java.util.Locale;
023
024 /**
025 * Enumeration of axis types.
026 *
027 * <p>The most commonly used values are
028 * <code>COLUMNS</code> (the first axis of a 2-dimensional query),
029 * <code>ROWS</code> (the second axis of a 2-dimensional query) and
030 * <code>FILTER</code> (also known as the slicer axis, denoted by a
031 * <code>WHERE</code> clause in an MDX statement).
032 *
033 * @author jhyde
034 * @version $Id: Axis.java 482 2012-01-05 23:27:27Z jhyde $
035 * @since Oct 23, 2006
036 */
037 public interface Axis {
038
039 /**
040 * Abbreviation for {@link org.olap4j.Axis.Standard#FILTER}.
041 */
042 Standard FILTER = Standard.FILTER;
043
044 /**
045 * Abbreviation for {@link org.olap4j.Axis.Standard#COLUMNS}.
046 */
047 Standard COLUMNS = Standard.COLUMNS;
048
049 /**
050 * Abbreviation for {@link org.olap4j.Axis.Standard#ROWS}.
051 */
052 Standard ROWS = Standard.ROWS;
053
054 /**
055 * Abbreviation for {@link org.olap4j.Axis.Standard#PAGES}.
056 */
057 Standard PAGES = Standard.PAGES;
058
059 /**
060 * Abbreviation for {@link org.olap4j.Axis.Standard#CHAPTERS}.
061 */
062 Standard SECTIONS = Standard.SECTIONS;
063
064 /**
065 * Abbreviation for {@link org.olap4j.Axis.Standard#FILTER}.
066 */
067 Standard CHAPTERS = Standard.CHAPTERS;
068
069 /**
070 * Returns the name of this axis, e.g. "COLUMNS", "FILTER", "AXIS(17)".
071 *
072 * @return Name of the axis
073 */
074 String name();
075
076 /**
077 * Returns whether this is the filter (slicer) axis.
078 *
079 * @return whether this is the filter axis
080 */
081 boolean isFilter();
082
083
084 /**
085 * Returns the ordinal which is to be used for retrieving this axis from
086 * the {@link org.olap4j.CellSet#getAxes()}, or retrieving its
087 * coordinate from {@link Cell#getCoordinateList()}.
088 *
089 * <p>For example:
090 * <ul>
091 * <li>-1 {@link org.olap4j.Axis.Standard#FILTER FILTER}</li>
092 * <li>0 {@link org.olap4j.Axis.Standard#COLUMNS COLUMNS}</li>
093 * <li>1 {@link org.olap4j.Axis.Standard#ROWS ROWS}</li>
094 * <li>2 {@link org.olap4j.Axis.Standard#PAGES PAGES}</li>
095 * <li>3 {@link org.olap4j.Axis.Standard#CHAPTERS CHAPTERS}</li>
096 * <li>4 {@link org.olap4j.Axis.Standard#SECTIONS SECTIONS}</li>
097 * <li>5 {@link org.olap4j.Axis.Standard#SECTIONS SECTIONS}</li>
098 * <li>6 AXES(6)</li>
099 * <li>123 AXES(123)</li>
100 * </ul>
101 *
102 * @return ordinal of this axis
103 */
104 int axisOrdinal();
105
106 /**
107 * Returns localized name for this Axis.
108 *
109 * <p>Examples: "FILTER", "ROWS", "COLUMNS", "AXIS(10)".
110 *
111 * @param locale Locale for which to give the name
112 * @return localized name for this Axis
113 */
114 String getCaption(Locale locale);
115
116 /**
117 * Enumeration of standard, named axes descriptors.
118 */
119 public enum Standard implements Axis {
120 /**
121 * Filter axis, also known as the slicer axis, and represented by the
122 * WHERE clause of an MDX query.
123 */
124 FILTER,
125
126 /** COLUMNS axis, also known as X axis and AXIS(0). */
127 COLUMNS,
128
129 /** ROWS axis, also known as Y axis and AXIS(1). */
130 ROWS,
131
132 /** PAGES axis, also known as AXIS(2). */
133 PAGES,
134
135 /** CHAPTERS axis, also known as AXIS(3). */
136 CHAPTERS,
137
138 /** SECTIONS axis, also known as AXIS(4). */
139 SECTIONS;
140
141 public int axisOrdinal() {
142 return ordinal() - 1;
143 }
144
145 public boolean isFilter() {
146 return this == FILTER;
147 }
148
149 public String getCaption(Locale locale) {
150 // TODO: localize
151 return name();
152 }
153 }
154
155 /**
156 * Container class for various Axis factory methods.
157 */
158 class Factory {
159 private static final Standard[] STANDARD_VALUES = Standard.values();
160
161 /**
162 * Returns the axis with a given ordinal.
163 *
164 * <p>For example, {@code forOrdinal(0)} returns the COLUMNS axis;
165 * {@code forOrdinal(-1)} returns the SLICER axis;
166 * {@code forOrdinal(100)} returns AXIS(100).
167 *
168 * @param ordinal Axis ordinal
169 * @return Axis whose ordinal is as given
170 */
171 public static Axis forOrdinal(final int ordinal) {
172 if (ordinal < -1) {
173 throw new IllegalArgumentException(
174 "Axis ordinal must be -1 or higher");
175 }
176 if (ordinal + 1 < STANDARD_VALUES.length) {
177 return STANDARD_VALUES[ordinal + 1];
178 }
179 return new Axis() {
180 public String toString() {
181 return name();
182 }
183
184 public String name() {
185 return "AXIS(" + ordinal + ")";
186 }
187
188 public boolean isFilter() {
189 return false;
190 }
191
192 public int axisOrdinal() {
193 return ordinal;
194 }
195
196 public String getCaption(Locale locale) {
197 // TODO: localize
198 return name();
199 }
200 };
201 }
202 }
203 }
204
205 // End Axis.java