Changeset: f202d0457981 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f202d0457981
Modified Files:
gdk/gdk.h
gdk/gdk_join.c
gdk/gdk_select.c
monetdb5/modules/kernel/algebra.c
monetdb5/modules/kernel/algebra.h
monetdb5/modules/kernel/algebra.mal
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql.c
sql/backends/monet5/sql.h
sql/backends/monet5/sql.mal
sql/backends/monet5/sql_gencode.c
sql/storage/bat/bat_storage.c
Branch: arrays
Log Message:
updating array by setting the value of a specific cell
e.g. update a set v=10 where x=1 and y=2;
Extra values are added in order to fill the empty values
between the last inserted and the new inserted values (if needed)
diffs (truncated from 798 to 300 lines):
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -3216,6 +3216,7 @@ gdk_export void BATsetprop(BAT *b, int i
#define JOIN_NE (-3)
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 *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);
@@ -3244,6 +3245,7 @@ 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 *BATslice(BAT *b, BUN low, BUN high);
gdk_export BAT *BATleftfetchjoin(BAT *b, BAT *s, BUN estimate);
diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -22,6 +22,7 @@
#include "gdk_private.h"
#include "gdk_calc_private.h"
+#include <math.h>
/*
* All "sub" join variants produce some sort of join on two input
* BATs, optionally subject to up to two candidate lists. Only values
@@ -2881,3 +2882,106 @@ BATproject(BAT *l, BAT *r)
BBPreclaim(bn);
return NULL;
}
+
+BAT* BATdimensionProject(BAT* oidsBAT, BAT* dimensionBAT) {
+ BAT *resBAT;
+ int tpe = ATOMtype(dimensionBAT->ttype);//, nilcheck = 1, sortcheck =
1, stringtrick = 0;
+// BUN lcount = BATcount(l), rcount = BATcount(r);
+
+ assert(BAThdense(oidsBAT));
+ assert(BAThdense(dimensionBAT));
+ assert(ATOMtype(oidsBAT->ttype) == TYPE_oid);
+
+#define project(TYPE) \
+ do { \
+ oid lo, hi; \
+ TYPE *bt; \
+ const oid *o; \
+\
+ /*find the min, max, step in the dimension*/ \
+ long repeat1, elementsNum; \
+ TYPE min, max, step; \
+ oid i; \
+ TYPE *el_in; \
+\
+ el_in = (TYPE*)Tloc(dimensionBAT, BUNfirst(dimensionBAT)); \
+ min = el_in[0]; \
+ step = el_in[BATcount(dimensionBAT)-1]; \
+\
+ repeat1 = 1; \
+ for(i=1; i<BATcount(dimensionBAT); i++) { \
+ if(min == el_in[i]) \
+ repeat1++; \
+ else { \
+ max = el_in[i]; \
+ break; \
+ } \
+ } \
+\
+ elementsNum = floor((max-min)/step) + 1; \
+\
+ o = (const oid *) Tloc(oidsBAT, BUNfirst(oidsBAT)); \
+ bt = (TYPE *) Tloc(resBAT, BUNfirst(resBAT)); \
+ for (lo = 0, hi = lo + BATcount(oidsBAT); lo < hi; lo++, o++, bt++)
{ \
+ if (*o == oid_nil) { \
+ *bt = TYPE##_nil; \
+ resBAT->T->nonil = 0; \
+ resBAT->T->nil = 1; \
+ resBAT->tsorted = 0; \
+ resBAT->trevsorted = 0; \
+ resBAT->tkey = 0; \
+ } else { \
+ long el = (*o%(repeat1*elementsNum))/repeat1; \
+ fprintf(stderr, "element: %ld\n", el); \
+ *bt = min+el*step; \
+ } \
+ } \
+ assert((BUN) lo == BATcount(oidsBAT)); \
+ BATseqbase(resBAT,0); \
+ BATsetcount(resBAT, (BUN) lo); \
+\
+ } while(0)
+
+ if((resBAT = BATnew(TYPE_void, tpe, BATcount(oidsBAT), TRANSIENT)) ==
NULL)
+ return NULL;
+
+ switch (tpe) {
+ case TYPE_bte:
+ project(bte);
+ break;
+ case TYPE_sht:
+ project(sht);//, l, r, nilcheck, sortcheck);
+ break;
+ case TYPE_int:
+ project(int);//, l, r, nilcheck, sortcheck);
+ break;
+ case TYPE_flt:
+ project(flt);//, l, r, nilcheck, sortcheck);
+ break;
+ case TYPE_dbl:
+ project(dbl);//, l, r, nilcheck, sortcheck);
+ break;
+ case TYPE_lng:
+ project(lng);//, l, r, nilcheck, sortcheck);
+ break;
+#ifdef HAVE_HGE
+ case TYPE_hge:
+ project(hge);//, l, r, nilcheck, sortcheck);
+ break;
+#endif
+ case TYPE_oid:
+#if SIZEOF_OID == SIZEOF_INT
+ project(int);//, l, r, nilcheck, sortcheck);
+#else
+ project(lng);//, l, r, nilcheck, sortcheck);
+#endif
+ break;
+ default:
+ fprintf(stderr, "BATdimensionProject: dimension type not
handled\n");
+ return NULL;
+ //res = project_any(bn, l, r, nilcheck);
+ //break;
+ }
+
+ return resBAT;
+}
diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -1552,6 +1552,160 @@ BATsubselect(BAT *b, BAT *s, const void
return virtualize(bn);
}
+BAT *
+BATdimensionSubselect(BAT *inBAT, BAT *candBAT, const void *low, const void
*high, int li, int hi, int anti) {
+ int type;
+ const void *nil;
+ oid elements_in_result =0;
+ BAT *b_tmp, *resBAT;
+
+ type = inBAT->ttype;
+ nil = ATOMnilptr(type);
+ type = ATOMbasetype(type);
+
+
+(void)li;
+(void)hi;
+(void)anti;
+(void)*(int*)nil;
+
+ if(ATOMcmp(type, low, high) == 0) { //point selection
+ long repeat1, repeat2, elementsNum;
+ long element_oid =0, i, j;
+ oid *res = NULL;
+
+#define elements(TPE, el) \
+ do { \
+ TPE min, max, step, it; \
+ TPE *el_in; \
+ oid i; \
+\
+ el_in = (TPE*)Tloc(inBAT, BUNfirst(inBAT)); \
+ min = el_in[0]; \
+ step = el_in[BATcount(inBAT)-1]; \
+\
+ repeat1 = 1; \
+ for(i=1; i<BATcount(inBAT); i++) { \
+ if(min == el_in[i]) \
+ repeat1++; \
+ else { \
+ max = el_in[i]; \
+ break; \
+ } \
+ } \
+\
+ repeat2 = BATcount(inBAT) - i -1; \
+\
+ elementsNum = floor((max-min)/step) + 1; \
+\
+ element_oid = 0; \
+ for(it = min ; it <= max ; it += step) { \
+ if(it != el) \
+ element_oid++; \
+ else \
+ break; \
+ } \
+\
+ element_oid *= repeat1; \
+ } while(0)
+
+ switch (ATOMtype(type)) {
+ case TYPE_bte:
+ elements(bte, *(bte*)low);
+ break;
+ case TYPE_sht:
+ elements(sht, *(sht*)low);
+ break;
+ case TYPE_int:
+ elements(int, *(int*)low);
+ break;
+ case TYPE_lng:
+ elements(lng, *(lng*)low);
+ break;
+#ifdef HAVE_HGE
+ case TYPE_hge:
+ elements(hge, *(hge*)low);
+ break;
+#endif
+ case TYPE_flt:
+ elements(flt, *(flt*)low);
+ break;
+ case TYPE_dbl:
+ elements(dbl, *(dbl*)low);
+ break;
+ case TYPE_oid:
+ elements(oid, *(oid*)low);
+ break;
+ default:
+ fprintf(stderr, "BATdimensionSubselect: dimension type
not handled\n");
+ return NULL;
+ }
+
+ elements_in_result = repeat1*repeat2;
+
+ //create new BAT
+ if((b_tmp = BATnew(TYPE_void, TYPE_oid, elements_in_result,
TRANSIENT)) == NULL) \
+ return NULL;
+
+ res = (oid*) Tloc(b_tmp, BUNfirst(b_tmp));
+ //add the oids in the result
+ for(j=0; j<repeat2; j++) {
+ for(i=0; i<repeat1; i++) {
+ fprintf(stderr, "Added oid: %ld\n",
element_oid);
+ *res = element_oid;
+ res++;
+ element_oid++;
+ }
+
+ element_oid += ((elementsNum*repeat1) - repeat1);
+ }
+
+ BATsetcount(b_tmp,elements_in_result);
+
+ } else {
+ if((b_tmp = BATnew(TYPE_void, TYPE_oid, elements_in_result,
TRANSIENT)) == NULL) \
+ return NULL;
+ }
+
+ if(candBAT) {
+ oid *current_elements, *cand_elements, *elements;
+ oid i, j;
+
+ elements_in_result = (BATcount(b_tmp) >
BATcount(candBAT))?BATcount(candBAT):BATcount(b_tmp);
+
+ if((resBAT = BATnew(TYPE_void, TYPE_oid, elements_in_result,
TRANSIENT)) == NULL) \
+ return NULL;
+
+ cand_elements = (oid*)Tloc(candBAT, BUNfirst(candBAT));
+ current_elements = (oid*)Tloc(b_tmp, BUNfirst(b_tmp));
+ elements = (oid*)Tloc(resBAT, BUNfirst(resBAT));
+ elements_in_result = 0;
+
+ //compare the results in the two BATs and keep only the common ones
+ for(i=0,j=0; i<BATcount(b_tmp) && j<BATcount(candBAT); ) {
+ if(cand_elements[j] == current_elements[i]) {
+ elements[elements_in_result] = current_elements[i];
+ fprintf(stderr, "Final element: %ld\n",
current_elements[i]);
+
+ elements_in_result++;
+ i++;
+ j++;
+ } else if(cand_elements[j] < current_elements[i])
+ j++;
+ else
+ i++;
+ }
+ } else
+ resBAT = b_tmp;
+
+
+ BATsetcount(resBAT,elements_in_result);
+ BATseqbase(resBAT,0);
+ BATderiveProps(resBAT,FALSE);
+
+ return resBAT;
+}
+
/* theta select
*
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list