Fennel: /home/pub/open/dev/fennel/exec/AggComputerImpl.h Source File (original) (raw)

00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 00011 00012 00013 00014 00015 00016 00017 00018 00019 00020 00021 00022 00023 #ifndef Fennel_AggComputerImpl_Included 00024 #define Fennel_AggComputerImpl_Included 00025 00026 #include "fennel/exec/AggComputer.h" 00027 #include "fennel/tuple/TupleData.h" 00028 00029 FENNEL_BEGIN_NAMESPACE 00030 00034 class FENNEL_EXEC_EXPORT CountAggComputer 00035 : public AggComputer 00036 { 00037 protected: 00038 inline uint64_t &interpretDatum(TupleDatum &); 00039 00040 inline void clearAccumulatorImpl( 00041 TupleDatum &accumulatorDatum); 00042 inline void initAccumulatorImpl( 00043 TupleDatum &accumulatorDatum); 00044 inline void updateAccumulatorImpl( 00045 TupleDatum &accumulatorDatum); 00046 00047 public: 00048
00049 virtual void computeOutput( 00050 TupleDatum &outputDatum, 00051 TupleDatum const &accumulatorDatum); 00052 }; 00053 00058 class FENNEL_EXEC_EXPORT CountStarAggComputer 00059 : public CountAggComputer 00060 { 00061 public: 00062
00063 virtual void clearAccumulator( 00064 TupleDatum &accumulatorDatum); 00065 00066
00067 virtual void updateAccumulator( 00068 TupleDatum &accumulatorDatum, 00069 TupleData const &inputTuple); 00070 00071 virtual void initAccumulator( 00072 TupleDatum &accumulatorDatumDest, 00073 TupleData const &inputTuple); 00074 00075 virtual void initAccumulator( 00076 TupleDatum &accumulatorDatumSrc, 00077 TupleDatum &accumulatorDatumDest); 00078 00079 virtual void updateAccumulator( 00080 TupleDatum &accumulatorDatumSrc, 00081 TupleDatum &accumulatorDatumDest, 00082 TupleData const &inputTuple); 00083 }; 00084 00089 class FENNEL_EXEC_EXPORT CountNullableAggComputer 00090 : public CountAggComputer 00091 { 00092 public: 00093
00094 virtual void clearAccumulator( 00095 TupleDatum &accumulatorDatum); 00096 00097
00098 virtual void updateAccumulator( 00099 TupleDatum &accumulatorDatum, 00100 TupleData const &inputTuple); 00101 00102 virtual void initAccumulator( 00103 TupleDatum &accumulatorDatumDest, 00104 TupleData const &inputTuple); 00105 00106 virtual void initAccumulator( 00107 TupleDatum &accumulatorDatumSrc, 00108 TupleDatum &accumulatorDatumDest); 00109 00110 virtual void updateAccumulator( 00111 TupleDatum &accumulatorDatumSrc, 00112 TupleDatum &accumulatorDatumDest, 00113 TupleData const &inputTuple); 00114 }; 00115 00120 class FENNEL_EXEC_EXPORT ExtremeAggComputer 00121 : public AggComputer 00122 { 00126 StoredTypeDescriptor const *pTypeDescriptor; 00127 00131 AggFunction aggFunction; 00132 00136 bool isResultNull; 00137 00138 inline void copyInputToAccumulator( 00139 TupleDatum &accumulatorDatum, 00140 TupleDatum const &inputDatum); 00141 00142 public: 00143 explicit ExtremeAggComputer( 00144 AggFunction aggFunctionInit, 00145 TupleAttributeDescriptor const &attrDesc); 00146 00147
00148 virtual void clearAccumulator( 00149 TupleDatum &accumulatorDatum); 00150 00151
00152 virtual void updateAccumulator( 00153 TupleDatum &accumulatorDatum, 00154 TupleData const &inputTuple); 00155 00156
00157 virtual void computeOutput( 00158 TupleDatum &outputDatum, 00159 TupleDatum const &accumulatorDatum); 00160 00161 virtual void initAccumulator( 00162 TupleDatum &accumulatorDatumDest, 00163 TupleData const &inputTuple); 00164 00165 virtual void initAccumulator( 00166 TupleDatum &accumulatorDatumSrc, 00167 TupleDatum &accumulatorDatumDest); 00168 00169 virtual void updateAccumulator( 00170 TupleDatum &accumulatorDatumSrc, 00171 TupleDatum &accumulatorDatumDest, 00172 TupleData const &inputTuple); 00173 }; 00174 00179 template 00180 class SumAggComputer : public AggComputer 00181 { 00185 bool isResultNull; 00186 00187 inline T &interpretDatum(TupleDatum &datum) 00188 { 00189 assert(datum.cbData == sizeof(T)); 00190 assert(datum.pData); 00191 return *reinterpret_cast<T *>(const_cast(datum.pData)); 00192 } 00193 00194 inline T const &interpretDatum(TupleDatum const &datum) 00195 { 00196 assert(datum.cbData == sizeof(T)); 00197 assert(datum.pData); 00198 return *reinterpret_cast<T const *>(datum.pData); 00199 } 00200 00201 public: 00202
00203 virtual void clearAccumulator(TupleDatum &accumulatorDatum) 00204 { 00205 T &sum = interpretDatum(accumulatorDatum); 00206 sum = 0; 00207 00208 isResultNull = true; 00209 } 00210 00211
00212 virtual void updateAccumulator( 00213 TupleDatum &accumulatorDatum, 00214 TupleData const &inputTuple) 00215 { 00216 assert(iInputAttr != -1); 00217 TupleDatum const &inputDatum = inputTuple[iInputAttr]; 00218 if (!inputDatum.pData) { 00219
00220
00221
00222 return; 00223 } else { 00224 isResultNull = false; 00225 } 00226 T &sum = interpretDatum(accumulatorDatum); 00227 if (inputDatum.pData) { 00228 T input = interpretDatum(inputDatum); 00229
00230 sum += input; 00231 } 00232 } 00233 00234
00235 virtual void computeOutput( 00236 TupleDatum &outputDatum, 00237 TupleDatum const &accumulatorDatum) 00238 { 00239
00240 outputDatum = accumulatorDatum; 00241 if (isResultNull) { 00242 outputDatum.pData = NULL; 00243 } 00244 } 00245 00246 virtual void initAccumulator( 00247 TupleDatum &accumulatorDatumDest, 00248 TupleData const &inputTuple) 00249 { 00250 accumulatorDatumDest.memCopyFrom(inputTuple[iInputAttr]); 00251 isResultNull = false; 00252 } 00253 00254 virtual void initAccumulator( 00255 TupleDatum &accumulatorDatumSrc, 00256 TupleDatum &accumulatorDatumDest) 00257 { 00258 accumulatorDatumDest.memCopyFrom(accumulatorDatumSrc); 00259 isResultNull = false; 00260 } 00261 00262 virtual void updateAccumulator( 00263 TupleDatum &accumulatorDatumSrc, 00264 TupleDatum &accumulatorDatumDest, 00265 TupleData const &inputTuple) 00266 { 00267 TupleDatum const &inputDatum = inputTuple[iInputAttr]; 00268 00269 if (!accumulatorDatumSrc.pData) { 00270 accumulatorDatumDest.memCopyFrom(inputDatum); 00271 } else { 00272 T sumSrc = interpretDatum(accumulatorDatumSrc); 00273 T &sumDest = interpretDatum(accumulatorDatumDest); 00274 00275 if (inputDatum.pData) { 00276 T sumInput = interpretDatum(inputDatum); 00277 sumDest = sumSrc + sumInput; 00278 } else { 00279 sumDest = sumSrc; 00280 } 00281 } 00282 } 00283 }; 00284 00285 00286 FENNEL_END_NAMESPACE 00287 00288 #endif 00289 00290