1 24 25 package com.mckoi.database; 26 27 43 44 public abstract class AbstractAggregateFunction extends AbstractFunction { 45 46 49 public AbstractAggregateFunction(String name, Expression[] params) { 50 super(name, params); 51 setAggregate(true); 52 53 if (parameterCount() != 1) { 55 throw new RuntimeException ("'" + name + 56 "' function must have one argument."); 57 } 58 59 } 60 61 63 73 public abstract TObject evalAggregate(GroupResolver group, 74 QueryContext context, 75 TObject val1, TObject val2); 76 77 82 public TObject postEvalAggregate(GroupResolver group, 83 QueryContext context, 84 TObject result) { 85 return result; 87 } 88 89 90 91 93 public final TObject evaluate(GroupResolver group, 94 VariableResolver resolver, 95 QueryContext context) { 96 if (group == null) { 97 throw new RuntimeException ("'" + getName() + 98 "' can only be used as an aggregate function."); 99 } 100 101 TObject result = null; 102 int size = group.size(); 104 if (size == 0) { 105 return new TObject(returnTType(resolver, context), null); 107 } 108 109 TObject val; 110 Variable v = getParameter(0).getVariable(); 111 if (v != null) { 114 for (int i = 0; i < size; ++i) { 115 val = group.resolve(v, i); 116 result = evalAggregate(group, context, result, val); 117 } 118 } 119 else { 120 Expression exp = getParameter(0); 124 for (int i = 0; i < size; ++i) { 125 val = exp.evaluate(null, group.getVariableResolver(i), context); 126 result = evalAggregate(group, context, result, val); 127 } 128 } 129 130 result = postEvalAggregate(group, context, result); 132 133 return result; 134 } 135 136 } 137 | Popular Tags |