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