001 /*
002 // $Id: Measure.java 243 2009-05-22 07:21:37Z 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) 2006-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.metadata;
011
012 import java.util.*;
013
014 /**
015 * Data value of primary interest to the user browsing the cube.
016 *
017 * <p>A <code>Measure</code> provides the value of each cell, and is usually
018 * numeric. Every measure is a member of a special dimension called "Measures".
019 *
020 * @author jhyde
021 * @version $Id: Measure.java 243 2009-05-22 07:21:37Z jhyde $
022 * @since Oct 13, 2006
023 */
024 public interface Measure extends Member {
025 /**
026 * Returns the Aggregator of this Measure.
027 *
028 * @return Aggregator
029 */
030 Aggregator getAggregator();
031
032 /**
033 * Returns the data type of this Measure.
034 *
035 * @return data type
036 */
037 Datatype getDatatype();
038
039 /**
040 * Returns whether this Measure is visible.
041 *
042 * @return whether this Measure is visible
043 */
044 boolean isVisible();
045
046 /**
047 * Enumeration of the aggregate functions which can be used to derive a
048 * <code>Measure</code>.
049 *
050 * <p>The values are as specified by XMLA.
051 * For example, XMLA specifies MDMEASURE_AGGR_SUM with ordinal 1,
052 * which corresponds to the value {@link #SUM},
053 * whose {@link #xmlaOrdinal} is 1.
054 */
055 enum Aggregator {
056 /**
057 * Identifies that the measure was derived using the
058 * SUM aggregation function.
059 */
060 SUM(1),
061 /**
062 * Identifies that the measure was derived using the
063 * COUNT aggregation function.
064 */
065 COUNT(2),
066 /**
067 * Identifies that the measure was derived using the
068 * MIN aggregation function.
069 */
070 MIN(3),
071 /**
072 * Identifies that the measure was derived using the
073 * MAX aggregation function.
074 */
075 MAX(4),
076 /**
077 * Identifies that the measure was derived using the
078 * AVG aggregation function.
079 */
080 AVG(5),
081 /**
082 * Identifies that the measure was derived using the
083 * VAR aggregation function.
084 */
085 VAR(6),
086 /**
087 * Identifies that the measure was derived using the
088 * STDEV aggregation function.
089 */
090 STD(7),
091 /**
092 * Identifies that the measure was derived from a formula that was not
093 * any single function above.
094 */
095 CALCULATED(127),
096
097 /**
098 * Identifies that the measure was derived from an unknown aggregation
099 * function or formula.
100 */
101 UNKNOWN(0);
102
103 private final int xmlaOrdinal;
104
105 private static final Map<Integer, Aggregator> xmlaMap =
106 new HashMap<Integer, Aggregator>();
107
108 static {
109 for (Aggregator aggregator : values()) {
110 xmlaMap.put(aggregator.xmlaOrdinal, aggregator);
111 }
112 }
113
114 /**
115 * Creates an Aggregator.
116 *
117 * @param xmlaOrdinal Ordinal of the aggregator in the XMLA
118 * specification
119 */
120 private Aggregator(int xmlaOrdinal) {
121 this.xmlaOrdinal = xmlaOrdinal;
122 }
123
124 /**
125 * Returns the ordinal code as specified by XMLA.
126 *
127 * <p>For example, the XMLA specification says that the ordinal of
128 * {@link #CALCULATED} is 127.
129 *
130 * @return ordinal code as specified by XMLA.
131 */
132 public final int xmlaOrdinal() {
133 return xmlaOrdinal;
134 }
135
136 /**
137 * Looks up an Aggregator by its XMLA ordinal.
138 *
139 * @param xmlaOrdinal Ordinal of an Aggregator according to the XMLA
140 * specification.
141 *
142 * @return Aggregator with the given ordinal, or null if there is no
143 * such Aggregator
144 */
145 public static Aggregator forXmlaOrdinal(int xmlaOrdinal) {
146 return xmlaMap.get(xmlaOrdinal);
147 }
148 }
149 }
150
151 // End Measure.java