1 10 package mondrian.rolap; 11 12 import mondrian.calc.Calc; 13 import mondrian.olap.*; 14 import mondrian.olap.fun.FunUtil; 15 16 import java.util.List ; 17 18 25 public abstract class RolapAggregator 26 extends EnumeratedValues.BasicValue 27 implements Aggregator { 28 29 private static int index = 0; 30 31 public static final RolapAggregator Sum = 32 new RolapAggregator("sum", index++, false) { 33 public Object aggregate(Evaluator evaluator, List members, Calc exp) { 34 return FunUtil.sum(evaluator, members, exp); 35 } 36 }; 37 38 public static final RolapAggregator Count = 39 new RolapAggregator("count", index++, false) { 40 public Aggregator getRollup() { 41 return Sum; 42 } 43 public Object aggregate(Evaluator evaluator, List members, Calc exp) { 44 return FunUtil.count(evaluator, members, false); 45 } 46 }; 47 48 public static final RolapAggregator Min = 49 new RolapAggregator("min", index++, false) { 50 public Object aggregate(Evaluator evaluator, List members, Calc exp) { 51 return FunUtil.min(evaluator, members, exp); 52 } 53 }; 54 55 public static final RolapAggregator Max = 56 new RolapAggregator("max", index++, false) { 57 public Object aggregate(Evaluator evaluator, List members, Calc exp) { 58 return FunUtil.max(evaluator, members, exp); 59 } 60 }; 61 62 public static final RolapAggregator Avg = 63 new RolapAggregator("avg", index++, false) { 64 public Aggregator getRollup() { 65 return null; 66 } 67 public Object aggregate(Evaluator evaluator, List members, Calc exp) { 68 return FunUtil.avg(evaluator, members, exp); 69 } 70 }; 71 72 public static final RolapAggregator DistinctCount = 73 new RolapAggregator("distinct-count", index++, true) { 74 public Aggregator getRollup() { 75 return Sum; 78 } 79 public RolapAggregator getNonDistinctAggregator() { 80 return Count; 81 } 82 public Object aggregate(Evaluator evaluator, List members, Calc exp) { 83 throw new UnsupportedOperationException (); 84 } 85 public String getExpression(String operand) { 86 return "count(distinct " + operand + ")"; 87 } 88 }; 89 90 93 public static final EnumeratedValues<RolapAggregator> enumeration = 94 new EnumeratedValues<RolapAggregator> ( 95 new RolapAggregator[] {Sum, Count, Min, Max, Avg, DistinctCount}); 96 97 106 protected abstract static class BaseAggor extends RolapAggregator { 107 protected final String factCountExpr; 108 109 protected BaseAggor(final String name, final String factCountExpr) { 110 super(name, index++, false); 111 this.factCountExpr = factCountExpr; 112 } 113 public Object aggregate(Evaluator evaluator, List members, Calc exp) { 114 throw new UnsupportedOperationException (); 115 } 116 } 117 118 134 public static class AvgFromSum extends BaseAggor { 135 public AvgFromSum(String factCountExpr) { 136 super("AvgFromSum", factCountExpr); 137 } 138 public String getExpression(String operand) { 139 StringBuilder buf = new StringBuilder (64); 140 buf.append("sum("); 141 buf.append(operand); 142 buf.append(") / sum("); 143 buf.append(factCountExpr); 144 buf.append(')'); 145 return buf.toString(); 146 } 147 } 148 149 165 public static class AvgFromAvg extends BaseAggor { 166 public AvgFromAvg(String factCountExpr) { 167 super("AvgFromAvg", factCountExpr); 168 } 169 public String getExpression(String operand) { 170 StringBuilder buf = new StringBuilder (64); 171 buf.append("sum("); 172 buf.append(operand); 173 buf.append(" * "); 174 buf.append(factCountExpr); 175 buf.append(") / sum("); 176 buf.append(factCountExpr); 177 buf.append(')'); 178 return buf.toString(); 179 } 180 } 181 192 public static class SumFromAvg extends BaseAggor { 193 public SumFromAvg(String factCountExpr) { 194 super("SumFromAvg", factCountExpr); 195 } 196 public String getExpression(String operand) { 197 StringBuilder buf = new StringBuilder (64); 198 buf.append("sum("); 199 buf.append(operand); 200 buf.append(" * "); 201 buf.append(factCountExpr); 202 buf.append(')'); 203 return buf.toString(); 204 } 205 } 206 207 208 209 210 private final boolean distinct; 211 212 public RolapAggregator(String name, int ordinal, boolean distinct) { 213 super(name, ordinal, null); 214 this.distinct = distinct; 215 } 216 217 public boolean isDistinct() { 218 return distinct; 219 } 220 221 226 public String getExpression(String operand) { 227 StringBuilder buf = new StringBuilder (64); 228 buf.append(name); 229 buf.append('('); 230 if (distinct) { 231 buf.append("distinct "); 232 } 233 buf.append(operand); 234 buf.append(')'); 235 return buf.toString(); 236 } 237 238 242 public RolapAggregator getNonDistinctAggregator() { 243 throw new UnsupportedOperationException (); 244 } 245 246 250 public Aggregator getRollup() { 251 return this; 252 } 253 } 254 255 | Popular Tags |