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