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

Reply via email to