AggComputerImpl.h

Go to the documentation of this file.
00001 /*
00002 // $Id: //open/dev/fennel/exec/AggComputerImpl.h#9 $
00003 // Fennel is a library of data storage and processing components.
00004 // Copyright (C) 2005-2009 The Eigenbase Project
00005 // Copyright (C) 2005-2009 SQLstream, Inc.
00006 // Copyright (C) 2005-2009 LucidEra, Inc.
00007 //
00008 // This program is free software; you can redistribute it and/or modify it
00009 // under the terms of the GNU General Public License as published by the Free
00010 // Software Foundation; either version 2 of the License, or (at your option)
00011 // any later version approved by The Eigenbase Project.
00012 //
00013 // This program is distributed in the hope that it will be useful,
00014 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00015 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016 // GNU General Public License for more details.
00017 //
00018 // You should have received a copy of the GNU General Public License
00019 // along with this program; if not, write to the Free Software
00020 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
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     // implement AggComputer
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     // implement AggComputer
00063     virtual void clearAccumulator(
00064         TupleDatum &accumulatorDatum);
00065 
00066     // implement AggComputer
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     // implement AggComputer
00094     virtual void clearAccumulator(
00095         TupleDatum &accumulatorDatum);
00096 
00097     // implement AggComputer
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     // implement AggComputer
00148     virtual void clearAccumulator(
00149         TupleDatum &accumulatorDatum);
00150 
00151     // implement AggComputer
00152     virtual void updateAccumulator(
00153         TupleDatum &accumulatorDatum,
00154         TupleData const &inputTuple);
00155 
00156     // implement AggComputer
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     // implement AggComputer
00203     virtual void clearAccumulator(TupleDatum &accumulatorDatum)
00204     {
00205         T &sum = interpretDatum(accumulatorDatum);
00206         sum = 0;
00207 
00208         isResultNull = true;
00209     }
00210 
00211     // implement AggComputer
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             // SQL2003 Part 2 Section 10.9 General Rule 4.a
00220             // TODO jvs 6-Oct-2005:  we're supposed to queue a warning
00221             // for null value eliminated in set function
00222             return;
00223         } else {
00224             isResultNull = false;
00225         }
00226         T &sum = interpretDatum(accumulatorDatum);
00227         if (inputDatum.pData) {
00228             T input = interpretDatum(inputDatum);
00229             // TODO jvs 6-Oct-2005:  overflow check
00230             sum += input;
00231         }
00232     }
00233 
00234     // implement AggComputer
00235     virtual void computeOutput(
00236         TupleDatum &outputDatum,
00237         TupleDatum const &accumulatorDatum)
00238     {
00239         // Set output to alias accumulator value directly.
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 // End AggComputerImpl.h

Generated on Mon Jun 22 04:00:18 2009 for Fennel by  doxygen 1.5.1