Changeset: fee541b8dce7 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=fee541b8dce7
Modified Files:
        gdk/gdk_aggr.c
Branch: arrays
Log Message:

avg aggregates handles groups expressed as arrayBAT


diffs (109 lines):

diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -72,7 +72,7 @@ BATgroupaggrinit(BAT *b, BAT *g, BAT *e,
 
        if (b == NULL || !BAThdense(b))
                return "b must be dense-headed";
-       if (g) {
+       if (g && !isBATarray(g)) {
                if (!BAThdense(g) || BATcount(b) != BATcount(g) ||
                    (BATcount(b) != 0 && b->hseqbase != g->hseqbase))
                        return "b and g must be aligned";
@@ -1513,40 +1513,88 @@ BATgroupavg(BAT **bnp, BAT **cntsp, BAT 
                goto alloc_fail;
        dbls = (dbl *) Tloc(bn, BUNfirst(bn));
 
+#define dimensionAggrAvg(TPE) \
+       do {\
+               oid minD, maxD, stepD; \
+               long elR, grpR, el, grp; \
+               BUN elsNum, aggrGrp; \
+               const TPE *restrict vals = (const TPE *) Tloc(b, BUNfirst(b)); \
+               double elsPerAggrGrp =0 ; \
+\
+               dimensionCharacteristics(oid, g, &minD, &maxD, &stepD, &elR, 
&grpR); \
+               elsNum = dimensionElementsNum(minD, maxD, stepD); \
+               elsPerAggrGrp = elR*grpR; \
+\
+               for(aggrGrp=0; aggrGrp<elsNum; aggrGrp++) { \
+                       oid start = aggrGrp*elR;\
+fprintf(stderr, "%u: %u\n", (unsigned int)aggrGrp, (unsigned int)start); \
+                       dbls[aggrGrp] = 0; /*initialise to 0*/\
+                       for(grp=0; grp<grpR; grp++) { \
+                               for(el=0; el<elR; el++) { \
+                                       dbls[aggrGrp]+=vals[start+el]; \
+fprintf(stderr, "avg: group %u - (%u,%f) => %f\n", (unsigned int)aggrGrp, 
(unsigned int)(start+el), (double)vals[start+el], dbls[aggrGrp]); \
+                               }\
+                               start+=elsNum*elR; \
+                       } \
+                       dbls[aggrGrp]/=elsPerAggrGrp; \
+               } \
+       } while(0)
+
        if (BATtdense(g))
                gids = NULL;
-       else
+       else if(!isBATarray(g))
                gids = (const oid *) Tloc(g, BUNfirst(g) + start);
 
        switch (b->ttype) {
        case TYPE_bte:
-               AGGR_AVG(bte);
+               if(isBATarray(g))
+                       dimensionAggrAvg(bte);
+               else
+                       AGGR_AVG(bte);
                break;
        case TYPE_sht:
-               AGGR_AVG(sht);
+               if(isBATarray(g))
+                       dimensionAggrAvg(sht);
+               else
+                       AGGR_AVG(sht);
                break;
        case TYPE_int:
 #if SIZEOF_WRD == SIZEOF_INT
        case TYPE_wrd:
 #endif
-               AGGR_AVG(int);
+               if(isBATarray(g))
+                       dimensionAggrAvg(int);
+               else
+                       AGGR_AVG(int);
                break;
        case TYPE_lng:
 #if SIZEOF_WRD == SIZEOF_LNG
        case TYPE_wrd:
 #endif
-               AGGR_AVG(lng);
+               if(isBATarray(g))
+                       dimensionAggrAvg(lng);
+               else
+                       AGGR_AVG(lng);
                break;
 #ifdef HAVE_HGE
        case TYPE_hge:
-               AGGR_AVG(hge);
+               if(isBATarray(g))
+                       dimensionAggrAvg(hge);
+               else
+                       AGGR_AVG(hge);
                break;
 #endif
        case TYPE_flt:
-               AGGR_AVG_FLOAT(flt);
+               if(isBATarray(g))
+                       dimensionAggrAvg(flt);
+               else
+                       AGGR_AVG_FLOAT(flt);
                break;
        case TYPE_dbl:
-               AGGR_AVG_FLOAT(dbl);
+               if(isBATarray(g))
+                       dimensionAggrAvg(dbl);
+               else
+                       AGGR_AVG_FLOAT(dbl);
                break;
        default:
                GDKfree(rems);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to