Changeset: 5ee0a9b3e3a6 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5ee0a9b3e3a6
Added Files:
        gdk/gdk_arrays.c
        gdk/gdk_arrays.h
        sql/backends/monet5/sql_arrays.c
        sql/backends/monet5/sql_arrays.h
        sql/backends/monet5/sql_arrays.mal
Modified Files:
        gdk/Makefile.ag
        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/Makefile.ag
        monetdb5/modules/kernel/algebra.c
        monetdb5/modules/kernel/algebra.h
        monetdb5/modules/kernel/algebra.mal
        monetdb5/modules/kernel/arrays.c
        monetdb5/modules/kernel/arrays.h
        monetdb5/modules/kernel/arrays.mal
        monetdb5/modules/mal/batcalc.c
        sql/backends/monet5/Makefile.ag
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql.h
        sql/backends/monet5/sql.mal
        sql/backends/monet5/sql_result.c
        sql/storage/bat/res_table.c
Branch: arrays
Log Message:

even better seperation of arrays code in own files
hopefully everything now has been moved


diffs (truncated from 5211 to 300 lines):

diff --git a/gdk/Makefile.ag b/gdk/Makefile.ag
--- a/gdk/Makefile.ag
+++ b/gdk/Makefile.ag
@@ -31,7 +31,8 @@ lib_gdk = {
                gdk_unique.c \
                gdk_firstn.c \
                bat.feps bat1.feps bat2.feps \
-               libbat.rc
+               libbat.rc \
+               gdk_arrays.c gdk_arrays.h
        LIBS = ../common/options/libmoptions \
                ../common/stream/libstream \
                ../common/utils/libmutils \
@@ -52,7 +53,8 @@ headers_h = {
                gdk_posix.h \
                gdk_search.h \
                gdk_system.h \
-               gdk_utils.h
+               gdk_utils.h \
+               gdk_arrays.h
 }
 
 headers_pc = {
diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -10,7 +10,7 @@
 #include "gdk.h"
 #include "gdk_private.h"
 #include "gdk_calc_private.h"
-#include <arrays.h>
+#include "gdk_arrays.h"
 
 #include <math.h>
 /* grouped aggregates
diff --git a/gdk/gdk_arrays.c b/gdk/gdk_arrays.c
new file mode 100644
--- /dev/null
+++ b/gdk/gdk_arrays.c
@@ -0,0 +1,1540 @@
+#include "monetdb_config.h"
+#include "gdk_arrays.h"
+
+gdk_return gdk_error_msg(errors errorCode, const char* funcName, const char 
*msg) {
+       switch(errorCode) {
+               case general_error:
+                       GDKerror("%s :%s", funcName, msg);
+               case new_bat:
+                       GDKerror("%s: Problem allocating space for new BAT", 
funcName);
+               case dimension_type:
+                       GDKerror("%s: Dimension type not handled", funcName);
+               case value_type:
+                       GDKerror("%s: Column type not handled", funcName);
+               default:
+                       GDKerror("%s: Unknown Problem", funcName);              
                
+       }
+       return GDK_FAIL;
+}
+
+#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 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((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; \
+    })
+
+/*materialise a dimension BAT*/
+BAT* materialiseDimensionBAT(BAT *dimensionBAT) {
+    if(!isBATarray(dimensionBAT))
+        return dimensionBAT;
+
+     switch(ATOMtype(dimensionBAT->ttype)) {
+        case TYPE_bte:
+            return materialiseDimensionTPE(bte, dimensionBAT);
+        case TYPE_sht:
+            return materialiseDimensionTPE(sht, dimensionBAT);
+        case TYPE_int:
+            return materialiseDimensionTPE(int, dimensionBAT);
+        case TYPE_flt:
+            return materialiseDimensionTPE(flt, dimensionBAT);
+        case TYPE_dbl:
+            return materialiseDimensionTPE(dbl, dimensionBAT);
+        case TYPE_lng:
+            return materialiseDimensionTPE(lng, dimensionBAT);
+#ifdef HAVE_HGE
+        case TYPE_hge:
+            return materialiseDimensionTPE(hge, dimensionBAT);
+#endif
+        case TYPE_oid:
+#if SIZEOF_OID == SIZEOF_INT
+            return materialiseDimensionTPE(int, dimensionBAT);
+#else
+            return materialiseDimensionTPE(lng, dimensionBAT);
+#endif
+        break;
+        default:
+            fprintf(stderr, "materialiseDimensionBAT: dimension type not 
handled\n");
+            return NULL;
+    }
+    return NULL;
+}
+
+
+/*the size of the BAT after the materialisation of the dimension*/
+BUN dimensionBATsize(BAT *dimensionBAT) {
+    if(!isBATarray(dimensionBAT))
+        return BATcount(dimensionBAT);
+
+     switch(ATOMtype(dimensionBAT->ttype)) {
+        case TYPE_bte:
+            return dimensionBATsizeTPE(bte, dimensionBAT);
+        case TYPE_sht:
+            return dimensionBATsizeTPE(sht, dimensionBAT);
+        case TYPE_int:
+            return dimensionBATsizeTPE(int, dimensionBAT);
+        case TYPE_flt:
+            return dimensionBATsizeTPE(flt, dimensionBAT);
+        case TYPE_dbl:
+            return dimensionBATsizeTPE(dbl, dimensionBAT);
+        case TYPE_lng:
+            return dimensionBATsizeTPE(lng, dimensionBAT);
+#ifdef HAVE_HGE
+        case TYPE_hge:
+            return dimensionBATsizeTPE(hge, dimensionBAT);
+#endif
+        case TYPE_oid:
+#if SIZEOF_OID == SIZEOF_INT
+            return dimensionBATsizeTPE(int, dimensionBAT);
+#else
+            return dimensionBATsizeTPE(lng, dimensionBAT);
+#endif
+        break;
+        default:
+            fprintf(stderr, "dimensionBATsize: dimension type not handled\n");
+    }
+    return 0;
+}
+
+
+/*The number of indices in the dimension, i.e. dimension[1:2:7] -> 4 elements 
(1,3,5,7)*/
+BUN dimensionBATelementsNum(BAT* dimensionBAT) {
+#define num(TPE) \
+    ({ \
+        TPE min, max, step; \
+        long elementRepeats, groupRepeats; \
+        dimensionCharacteristics(TPE, dimensionBAT, &min, &max, &step, 
&elementRepeats, &groupRepeats); \
+        dimensionElementsNum(min, max, step); \
+    })
+    switch(ATOMtype(BATttype(dimensionBAT))) {
+        case TYPE_bte:
+            return num(bte);
+        case TYPE_sht:
+            return num(sht);
+        case TYPE_int:
+            return num(int);
+        case TYPE_flt:
+            return num(flt);
+        case TYPE_dbl:
+            return num(dbl);
+        case TYPE_lng:
+            return num(lng);
+#ifdef HAVE_HGE
+        case TYPE_hge:
+            return num(hge);
+#endif
+        case TYPE_oid:
+#if SIZEOF_OID == SIZEOF_INT
+            return num(int);
+#else
+            return num(lng);
+#endif
+        break;
+        default:
+            fprintf(stderr, "dimensionBATelementsNum: dimension type not 
handled\n");
+    }
+
+    return 0;
+}
+
+
+/*get the oids in the tail of oidsBAT and for each oid the correposdig value 
from 
+ * dimensionBAT. Set the the oid position in resBAT to this value */
+BUN dimension_void_replace_bat(BAT *resBAT, BAT *oidsBAT, BAT *dimensionBAT, 
bit force) {
+    BUN nr = 0;
+    BUN r, s;
+    BATiter oidsBAT_iter = bat_iterator(oidsBAT);
+
+#define replace(TPE) \
+    do {\
+        TPE dimMin, dimMax, dimStep; \
+        long dimGroupRepeats, dimElementRepeats; \
+        dimensionCharacteristics(TPE, dimensionBAT, &dimMin, &dimMax, 
&dimStep, &dimElementRepeats, &dimGroupRepeats); \
+\
+fprintf(stderr, "%d-%d-%d, %ld, %ld\n", (int)dimMin, (int)dimStep, 
(int)dimMax, dimElementRepeats, dimGroupRepeats); \
+        BATloop(oidsBAT, r, s) { \
+            oid updid = *(oid *) BUNtail(oidsBAT_iter, r); \
+            TPE val = dimensionElement(dimMin, dimMax, dimStep, 
dimElementRepeats, r); \
+\
+            if (void_inplace(resBAT, updid, &val, force) == GDK_FAIL) \
+                return BUN_NONE; \
+            nr++; \
+        } \
+    } while(0)
+
+    switch (ATOMtype(ATOMbasetype(dimensionBAT->ttype))) {
+        case TYPE_bte:
+            replace(bte);
+            break;
+        case TYPE_sht:
+            replace(sht);
+            break;
+        case TYPE_int:
+            replace(int);
+            break;
+        case TYPE_flt:
+            replace(flt);
+            break;
+        case TYPE_dbl:
+            replace(dbl);
+            break;
+        case TYPE_lng:
+            replace(lng);
+            break;
+#ifdef HAVE_HGE
+        case TYPE_hge:
+            replace(hge);
+            break;
+#endif
+        case TYPE_oid:
+#if SIZEOF_OID == SIZEOF_INT
+            replace(int);
+#else
+            replace(lng);
+#endif
+        break;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to