Changeset: 030602ed1762 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=030602ed1762
Modified Files:
gdk/gdk.h
gdk/gdk_bat.c
gdk/gdk_batop.c
gdk/gdk_calc.c
gdk/gdk_join.c
gdk/gdk_private.h
gdk/gdk_select.c
monetdb5/mal/mal_type.h
monetdb5/modules/kernel/algebra.c
monetdb5/modules/kernel/algebra.mal
monetdb5/modules/mal/batcalc.c
sql/backends/monet5/sql.c
sql/backends/monet5/sql_gencode.c
sql/server/rel_schema.c
sql/storage/bat/bat_storage.c
Branch: arrays
Log Message:
updating the values of a cell are now possible by filtering the dimensions
diffs (truncated from 1118 to 300 lines):
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -971,6 +971,261 @@ typedef int (*GDKfcn) ();
#define batMaptheap S->map_theap
#define batArray S->array
+#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) \
+ return NULL; \
+\
+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 NULL; \
+ } \
+ } 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; \
+ })
+
+#ifdef HAVE_HGE
+#define dimensionBATsize(dimensionBAT) \
+ ({\
+ BUN sz = 0; \
+ switch(ATOMtype(dimensionBAT->ttype)) {\
+ case TYPE_bte: \
+ sz = dimensionBATsizeTPE(bte, dimensionBAT); \
+ break; \
+ case TYPE_sht: \
+ sz = dimensionBATsizeTPE(sht, dimensionBAT); \
+ break; \
+ case TYPE_int: \
+ sz = dimensionBATsizeTPE(int, dimensionBAT); \
+ break; \
+ case TYPE_lng: \
+ sz = dimensionBATsizeTPE(lng, dimensionBAT); \
+ break; \
+ case TYPE_hge: \
+ sz = dimensionBATsizeTPE(hge, dimensionBAT); \
+ break; \
+ case TYPE_flt: \
+ sz = dimensionBATsizeTPE(flt, dimensionBAT); \
+ break; \
+ case TYPE_dbl: \
+ sz = dimensionBATsizeTPE(dbl, dimensionBAT); \
+ break; \
+ case TYPE_oid: \
+ sz = dimensionBATsizeTPE(oid, dimensionBAT); \
+ break; \
+ default: \
+ fprintf(stderr, "dimensionBATsize: dimension type not handled\n");
\
+ } \
+ sz; \
+ })
+#else
+#define dimensionBATsize(dimensionBAT) \
+ ({\
+ BUN sz = 0; \
+ switch(ATOMtype(dimensionBAT->ttype)) {\
+ case TYPE_bte: \
+ sz = dimensionBATsizeTPE(bte, dimensionBAT); \
+ break; \
+ case TYPE_sht: \
+ sz = dimensionBATsizeTPE(sht, dimensionBAT); \
+ break; \
+ case TYPE_int: \
+ sz = dimensionBATsizeTPE(int, dimensionBAT); \
+ break; \
+ case TYPE_lng: \
+ sz = dimensionBATsizeTPE(lng, dimensionBAT); \
+ break; \
+ case TYPE_flt: \
+ sz = dimensionBATsizeTPE(flt, dimensionBAT); \
+ break; \
+ case TYPE_dbl: \
+ sz = dimensionBATsizeTPE(dbl, dimensionBAT); \
+ break; \
+ case TYPE_oid: \
+ sz = dimensionBATsizeTPE(oid, dimensionBAT); \
+ break; \
+ default: \
+ fprintf(stderr, "dimensionBATsize: dimension type not handled\n");
\
+ } \
+ sz; \
+ })
+#endif
+
+#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; \
+ })
+
+#ifdef HAVE_HGE
+#define materialiseDimensionBAT(dimensionBAT) \
+ ({\
+ BAT* resBAT = NULL; \
+ switch(ATOMtype(dimensionBAT->ttype)) {\
+ case TYPE_bte: \
+ materialiseDimensionTPE(bte, dimensionBAT); \
+ case TYPE_sht: \
+ resBAT = materialiseDimensionTPE(sht, dimensionBAT); \
+ break; \
+ case TYPE_int: \
+ resBAT = materialiseDimensionTPE(int, dimensionBAT); \
+ break; \
+ case TYPE_lng: \
+ resBAT = materialiseDimensionTPE(lng, dimensionBAT); \
+ break; \
+ case TYPE_hge: \
+ resBAT = materialiseDimensionTPE(hge, dimensionBAT); \
+ break; \
+ case TYPE_flt: \
+ resBAT = materialiseDimensionTPE(flt, dimensionBAT); \
+ break; \
+ case TYPE_dbl: \
+ resBAT = materialiseDimensionTPE(dbl, dimensionBAT); \
+ break; \
+ case TYPE_oid: \
+ resBAT = materialiseDimensionTPE(oid, dimensionBAT); \
+ break; \
+ default: \
+ fprintf(stderr, "materialiseDimension: dimension type not
handled\n"); \
+ } \
+ resBAT; \
+ })
+#else
+#define materialiseDimension(dimensionBAT) \
+ ({\
+ BAT* resBAT = NULL; \
+ switch(ATOMtype(dimensionBAT->ttype)) {\
+ case TYPE_bte: \
+ resBAT = materialiseDimensionTPE(bte, dimensionBAT); \
+ break; \
+ case TYPE_sht: \
+ resBAT = materialiseDimensionTPE(sht, dimensionBAT); \
+ break; \
+ case TYPE_int: \
+ resBAT = materialiseDimensionTPE(int, dimensionBAT); \
+ break; \
+ case TYPE_lng: \
+ resBAT = materialiseDimensionTPE(lng, dimensionBAT); \
+ break; \
+ case TYPE_flt: \
+ resBAT = materialiseDimensionTPE(flt, dimensionBAT); \
+ break; \
+ case TYPE_dbl: \
+ resBAT = materialiseDimensionTPE(dbl, dimensionBAT); \
+ break; \
+ case TYPE_oid: \
+ resBAT = materialiseDimensionTPE(oid, dimensionBAT); \
+ break; \
+ default: \
+ fprintf(stderr, "materialiseDimension: dimension type not
handled\n"); \
+ } \
+ resBAT; \
+ })
+#endif
+
+
+
/*
* @- Heap Management
* Heaps are the low-level entities of mass storage in
@@ -3261,6 +3516,7 @@ gdk_export gdk_return BATfirstn(BAT **to
*/
gdk_export BAT *BATsample(BAT *b, BUN n);
+gdk_export BAT* arrayBATmaterialise(BAT *dimensionBAT);
/*
*
*/
@@ -3480,3 +3736,6 @@ gdk_export BAT *BATsample(BAT *b, BUN n)
#endif
#endif /* _GDK_H_ */
+
+
+
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -42,6 +42,7 @@
#include "monetdb_config.h"
#include "gdk.h"
#include "gdk_private.h"
+#include <math.h>
#ifdef ALIGN
#undef ALIGN
@@ -1691,6 +1692,69 @@ 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;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list