Changeset: cb85368b5f20 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=cb85368b5f20
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_gencode.c
        sql/backends/monet5/sql_statement.c
        sql/backends/monet5/sql_statement.h
        sql/common/sql_list.c
        sql/include/sql_list.h
        sql/include/sql_relation.h
        sql/server/rel_exp.c
        sql/server/rel_exp.h
        sql/server/rel_optimizer.c
        sql/server/rel_planner.c
        sql/server/rel_select.c
Branch: arrays
Log Message:

creating mbr array when queries like
>select * from a where v=10 AND
>select * from a where v<10


diffs (truncated from 975 to 300 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -3321,6 +3321,9 @@ gdk_export void BATsetprop(BAT *b, int i
 #define JOIN_BAND      3
 #define JOIN_NE                (-3)
 
+gdk_export BAT *BATmbrsubselect(BAT *dimensionBAT, BAT *oidsBAT, BAT 
*candsBAT);
+gdk_export BAT *BATmbrproject(BAT *b, BAT *s, BAT *subselectBAT);
+
 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);
@@ -3353,7 +3356,7 @@ gdk_export gdk_return BATsubbandjoin(BAT
 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 *BATnonDimensionProject(BAT *l, BAT *r);
+//gdk_export BAT *BATnonDimensionProject(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
@@ -3619,6 +3619,115 @@ fprintf(stderr, "dimensionise: elementRe
        return resBAT;
 }
 
+BAT *
+BATmbrproject(BAT *b, BAT *oidsToProjectBAT, BAT *subselectBAT) {
+       BUN c, l, subC, subL;
+       //execute the projection using the subselection result
+       BAT *projectBAT = BATproject(subselectBAT, b);
+
+       BATiter oidsToProjectBAT_iter = bat_iterator(oidsToProjectBAT);    
+       BATiter sub_iter = bat_iterator(subselectBAT);
+       BATiter proj_iter = bat_iterator(projectBAT);
+
+    //set NULL to all values  in s but not is subselectBAT
+    BAT *resBAT = BATnew(TYPE_void, b->ttype, BATcount(oidsToProjectBAT), 
TRANSIENT);
+    if(!resBAT)
+           return NULL;
+
+       subC = BUNfirst(subselectBAT);
+       subL = BUNlast(subselectBAT);
+       BATloop(oidsToProjectBAT, c, l) {
+               oid oid_pr = *(oid*)BUNtail(oidsToProjectBAT_iter, c);
+               //check if the oid_ptr exists in subselectBAT
+               if(subC < subL) {
+                       oid oid_sub = *(oid*)BUNtail(sub_iter, subC);
+                       while(oid_pr<oid_sub && subC<subL){
+                                       switch (ATOMtype(b->ttype)) {
+                                       case TYPE_bte:
+                                                       BUNappend(resBAT, 
&bte_nil, 1); 
+                                           break;
+                                       case TYPE_sht:
+                                           BUNappend(resBAT, &sht_nil, 1);     
+                                           break;
+                                       case TYPE_int:
+                                           BUNappend(resBAT, &int_nil, 1);     
+                                           break;
+                                       case TYPE_flt:
+                                           BUNappend(resBAT, &flt_nil, 1);     
+                                           break;
+                                       case TYPE_dbl:
+                                           BUNappend(resBAT, &dbl_nil, 1);     
+                                           break;
+                                       case TYPE_lng:
+                                           BUNappend(resBAT, &lng_nil, 1);     
+                                           break;
+#ifdef HAVE_HGE
+                                       case TYPE_hge:
+                                           BUNappend(resBAT, &hge_nil, 1);     
+                                           break;
+#endif
+                                       case TYPE_oid:
+#if SIZEOF_OID == SIZEOF_INT
+                                           BUNappend(resBAT, &int_nil, 1);     
+#else
+                                           BUNappend(resBAT, &lng_nil, 1);
+#endif
+                                               break;
+                                       default:
+                                           fprintf(stderr, "BATmbrProject: 
type not handled\n");
+                                           return NULL;
+                               }
+                                       c++;
+                                       oid_pr = 
*(oid*)BUNtail(oidsToProjectBAT_iter, c);
+                               //BUNappend(resBAT, NULL, 1);
+                       }
+                       BUNappend(resBAT, BUNtail(proj_iter, subC), 1);
+                       subC++;
+               } else { //put null values at the end
+                       switch (ATOMtype(b->ttype)) {
+                       case TYPE_bte:
+                                       BUNappend(resBAT, &bte_nil, 1); 
+                           break;
+                       case TYPE_sht:
+                           BUNappend(resBAT, &sht_nil, 1);     
+                           break;
+                       case TYPE_int:
+                           BUNappend(resBAT, &int_nil, 1);     
+                           break;
+                       case TYPE_flt:
+                           BUNappend(resBAT, &flt_nil, 1);     
+                           break;
+                       case TYPE_dbl:
+                           BUNappend(resBAT, &dbl_nil, 1);     
+                           break;
+                       case TYPE_lng:
+                           BUNappend(resBAT, &lng_nil, 1);     
+                           break;
+#ifdef HAVE_HGE
+                       case TYPE_hge:
+                           BUNappend(resBAT, &hge_nil, 1);     
+                           break;
+#endif
+                       case TYPE_oid:
+#if SIZEOF_OID == SIZEOF_INT
+                           BUNappend(resBAT, &int_nil, 1);     
+#else
+                           BUNappend(resBAT, &lng_nil, 1);
+#endif
+                               break;
+                       default:
+                           fprintf(stderr, "BATmbrProject: type not 
handled\n");
+                                           return NULL;
+               }
+               }
+       }
+       BATsetcount(resBAT,BATcount(b));
+    BATseqbase(resBAT,0);
+    BATderiveProps(resBAT,FALSE);
+       return resBAT;
+}
+
+#if 0
 BAT* BATnonDimensionProject(BAT* oidsBAT, BAT* dimensionBAT) {
        BAT *resBAT;
        int tpe = ATOMtype(dimensionBAT->ttype);//, nilcheck = 1, sortcheck = 
1, stringtrick = 0;
@@ -3794,3 +3903,4 @@ fprintf(stderr, "BATnondimensionProject:
 
        return resBAT;
 }
+#endif
diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -2028,6 +2028,72 @@ BATdimensionSubselect(BAT *dimensionBAT,
         return resBAT;
 }
 
+BAT *
+BATmbrsubselect(BAT *dimensionBAT, BAT *oidsBAT, BAT *candsBAT) {
+       BAT *resBAT = NULL;
+       (void)*candsBAT;
+
+#define mbr(TPE) \
+    do { \
+        TPE dimMin, dimMax, dimStep; \
+               long dimElementRepeats, dimGroupRepeats; \
+        TPE resMin, resMax; \
+        BATiter oidsIter = bat_iterator(oidsBAT); \
+        BUN p, q; \
+\
+        dimensionCharacteristics(TPE, dimensionBAT, &dimMin, &dimMax, 
&dimStep, &dimElementRepeats, &dimGroupRepeats); \
+        /*loop over the elemets corresponding to the oids and find min and 
max*/ \
+        /*check also the number of groups*/ \
+        resMax = resMin = dimensionElement(dimMin, dimMax, dimStep, 
dimElementRepeats, *(oid*)BUNtail(oidsIter, BUNfirst(oidsBAT))); \
+        BATloop(oidsBAT, p, q) { \
+            TPE el_cur = dimensionElement(dimMin, dimMax, dimStep, 
dimElementRepeats, *(oid*)BUNtail(oidsIter, p)); \
+            resMax = (el_cur > resMax)?el_cur:resMax; \
+            resMin = (el_cur < resMin)?el_cur:resMin; \
+               } \
+fprintf(stderr, "resMin = %d - resMax = %d\n", (int)resMin, (int)resMax); \
+\
+    /*find the oids that satisfy the min max values*/ \
+    resBAT = BATdimensionSubselect(dimensionBAT, candsBAT, &resMin, &resMax, 
1, 1, 0); \
+    } while(0) 
+
+       switch (ATOMtype(dimensionBAT->ttype)) {
+        case TYPE_bte:
+            mbr(bte);
+            break;
+        case TYPE_sht:
+            mbr(sht);
+            break;
+        case TYPE_int:
+            mbr(int);
+            break;
+        case TYPE_flt:
+            mbr(flt);
+            break;
+        case TYPE_dbl:
+            mbr(dbl);
+            break;
+        case TYPE_lng:
+            mbr(lng);
+            break;
+#ifdef HAVE_HGE
+        case TYPE_hge:
+            mbr(hge);
+            break;
+#endif
+        case TYPE_oid:
+#if SIZEOF_OID == SIZEOF_INT
+            mbr(int);
+#else
+            mbr(lng);
+#endif
+        break;
+        default:
+            fprintf(stderr, "BATmbrsubselect: dimension type not handled\n");
+            return NULL;
+    }
+       return resBAT;
+}
+
 /* theta select
  *
  * Returns a dense-headed BAT with the OID values of b in the tail for
diff --git a/monetdb5/modules/kernel/algebra.c 
b/monetdb5/modules/kernel/algebra.c
--- a/monetdb5/modules/kernel/algebra.c
+++ b/monetdb5/modules/kernel/algebra.c
@@ -356,6 +356,67 @@ ALGsubselect1(bat *res_in, const bat *in
        return ALGsubselect2(res_in, in_id, NULL, low, high, li, hi, anti);
 }
 
+str ALGmbrproject(bat *result, const bat *bid, const bat *sid, const bat* rid) 
{
+       BAT *b, *s, *r, *bn;
+
+       if ((b = BATdescriptor(*bid)) == NULL) {
+               throw(MAL, "algebra.mbrproject", RUNTIME_OBJECT_MISSING);
+       }
+       if ((s = BATdescriptor(*sid)) == NULL) {
+               BBPunfix(b->batCacheid);
+               throw(MAL, "algebra.mbrproject", RUNTIME_OBJECT_MISSING);
+       }
+       if ((r = BATdescriptor(*rid)) == NULL) {
+               BBPunfix(b->batCacheid);
+               BBPunfix(s->batCacheid);
+               throw(MAL, "algebra.mbrproject", RUNTIME_OBJECT_MISSING);
+       }
+       bn = BATmbrproject(b, s, r);
+       BBPunfix(b->batCacheid);
+       BBPunfix(s->batCacheid);
+       BBPunfix(r->batCacheid);
+
+       if (bn == NULL)
+               throw(MAL, "algebra.mbrproject", GDK_EXCEPTION);
+       if (!(bn->batDirty&2)) BATsetaccess(bn, BAT_READ);
+       *result = bn->batCacheid;
+       BBPkeepref(bn->batCacheid);
+       return MAL_SUCCEED;
+
+}
+
+str ALGmbrsubselect(bat *result, const bat *bid, const bat *sid, const bat 
*cid) {
+       BAT *b, *s = NULL, *c = NULL, *bn;
+
+       if ((b = BATdescriptor(*bid)) == NULL) {
+               throw(MAL, "algebra.mbrsubselect", RUNTIME_OBJECT_MISSING);
+       }
+       if (sid && *sid != bat_nil && (s = BATdescriptor(*sid)) == NULL) {
+               BBPunfix(b->batCacheid);
+               throw(MAL, "algebra.mbrsubselect", RUNTIME_OBJECT_MISSING);
+       }
+       if (cid && *cid != bat_nil && (c = BATdescriptor(*cid)) == NULL) {
+               BBPunfix(b->batCacheid);
+               BBPunfix(s->batCacheid);
+               throw(MAL, "algebra.mbrsubselect", RUNTIME_OBJECT_MISSING);
+       }
+       bn = BATmbrsubselect(b, s, c);
+       BBPunfix(b->batCacheid);
+       BBPunfix(s->batCacheid);
+       if (c)
+               BBPunfix(c->batCacheid);
+       if (bn == NULL)
+               throw(MAL, "algebra.mbrsubselect", GDK_EXCEPTION);
+       if (!(bn->batDirty&2)) BATsetaccess(bn, BAT_READ);
+       *result = bn->batCacheid;
+       BBPkeepref(bn->batCacheid);
+       return MAL_SUCCEED;
+}
+
+str ALGmbrsubselect2(bat *result, const bat *bid, const bat *sid) {
+       return ALGmbrsubselect(result, bid, sid, NULL);
+}
+
 #if 0
 str
 ALGdimensionSubselect2(bat *res_id, const bat *in_id, const bat *cand_id, 
const void *low, const void *high, const bit *li, const bit *hi, const bit 
*anti) {
@@ -1229,11 +1290,13 @@ ALGleftfetchjoin(bat *result, const bat 
        return ALGbinary(result, lid, rid, BATproject, "algebra.leftfetchjoin");
 }
 
+#if 0
 str
 ALGnonDimensionLeftfetchjoin(bat *result, const bat *lid, const bat *rid)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to