1 package com.daffodilwoods.daffodildb.server.sql99.dql.execution; 2 3 import java.math.*; 4 5 import com.daffodilwoods.daffodildb.server.sql99.common.*; 6 import com.daffodilwoods.daffodildb.server.sql99.dql.iterator.*; 7 import com.daffodilwoods.daffodildb.server.sql99.expression.*; 8 import com.daffodilwoods.daffodildb.utils.*; 9 import com.daffodilwoods.daffodildb.utils.field.*; 10 import com.daffodilwoods.database.resource.*; 11 import com.daffodilwoods.database.utility.*; 12 import com.daffodilwoods.daffodildb.server.sql99.expression.valueexpression; 13 import com.daffodilwoods.daffodildb.server.sql99.common.GeneralPurposeStaticClass; 14 import com.daffodilwoods.daffodildb.server.sql99.utils._Reference; 15 16 27 public class AggregateAvgAll implements _Aggregate, Datatypes, IntegerPool { 28 29 33 protected Object result; 34 37 protected long count = 0; 38 42 protected valueexpression column; 43 47 protected int dataType; 48 51 protected boolean initialized = false; 52 53 private boolean forQuestion; 54 62 public AggregateAvgAll(valueexpression column0) throws DException { 63 column = column0; 64 65 try { 66 dataType=Datatypes.DOUBLE; 67 68 } catch (NullPointerException ex) { 69 throw ex; 70 } 71 72 if(column.getCardinality()==-1){ 73 return; 74 } 75 76 77 GeneralPurposeStaticClass.checkForValidColumnsInAggregatesSumAndAvg(column0.getColumnDetails(),"AVG"); 78 initialized = true; 79 forQuestion=true; 80 } 81 82 83 88 public void initialize() throws DException { 89 count = 0; 90 result = FieldUtility.getField(dataType,FieldUtility.NULLBUFFERRANGE); 91 initialized = true; 92 } 93 94 100 public Object getResult() throws DException { 101 if (result == null) { 102 return FieldUtility.NULLFIELDBASE; 103 } 104 return computeAverage(); 105 } 106 107 108 119 protected void getSum(Object result0, FieldBase newObject) throws DException { 120 try { 121 result = GeneralPurposeStaticClass.computeSum(result0, newObject, 122 dataType); 123 } catch (DException ex) { 124 if (ex.getDseCode().equals("DSE8101")) { 125 promoteDatatype(); 126 getSum(result0, newObject); 127 } else { 128 throw ex; 129 } 130 } 131 } 132 133 138 protected void promoteDatatype() throws DException { 139 switch (dataType) { 140 case BYTE: 141 case TINYINT: 142 case INTEGER: 143 case INT: 144 case SHORT: 145 case SMALLINT: 146 dataType = LONG; 147 break; 148 case LONG: 149 case BIGINT: 150 case REAL: 151 dataType = DOUBLE; 152 break; 153 case DOUBLE: 154 case FLOAT: 155 case DOUBLEPRECISION: 156 dataType = BIGDECIMAL; 157 break; 158 } 159 } 160 161 162 167 protected void init() throws DException { 168 switch (dataType) { 169 case BYTE: 170 case TINYINT: 171 case INTEGER: 172 case INT: 173 case SHORT: 174 case SMALLINT: 175 result = new Integer (0); 176 break; 177 case LONG: 178 case BIGINT: 179 result = new Long (0); 180 break; 181 case REAL: 182 result = new Float (0.0); 183 break; 184 case DOUBLE: 185 case FLOAT: 186 case DOUBLEPRECISION: 187 result = new Double (0.0); 188 break; 189 case DEC: 190 case DECIMAL: 191 case NUMERIC: 192 case BIGDECIMAL: 193 result = new BigDecimal(0.0); 194 break; 195 case CHARACTER: 196 case CHAR: 197 case VARCHAR: 198 case CHARACTERVARYING: 199 case CHARVARYING: 200 throw new DException("DSE945", null); 201 default: 202 throw new DException("DSE416", new Object [] {new Integer (dataType)}); 203 } 204 } 205 206 public void releaseResource() throws DException { 207 } 208 209 217 protected Object computeAverage() throws DException { 218 Object fb = null; 219 Number val = null; 220 try { 221 switch (dataType) { 222 case BYTE: 223 case TINYINT: 224 case INTEGER: 225 case INT: 226 case SHORT: 227 case SMALLINT: 228 double result1 = ( (Number ) result).intValue(); 229 230 result1 /= count; 231 return new FieldLiteral(new BigDecimal(result1), BIGDECIMAL); 232 case LONG: 233 case BIGINT: 234 double result0 = ( (Number ) result).longValue(); 235 result0 /= count; 236 return new FieldLiteral(new BigDecimal(result0), BIGDECIMAL); 237 case REAL: 238 double result3 = ( (Number ) result).floatValue(); 239 result3 /= count; 240 return new FieldLiteral(new BigDecimal(result3), BIGDECIMAL); 241 case DOUBLE: 242 case FLOAT: 243 case DOUBLEPRECISION: 244 double result4 = ( (Number ) result).doubleValue(); 245 result4 /= count; 246 return new FieldLiteral(new BigDecimal(result4), BIGDECIMAL); 247 case DEC: 248 case DECIMAL: 249 case NUMERIC: 250 case BIGDECIMAL: 251 BigDecimal bd = ( (BigDecimal) result).divide(new BigDecimal("" + 252 count), 2, 0); 253 return new FieldLiteral(bd, BIGDECIMAL); 254 } 255 } 256 catch (ClassCastException ex) { 257 return result; 258 } 259 return null; 260 } 261 262 public valueexpression getValueExpression() { 263 return column; 264 } 265 266 276 277 public void addRecord(Object newObject) throws DException{ 278 if (((FieldBase)newObject).isNull()) { 279 return; 280 } 281 if (initialized) { 282 if(forQuestion){ 283 if (!GeneralPurposeStaticClass.checkForIntAndDouble( ( (FieldBase) 284 newObject).getDatatype())) 285 throw new DException("DSE773", null); 286 } 287 init(); 288 initialized = false; 289 290 } 291 count++; 292 getSum(result, (FieldBase)newObject); 293 294 295 }} 296 | Popular Tags |