1 24 25 package com.mckoi.database; 26 27 import java.math.BigDecimal ; 28 import java.util.ArrayList ; 29 import java.util.List ; 30 31 36 37 public abstract class AbstractFunction implements Function { 38 39 42 private String name; 43 44 47 private Expression[] params; 48 49 53 private boolean is_aggregate; 54 55 58 public AbstractFunction(String name, Expression[] params) { 59 this.name = name; 60 this.params = params; 61 62 is_aggregate = false; 63 } 64 65 68 protected void setAggregate(boolean status) { 69 is_aggregate = status; 70 } 71 72 75 public int parameterCount() { 76 return params.length; 77 } 78 79 82 public Expression getParameter(int n) { 83 return params[n]; 84 } 85 86 89 public boolean isGlob() { 90 if (params == FunctionFactory.GLOB_LIST) { 91 return true; 92 } 93 if (params.length == 1) { 94 Expression exp = params[0]; 95 return (exp.size() == 1 && 96 new String (exp.text()).equals("*")); 97 } 98 return false; 99 } 100 101 102 103 104 106 111 public String getName() { 112 return name; 113 } 114 115 120 public List allVariables() { 121 ArrayList result_list = new ArrayList (); 122 for (int i = 0; i < params.length; ++i) { 123 List l = params[i].allVariables(); 124 result_list.addAll(l); 125 } 126 return result_list; 127 } 128 129 134 public List allElements() { 135 ArrayList result_list = new ArrayList (); 136 for (int i = 0; i < params.length; ++i) { 137 List l = params[i].allElements(); 138 result_list.addAll(l); 139 } 140 return result_list; 141 } 142 143 146 public final boolean isAggregate(QueryContext context) { 147 if (is_aggregate) { 148 return true; 149 } 150 else { 151 for (int i = 0; i < params.length; ++i) { 153 Expression exp = params[i]; 154 if (exp.hasAggregateFunction(context)) { 155 return true; 156 } 157 } 158 } 159 return false; 160 } 161 162 165 public void prepareParameters(ExpressionPreparer preparer) 166 throws DatabaseException { 167 for (int i = 0; i < params.length; ++i) { 168 params[i].prepare(preparer); 169 } 170 } 171 172 176 public void init(VariableResolver resolver) { 177 } 178 179 180 183 public TType returnTType(VariableResolver resolver, QueryContext context) { 184 return returnTType(); 185 } 186 187 public TType returnTType() { 188 return TType.NUMERIC_TYPE; 189 } 190 191 193 194 public String toString() { 195 StringBuffer buf = new StringBuffer (); 196 buf.append(name); 197 buf.append('('); 198 for (int i = 0; i < params.length; ++i) { 199 buf.append(params[i].text().toString()); 200 if (i < params.length - 1) { 201 buf.append(','); 202 } 203 } 204 buf.append(')'); 205 return new String (buf); 206 } 207 208 209 } 210 | Popular Tags |