Fennel: /home/pub/open/dev/fennel/calculator/ExtWinAggFuncs.cpp 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 #include "fennel/common/CommonPreamble.h"
00024 #include "fennel/calculator/ExtendedInstructionTable.h"
00025 #include "fennel/calculator/WinAggHistogram.h"
00026 #include "fennel/calculator/WinAggHistogramStrA.h"
00027 #include "fennel/calculator/RegisterReference.h"
00028 #include "fennel/tuple/StandardTypeDescriptor.h"
00029
00030
00031 FENNEL_BEGIN_CPPFILE("$Id: //open/dev/fennel/calculator/ExtWinAggFuncs.cpp#3 $");
00032
00043
00044
00045
00046
00047
00048
00049
00050
00051 void histogramAlloc(
00052 RegisterRef<char*>* result,
00053 RegisterReference* targetDataType)
00054 {
00055 StandardTypeDescriptorOrdinal dType = targetDataType->type();
00056
00057 PBuffer histogramObject = NULL;
00058 if (StandardTypeDescriptor::isExact(dType)) {
00059 histogramObject =
00060 reinterpret_cast(new WinAggHistogram);
00061 } else if (StandardTypeDescriptor::isApprox(dType)) {
00062 histogramObject =
00063 reinterpret_cast(new WinAggHistogram);
00064 } else if (StandardTypeDescriptor::isArray(dType)) {
00065 histogramObject =
00066 reinterpret_cast(new WinAggHistogramStrA);
00067 } else {
00068
00069 throw 22001;
00070 }
00071
00072 TupleDatum bind = result->getBinding(false);
00073 (reinterpret_cast<PBuffer*>(const_cast(bind->pData))) =
00074 histogramObject;
00075 }
00076
00083 template
00084 inline void add(RegisterRef node, RegisterRef<char*> aggDataBlock)
00085 {
00086
00087 TupleDatum bind = aggDataBlock->getBinding(false);
00088 WinAggHistogram pAcc =
00089 (reinterpret_cast<WinAggHistogram**>(
00090 const_cast(bind->pData)));
00091
00092
00093
00094 pAcc->addRow(node);
00095 }
00096
00097 inline void add(RegisterRef<char*> node, RegisterRef<char*> aggDataBlock)
00098 {
00099
00100 TupleDatum bind = aggDataBlock->getBinding(false);
00101 WinAggHistogramStrA pAcc =
00102 (reinterpret_cast<WinAggHistogramStrA**>(
00103 const_cast(bind->pData)));
00104
00105
00106 pAcc->addRow(node);
00107 }
00108
00109
00117 template
00118 inline void drop(RegisterRef node, RegisterRef<char*> aggDataBlock)
00119 {
00120
00121 TupleDatum bind = aggDataBlock->getBinding(false);
00122 WinAggHistogram pAcc =
00123 (reinterpret_cast<WinAggHistogram**>(
00124 const_cast(bind->pData)));
00125
00126
00127 pAcc->dropRow(node);
00128 }
00129
00130 inline void drop(RegisterRef<char*> node, RegisterRef<char*> aggDataBlock)
00131 {
00132 TupleDatum bind = aggDataBlock->getBinding(false);
00133 WinAggHistogramStrA pAcc =
00134 (reinterpret_cast<WinAggHistogramStrA**>(
00135 const_cast(bind->pData)));
00136
00137 pAcc->dropRow(node);
00138 }
00139
00146 template
00147 inline void min(RegisterRef result, RegisterRef<char*> aggDataBlock)
00148 {
00149
00150 TupleDatum bind = aggDataBlock->getBinding(false);
00151 WinAggHistogram pAcc =
00152 (reinterpret_cast<WinAggHistogram**>(
00153 const_cast(bind->pData)));
00154
00155 pAcc->getMin(result);
00156 }
00157
00158 inline void min(RegisterRef<char*> result, RegisterRef<char*> aggDataBlock)
00159 {
00160 TupleDatum bind = aggDataBlock->getBinding(false);
00161 WinAggHistogramStrA pAcc =
00162 (reinterpret_cast<WinAggHistogramStrA**>(
00163 const_cast(bind->pData)));
00164 pAcc->getMin(result);
00165 }
00166
00173 template
00174 inline void max(RegisterRef result, RegisterRef<char*> aggDataBlock)
00175 {
00176
00177 TupleDatum bind = aggDataBlock->getBinding(false);
00178 WinAggHistogram pAcc =
00179 (reinterpret_cast<WinAggHistogram**>(
00180 const_cast(bind->pData)));
00181
00182
00183 pAcc->getMax(result);
00184 }
00185
00186 inline void max(RegisterRef<char*> result, RegisterRef<char*> aggDataBlock)
00187 {
00188 TupleDatum bind = aggDataBlock->getBinding(false);
00189 WinAggHistogramStrA pAcc =
00190 (reinterpret_cast<WinAggHistogramStrA**>(
00191 const_cast(bind->pData)));
00192 pAcc->getMax(result);
00193 }
00194
00201 template
00202 inline void avg(
00203 RegisterRef result,
00204 RegisterRef<char*> aggDataBlock)
00205 {
00206
00207 TupleDatum bind = aggDataBlock->getBinding(false);
00208 WinAggHistogram pAcc =
00209 (reinterpret_cast<WinAggHistogram**>(
00210 const_cast(bind->pData)));
00211
00212
00213 pAcc->getAvg(result);
00214 }
00215
00222 template
00223 inline void sum(
00224 RegisterRef result,
00225 RegisterRef<char*> aggDataBlock)
00226 {
00227
00228 TupleDatum bind = aggDataBlock->getBinding(false);
00229 WinAggHistogram pAcc =
00230 (reinterpret_cast<WinAggHistogram**>(
00231 const_cast(bind->pData)));
00232
00233
00234 pAcc->getSum(result);
00235 }
00236
00243 template
00244 inline void count(
00245 RegisterRef result,
00246 RegisterRef<char*> aggDataBlock)
00247 {
00248
00249 TupleDatum bind = aggDataBlock->getBinding(false);
00250 WinAggHistogram pAcc =
00251 (reinterpret_cast<WinAggHistogram**>(
00252 const_cast(bind->pData)));
00253
00254
00255 pAcc->getCount(result);
00256 }
00257
00258
00259
00260 template
00261 void WinAggInit(RegisterRef<char*> result, RegisterRef targetDataType)
00262 {
00263 histogramAlloc(result, targetDataType);
00264 }
00265
00272 template
00273 inline void firstValue(
00274 RegisterRef result,
00275 RegisterRef<char*> aggDataBlock)
00276 {
00277
00278 TupleDatum bind = aggDataBlock->getBinding(false);
00279 WinAggHistogram pAcc =
00280 (reinterpret_cast<WinAggHistogram**>(
00281 const_cast(bind->pData)));
00282
00283
00284 pAcc->getFirstValue(result);
00285 }
00286
00287 inline void firstValue(
00288 RegisterRef<char*> result,
00289 RegisterRef<char*> aggDataBlock)
00290 {
00291 TupleDatum bind = aggDataBlock->getBinding(false);
00292 WinAggHistogramStrA pAcc =
00293 (reinterpret_cast<WinAggHistogramStrA**>(
00294 const_cast(bind->pData)));
00295 pAcc->getFirstValue(result);
00296 }
00297
00304 template
00305 inline void lastValue(
00306 RegisterRef result,
00307 RegisterRef<char*> aggDataBlock)
00308 {
00309
00310 TupleDatum bind = aggDataBlock->getBinding(false);
00311 WinAggHistogram pAcc =
00312 (reinterpret_cast<WinAggHistogram**>(
00313 const_cast(bind->pData)));
00314
00315
00316 pAcc->getLastValue(result);
00317 }
00318
00319 inline void lastValue(
00320 RegisterRef<char*> result,
00321 RegisterRef<char*> aggDataBlock)
00322 {
00323 TupleDatum bind = aggDataBlock->getBinding(false);
00324 WinAggHistogramStrA pAcc =
00325 (reinterpret_cast<WinAggHistogramStrA**>(
00326 const_cast(bind->pData)));
00327 pAcc->getLastValue(result);
00328 }
00329
00330 void WinAggCount(RegisterRef result, RegisterRef<char*> aggDataBlock)
00331 {
00332 count(result, aggDataBlock);
00333 }
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343 void WinAggAdd(
00344 RegisterRef node,
00345 RegisterRef<char*> aggDataBlock)
00346 {
00347 add(node, aggDataBlock);
00348 }
00349
00350 void WinAggDrop(
00351 RegisterRef node,
00352 RegisterRef<char*> aggDataBlock)
00353 {
00354 drop(node, aggDataBlock);
00355 }
00356
00357 void WinAggMin(
00358 RegisterRef result,
00359 RegisterRef<char*> aggDataBlock)
00360 {
00361 min(result, aggDataBlock);
00362 }
00363
00364 void WinAggMax(
00365 RegisterRef result,
00366 RegisterRef<char*> aggDataBlock)
00367 {
00368 max(result, aggDataBlock);
00369 }
00370
00371 void WinAggSum(
00372 RegisterRef result,
00373 RegisterRef<char*> aggDataBlock)
00374 {
00375 sum(result, aggDataBlock);
00376 }
00377
00378 void WinAggAvg(
00379 RegisterRef result,
00380 RegisterRef<char*> aggDataBlock)
00381 {
00382 avg(result, aggDataBlock);
00383 }
00384
00385 void WinAggFirstValue(
00386 RegisterRef result,
00387 RegisterRef<char*>* aggDataBlock)
00388 {
00389 firstValue(result, aggDataBlock);
00390 }
00391
00392 void WinAggLastValue(
00393 RegisterRef* result,
00394 RegisterRef<char*>* aggDataBlock)
00395 {
00396 lastValue(result, aggDataBlock);
00397 }
00398
00399
00400
00401
00402 void WinAggAdd(
00403 RegisterRef* node,
00404 RegisterRef<char*>* aggDataBlock)
00405 {
00406 add(node, aggDataBlock);
00407 }
00408
00409 void WinAggDrop(
00410 RegisterRef* node,
00411 RegisterRef<char*>* aggDataBlock)
00412 {
00413 drop(node, aggDataBlock);
00414 }
00415
00416 void WinAggAvg(
00417 RegisterRef* result,
00418 RegisterRef<char*>* aggDataBlock)
00419 {
00420 avg(result, aggDataBlock);
00421 }
00422
00423 void WinAggSum(
00424 RegisterRef* result,
00425 RegisterRef<char*>* aggDataBlock)
00426 {
00427 sum(result, aggDataBlock);
00428 }
00429
00430 void WinAggMin(
00431 RegisterRef* result,
00432 RegisterRef<char*>* aggDataBlock)
00433 {
00434 min(result, aggDataBlock);
00435 }
00436
00437 void WinAggMax(
00438 RegisterRef* result,
00439 RegisterRef<char*>* aggDataBlock)
00440 {
00441 max(result, aggDataBlock);
00442 }
00443
00444 void WinAggFirstValue(
00445 RegisterRef* result,
00446 RegisterRef<char*>* aggDataBlock)
00447 {
00448 firstValue(result, aggDataBlock);
00449 }
00450
00451 void WinAggLastValue(
00452 RegisterRef* result,
00453 RegisterRef<char*>* aggDataBlock)
00454 {
00455 lastValue(result, aggDataBlock);
00456 }
00457
00458
00459
00460
00461 void WinAggAdd(
00462 RegisterRef<char*>* node,
00463 RegisterRef<char*>* aggDataBlock)
00464 {
00465 add(node, aggDataBlock);
00466 }
00467
00468 void WinAggDrop(
00469 RegisterRef<char*>* node,
00470 RegisterRef<char*>* aggDataBlock)
00471 {
00472 drop(node, aggDataBlock);
00473 }
00474
00475
00476 void WinAggMin(
00477 RegisterRef<char*>* node,
00478 RegisterRef<char*>* aggDataBlock)
00479 {
00480 min(node, aggDataBlock);
00481 }
00482
00483 void WinAggMax(
00484 RegisterRef<char*>* node,
00485 RegisterRef<char*>* aggDataBlock)
00486 {
00487 max(node, aggDataBlock);
00488 }
00489
00490 void WinAggFirstValue(
00491 RegisterRef<char*>* node,
00492 RegisterRef<char*>* aggDataBlock)
00493 {
00494 firstValue(node, aggDataBlock);
00495 }
00496
00497 void WinAggLastValue(
00498 RegisterRef<char*>* node,
00499 RegisterRef<char*>* aggDataBlock)
00500 {
00501 lastValue(node, aggDataBlock);
00502 }
00503
00504
00505
00506
00507
00508 void
00509 ExtWinAggFuncRegister(ExtendedInstructionTable* eit)
00510 {
00511 assert(eit != NULL);
00512
00513
00514
00515
00516
00517
00518
00519 vector params_mm64_init;
00520 params_mm64_init.push_back(STANDARD_TYPE_VARBINARY);
00521 params_mm64_init.push_back(STANDARD_TYPE_INT_64);
00522
00523 eit->add(
00524 "WinAggInit", params_mm64_init,
00525 (ExtendedInstruction2<char*,int64_t>) NULL,
00526 &WinAggInit);
00527
00528 vector params_mm32_init;
00529 params_mm32_init.push_back(STANDARD_TYPE_VARBINARY);
00530 params_mm32_init.push_back(STANDARD_TYPE_INT_32);
00531
00532 eit->add(
00533 "WinAggInit", params_mm32_init,
00534 (ExtendedInstruction2<char*,int32_t>) NULL,
00535 &WinAggInit);
00536
00537 vector params_mm16_init;
00538 params_mm16_init.push_back(STANDARD_TYPE_VARBINARY);
00539 params_mm16_init.push_back(STANDARD_TYPE_INT_16);
00540
00541 eit->add(
00542 "WinAggInit", params_mm16_init,
00543 (ExtendedInstruction2<char*,int16_t>) NULL,
00544 &WinAggInit);
00545
00546 vector params_mm8_init;
00547 params_mm8_init.push_back(STANDARD_TYPE_VARBINARY);
00548 params_mm8_init.push_back(STANDARD_TYPE_INT_8);
00549
00550 eit->add(
00551 "WinAggInit", params_mm8_init,
00552 (ExtendedInstruction2<char*,int8_t>) NULL,
00553 &WinAggInit);
00554
00555
00556 vector params_ad_I64;
00557 params_ad_I64.push_back(STANDARD_TYPE_INT_64);
00558 params_ad_I64.push_back(STANDARD_TYPE_VARBINARY);
00559
00560 eit->add(
00561 "WinAggAdd", params_ad_I64,
00562 (ExtendedInstruction2<int64_t, char*>) NULL,
00563 &WinAggAdd);
00564
00565 eit->add(
00566 "WinAggDrop", params_ad_I64,
00567 (ExtendedInstruction2<int64_t, char*>) NULL,
00568 &WinAggDrop);
00569
00570 vector params_I64_funcs;
00571 params_I64_funcs.push_back(STANDARD_TYPE_INT_64);
00572 params_I64_funcs.push_back(STANDARD_TYPE_VARBINARY);
00573
00574 eit->add(
00575 "WinAggSum", params_I64_funcs,
00576 (ExtendedInstruction2<int64_t, char*>) NULL,
00577 &WinAggSum);
00578
00579 eit->add(
00580 "WinAggCount", params_I64_funcs,
00581 (ExtendedInstruction2<int64_t, char*>) NULL,
00582 &WinAggCount);
00583
00584 eit->add(
00585 "WinAggAvg", params_I64_funcs,
00586 (ExtendedInstruction2<int64_t, char*>) NULL,
00587 &WinAggAvg);
00588
00589 eit->add(
00590 "WinAggMin", params_I64_funcs,
00591 (ExtendedInstruction2<int64_t, char*>) NULL,
00592 &WinAggMin);
00593
00594 eit->add(
00595 "WinAggMax", params_I64_funcs,
00596 (ExtendedInstruction2<int64_t, char*>) NULL,
00597 &WinAggMax);
00598
00599 eit->add(
00600 "WinAggFirstValue", params_I64_funcs,
00601 (ExtendedInstruction2<int64_t, char*>) NULL,
00602 &WinAggFirstValue);
00603
00604 eit->add(
00605 "WinAggLastValue", params_I64_funcs,
00606 (ExtendedInstruction2<int64_t, char*>) NULL,
00607 &WinAggLastValue);
00608
00609
00610 vector params_mmd_init;
00611 params_mmd_init.push_back(STANDARD_TYPE_VARBINARY);
00612 params_mmd_init.push_back(STANDARD_TYPE_DOUBLE);
00613
00614 eit->add(
00615 "WinAggInit", params_mmd_init,
00616 (ExtendedInstruction2<char*,double>) NULL,
00617 &WinAggInit);
00618
00619 vector params_mmr_init;
00620 params_mmr_init.push_back(STANDARD_TYPE_VARBINARY);
00621 params_mmr_init.push_back(STANDARD_TYPE_REAL);
00622
00623 eit->add(
00624 "WinAggInit", params_mmr_init,
00625 (ExtendedInstruction2<char*,float>) NULL,
00626 &WinAggInit);
00627
00628 vector params_DBL_funcs;
00629 params_DBL_funcs.push_back(STANDARD_TYPE_DOUBLE);
00630 params_DBL_funcs.push_back(STANDARD_TYPE_VARBINARY);
00631
00632 eit->add(
00633 "WinAggAdd", params_DBL_funcs,
00634 (ExtendedInstruction2<double, char*>) NULL,
00635 &WinAggAdd);
00636
00637 eit->add(
00638 "WinAggDrop", params_DBL_funcs,
00639 (ExtendedInstruction2<double, char*>) NULL,
00640 &WinAggDrop);
00641
00642 eit->add(
00643 "WinAggMin", params_DBL_funcs,
00644 (ExtendedInstruction2<double, char*>) NULL,
00645 &WinAggMin);
00646
00647 eit->add(
00648 "WinAggMax", params_DBL_funcs,
00649 (ExtendedInstruction2<double, char*>) NULL,
00650 &WinAggMax);
00651
00652 eit->add(
00653 "WinAggSum", params_DBL_funcs,
00654 (ExtendedInstruction2<double, char*>) NULL,
00655 &WinAggSum);
00656
00657 eit->add(
00658 "WinAggAvg", params_DBL_funcs,
00659 (ExtendedInstruction2<double, char*>) NULL,
00660 &WinAggAvg);
00661
00662 eit->add(
00663 "WinAggFirstValue", params_DBL_funcs,
00664 (ExtendedInstruction2<double, char*>) NULL,
00665 &WinAggFirstValue);
00666
00667 eit->add(
00668 "WinAggLastValue", params_DBL_funcs,
00669 (ExtendedInstruction2<double, char*>) NULL,
00670 &WinAggLastValue);
00671
00672
00673 vector params_mmvc_init;
00674 params_mmvc_init.push_back(STANDARD_TYPE_VARBINARY);
00675 params_mmvc_init.push_back(STANDARD_TYPE_VARCHAR);
00676
00677 eit->add(
00678 "WinAggInit", params_mmvc_init,
00679 (ExtendedInstruction2<char*,char*>) NULL,
00680 &WinAggInit);
00681
00682 vector params_StrA_funcs;
00683 params_StrA_funcs.push_back(STANDARD_TYPE_VARCHAR);
00684 params_StrA_funcs.push_back(STANDARD_TYPE_VARBINARY);
00685
00686 eit->add(
00687 "WinAggAdd", params_StrA_funcs,
00688 (ExtendedInstruction2<char *, char*>) NULL,
00689 &WinAggAdd);
00690
00691 eit->add(
00692 "WinAggDrop", params_StrA_funcs,
00693 (ExtendedInstruction2<char*, char*>) NULL,
00694 &WinAggDrop);
00695
00696 eit->add(
00697 "WinAggMin", params_StrA_funcs,
00698 (ExtendedInstruction2<char*, char*>) NULL,
00699 &WinAggMin);
00700
00701 eit->add(
00702 "WinAggMax", params_StrA_funcs,
00703 (ExtendedInstruction2<char*, char*>) NULL,
00704 &WinAggMax);
00705
00706 eit->add(
00707 "WinAggFirstValue", params_StrA_funcs,
00708 (ExtendedInstruction2<char*, char*>) NULL,
00709 &WinAggFirstValue);
00710
00711 eit->add(
00712 "WinAggLastValue", params_StrA_funcs,
00713 (ExtendedInstruction2<char*, char*>) NULL,
00714 &WinAggLastValue);
00715
00716 vector params_mmc_init;
00717 params_mmc_init.push_back(STANDARD_TYPE_VARBINARY);
00718 params_mmc_init.push_back(STANDARD_TYPE_CHAR);
00719
00720 eit->add(
00721 "WinAggInit", params_mmc_init,
00722 (ExtendedInstruction2<char*,char*>) NULL,
00723 &WinAggInit);
00724
00725 vector params_StrA2_funcs;
00726 params_StrA2_funcs.push_back(STANDARD_TYPE_CHAR);
00727 params_StrA2_funcs.push_back(STANDARD_TYPE_VARBINARY);
00728
00729 eit->add(
00730 "WinAggAdd", params_StrA2_funcs,
00731 (ExtendedInstruction2<char *, char*>) NULL,
00732 &WinAggAdd);
00733
00734 eit->add(
00735 "WinAggDrop", params_StrA2_funcs,
00736 (ExtendedInstruction2<char*, char*>) NULL,
00737 &WinAggDrop);
00738
00739 eit->add(
00740 "WinAggMin", params_StrA2_funcs,
00741 (ExtendedInstruction2<char*, char*>) NULL,
00742 &WinAggMin);
00743
00744 eit->add(
00745 "WinAggMax", params_StrA2_funcs,
00746 (ExtendedInstruction2<char*, char*>) NULL,
00747 &WinAggMax);
00748
00749 eit->add(
00750 "WinAggFirstValue", params_StrA2_funcs,
00751 (ExtendedInstruction2<char*, char*>) NULL,
00752 &WinAggFirstValue);
00753
00754 eit->add(
00755 "WinAggLastValue", params_StrA2_funcs,
00756 (ExtendedInstruction2<char*, char*>*) NULL,
00757 &WinAggLastValue);
00758 }
00759
00760
00761 FENNEL_END_CPPFILE("$Id: //open/dev/fennel/calculator/ExtWinAggFuncs.cpp#3 $");
00762
00763