Changeset: 75230b291877 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=75230b291877
Modified Files:
        gdk/Makefile.ag
        gdk/gdk.h
        gdk/gdk_aggr.c
        gdk/gdk_bat.c
        gdk/gdk_batop.c
        gdk/gdk_group.c
        gdk/gdk_join.c
        gdk/gdk_select.c
        monetdb5/modules/kernel/algebra.c
        monetdb5/modules/kernel/algebra.h
        monetdb5/modules/mal/batcalc.c
        sql/server/sql_mvc.h
        sql/storage/bat/res_table.c
Branch: arrays
Log Message:

moved arrays code in own files minimising as much as possible including it in 
code that
is not arrays specific
+ fixed a bug in dimensionBATsubselect when having anti


diffs (truncated from 1798 to 300 lines):

diff --git a/gdk/Makefile.ag b/gdk/Makefile.ag
--- a/gdk/Makefile.ag
+++ b/gdk/Makefile.ag
@@ -30,6 +30,7 @@ lib_gdk = {
                gdk_join.c gdk_join_legacy.c \
                gdk_unique.c \
                gdk_firstn.c \
+               gdk_arrays.c gdk_arrays_aggr.c gdk_arrays.h \
                bat.feps bat1.feps bat2.feps \
                libbat.rc
        LIBS = ../common/options/libmoptions \
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -968,125 +968,6 @@ typedef int (*GDKfcn) ();
 #define BATsetArray(X, n) X->batArray=n
 #define isBATarray(X) X->batArray>0
 
-/*Dimensional Columns*/
-#define dimensionCharacteristics(TPE, dimensionBAT, min, max, step, 
elementRepeats, groupRepeats) \
-do {\
-    TPE *vls; \
-    BUN i; \
-    vls = (TPE*)Tloc(dimensionBAT, BUNfirst(dimensionBAT)); \
-    *min = vls[0]; \
-    *step = vls[BATcount(dimensionBAT)-1]; \
-    *max = vls[BATcount(dimensionBAT)-2]; \
-\
-    *elementRepeats = *groupRepeats = 0; \
-    vls = (TPE*)Tloc(dimensionBAT, BUNfirst(dimensionBAT)); \
-\
-    for(i=0; i<BATcount(dimensionBAT)-2; i++) { /*last element is the step and 
at least one element is max*/\
-        if(vls[i] != *min) \
-            break; \
-        (*elementRepeats)++; \
-    } \
-    *groupRepeats = BATcount(dimensionBAT)-i-1; \
-} while(0)
-
-#define dimensionElement(min, max, step, elementRepeats, oid) \
-    ({ \
-        long elementsNum = floor((max-min)/step) + 1; \
-        long elementsPerGroup = elementsNum*elementRepeats; \
-        long elementInGroup = floor((oid%elementsPerGroup)/elementRepeats); \
-/*fprintf(stderr, "dimension element at %d is %d\n", (int)oid, 
(int)(min+elementInGroup*step)); */\
-        min+elementInGroup*step; \
-    })
-
-#define createDimension(TPE, min, max, step, elementRepeats, groupRepeats) \
-    ({ \
-        long i; \
-        TPE* vls; \
-        BAT *resBAT = BATnew(TYPE_void, TYPE_##TPE, 
elementRepeats+groupRepeats+1, TRANSIENT); \
-        if(resBAT) { \
-fprintf(stderr, "createDimension: %ld total elements\n", 
(elementRepeats+groupRepeats+1)); \
-               vls = (TPE*)Tloc(resBAT, BUNfirst(resBAT)); \
-               for(i=0; i<elementRepeats; i++) { \
-                   *vls = min; \
-                   vls++; \
-               } \
-               for(i=0; i<groupRepeats; i++) { \
-                   *vls = max; \
-                   vls++; \
-               } \
-               *vls = step; \
-\
-               BATsetcount(resBAT,elementRepeats+groupRepeats+1); \
-               BATseqbase(resBAT,0); \
-               BATderiveProps(resBAT,FALSE); \
-               resBAT->batArray=1; \
-               } \
-        resBAT; \
-    })
-
-#define dimensionElementsNum(min, max, step)\
-    ({\
-        long num = 1; \
-        if(!step) { \
-            if(min!=max) { \
-                GDKerror("dimensionElementsNum: step is 0 but min and max are 
not equal\n"); \
-                return 0; \
-            } \
-        } else \
-            num = floor((max-min)/step) + 1; \
-        num; \
-    })
-
-#define dimensionBATsizeTPE(TPE, dimensionBAT) \
-    ({\
-        TPE min, max, step; \
-        long elementRepeats, groupRepeats; \
-        BUN elementsNum; \
-        dimensionCharacteristics(TPE, dimensionBAT, &min, &max, &step, 
&elementRepeats, &groupRepeats); \
-        elementsNum = dimensionElementsNum(min, max, step); \
-        elementsNum*elementRepeats*groupRepeats; \
-    })
-
-#define materialiseDimensionTPE(TPE, dimensionBAT) \
-    ({ \
-        /*find the min, max, step in the dimension*/ \
-        long elementRepeats, groupRepeats, elementsNum; \
-        TPE min, max, step; \
-        oid i, j; \
-        TPE *el_out, el; \
-        BAT *resBAT; \
-\
-        dimensionCharacteristics(TPE, dimensionBAT, &min, &max, &step, 
&elementRepeats, &groupRepeats); \
-/*fprintf(stderr, "materialise: elementRepeats = %ld - groupRepeats = %ld\n", 
elementRepeats, groupRepeats); */\
-        elementsNum = dimensionElementsNum(min, max, step); \
-/*fprintf(stderr, "materialise elementsNum = %ld\n", elementsNum); */\
-        if(!step) \
-            step = 1 ; /*if 0 then it loops for ever when adding the elements 
in the resBAT*/\
-\
-        if((resBAT = BATnew(TYPE_void, TYPE_##TPE, 
elementRepeats*elementsNum*groupRepeats, TRANSIENT)) == NULL) \
-            GDKerror("materialiseDimensionTPE: Unable to create output BAT"); \
-\
-        el_out = (TPE*)Tloc(resBAT, BUNfirst(resBAT)); \
-        for(j=0; j<(unsigned long)groupRepeats; j++) { \
-/*fprintf(stderr, "materialise: group repetition %ld\n", j); */\
-            for(el=min; el<=max; el+=step) { \
-                for(i=0; i<(unsigned long)elementRepeats; i++) { \
-/*fprintf(stderr, "materialise: element repetition %ld\n", i); */\
-                    *el_out = el; \
-                    el_out++; \
-                } \
-            } \
-        } \
-\
-        BATseqbase(resBAT,0); \
-        BATsetcount(resBAT, elementRepeats*elementsNum*groupRepeats);          
        \
-        BATderiveProps(resBAT,FALSE); \
-        resBAT; \
-    })
-
-gdk_export BAT* materialiseDimensionBAT(BAT* dimensionBAT);
-gdk_export BUN dimensionBATsize(BAT* dimensionBAT);
-gdk_export BUN dimensionBATelementsNum(BAT* dimensionBAT);
 /*
  * @- Heap Management
  * Heaps are the low-level entities of mass storage in
@@ -3314,13 +3195,8 @@ gdk_export void BATsetprop(BAT *b, int i
 #define JOIN_BAND      3
 #define JOIN_NE                (-3)
 
-gdk_export BAT *BATmbrsubselect(BAT *dimensionBAT, BAT *oidsBAT, BAT 
*candsBAT);
-gdk_export BAT *BATmbrproject(BAT *b, BAT *s, BAT *subselectBAT);
-
 gdk_export BAT *BATsubselect(BAT *b, BAT *s, const void *tl, const void *th, 
int li, int hi, int anti);
-gdk_export BAT *BATdimensionSubselect(BAT *b, BAT *s, const void *tl, const 
void *th, int li, int hi, int anti);
 gdk_export BAT *BATthetasubselect(BAT *b, BAT *s, const void *val, const char 
*op);
-gdk_export BAT *BATdimensionThetasubselect(BAT *b, BAT *s, const void *val, 
const char *op);
 gdk_export BAT *BATselect_(BAT *b, const void *tl, const void *th, bit li, bit 
hi);
 gdk_export BAT *BATuselect_(BAT *b, const void *tl, const void *th, bit li, 
bit hi);
 gdk_export BAT *BATselect(BAT *b, const void *tl, const void *th);
@@ -3348,8 +3224,6 @@ gdk_export gdk_return BATsubleftfetchjoi
 gdk_export gdk_return BATsubbandjoin(BAT **r1p, BAT **r2p, BAT *l, BAT *r, BAT 
*sl, BAT *sr, const void *c1, const void *c2, int li, int hi, BUN estimate);
 gdk_export gdk_return BATsubrangejoin(BAT **r1p, BAT **r2p, BAT *l, BAT *rl, 
BAT *rh, BAT *sl, BAT *sr, int li, int hi, BUN estimate);
 gdk_export BAT *BATproject(BAT *l, BAT *r);
-gdk_export BAT *BATdimensionProject(BAT *l, BAT *r);
-//gdk_export BAT *BATnonDimensionProject(BAT *l, BAT *r);
 
 gdk_export BAT *BATslice(BAT *b, BUN low, BUN high);
 gdk_export BAT *BATleftfetchjoin(BAT *b, BAT *s, BUN estimate);
diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -10,8 +10,9 @@
 #include "gdk.h"
 #include "gdk_private.h"
 #include "gdk_calc_private.h"
+#include "gdk_arrays.h"
+
 #include <math.h>
-
 /* grouped aggregates
  *
  * The following functions take two to four input BATs and produce a
@@ -1513,88 +1514,43 @@ 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(isBATarray(g))
+               return dimensionBATgroupavg(bnp, cntsp, b, g, e, s, tp, 
skip_nils, abort_on_error);
 
        if (BATtdense(g))
                gids = NULL;
-       else if(!isBATarray(g))
+       else
                gids = (const oid *) Tloc(g, BUNfirst(g) + start);
 
        switch (b->ttype) {
        case TYPE_bte:
-               if(isBATarray(g))
-                       dimensionAggrAvg(bte);
-               else
-                       AGGR_AVG(bte);
+               AGGR_AVG(bte);
                break;
        case TYPE_sht:
-               if(isBATarray(g))
-                       dimensionAggrAvg(sht);
-               else
-                       AGGR_AVG(sht);
+               AGGR_AVG(sht);
                break;
        case TYPE_int:
 #if SIZEOF_WRD == SIZEOF_INT
        case TYPE_wrd:
 #endif
-               if(isBATarray(g))
-                       dimensionAggrAvg(int);
-               else
-                       AGGR_AVG(int);
+               AGGR_AVG(int);
                break;
        case TYPE_lng:
 #if SIZEOF_WRD == SIZEOF_LNG
        case TYPE_wrd:
 #endif
-               if(isBATarray(g))
-                       dimensionAggrAvg(lng);
-               else
-                       AGGR_AVG(lng);
+               AGGR_AVG(lng);
                break;
 #ifdef HAVE_HGE
        case TYPE_hge:
-               if(isBATarray(g))
-                       dimensionAggrAvg(hge);
-               else
-                       AGGR_AVG(hge);
+               AGGR_AVG(hge);
                break;
 #endif
        case TYPE_flt:
-               if(isBATarray(g))
-                       dimensionAggrAvg(flt);
-               else
-                       AGGR_AVG_FLOAT(flt);
+               AGGR_AVG_FLOAT(flt);
                break;
        case TYPE_dbl:
-               if(isBATarray(g))
-                       dimensionAggrAvg(dbl);
-               else
-                       AGGR_AVG_FLOAT(dbl);
+               AGGR_AVG_FLOAT(dbl);
                break;
        default:
                GDKfree(rems);
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -42,7 +42,7 @@
 #include "monetdb_config.h"
 #include "gdk.h"
 #include "gdk_private.h"
-#include <math.h>
+#include "gdk_arrays.h"
 
 #ifdef ALIGN
 #undef ALIGN
@@ -1694,69 +1694,6 @@ void_inplace(BAT *b, oid id, const void 
        return res;
 }
 
-
-static BUN
-dimension_void_replace_bat(BAT *b, BAT *p, BAT *dimensionBAT, bit force)
-{
-       BUN nr = 0;
-       BUN r, s;
-       BATiter uii = bat_iterator(p);
-
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to