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 <class T>
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<PBuffer>(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