Changeset: 3eeee59c9a4d for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3eeee59c9a4d
Modified Files:
monetdb5/modules/kernel/arrays.mal
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql_gencode.c
Branch: arrays
Log Message:
when having selections in non-dimensional and dimensional colums
the projection of the cells is after evaluation the subselection
on the non-dimensional column
diffs (273 lines):
diff --git a/monetdb5/modules/kernel/arrays.mal
b/monetdb5/modules/kernel/arrays.mal
--- a/monetdb5/modules/kernel/arrays.mal
+++ b/monetdb5/modules/kernel/arrays.mal
@@ -9,11 +9,17 @@ address ALGmbrsubselect2;
command algebra.mbrproject(b:bat[:oid,:any], s:bat[:oid, :oid], r:bat[:oid,
:oid]) :bat[:oid,:any]
address ALGmbrproject;
+#subselection in dimensions
command algebra.subselect(dims:ptr, dim:ptr, low:any, high:any, li:bit,
hi:bit, anti:bit) (:ptr, :bat[:oid,:oid])
address ALGdimensionSubselect1;
command algebra.subselect(dims:ptr, dim:ptr, candDims:ptr,
candBat:bat[:oid,:oid], low:any, high:any, li:bit, hi:bit, anti:bit) (:ptr,
:bat[:oid, :oid])
address ALGdimensionSubselect2;
+#subselection in non-dimenional columns of arrays after a subselection in
dimensions has been performed
+command algebra.subselect(:bat[:oid, :any], candDims:ptr,
candBat:bat[:oid,:oid], low:any, high:any, li:bit, hi:bit, anti:bit) :bat[:oid,
:any]
+address ALGsubselect3;
+
+
command algebra.thetasubselect(dims:ptr, dim:ptr, val:any_1, op:str) (:ptr,
:bat[:oid,:oid])
address ALGdimensionThetasubselect1;
command algebra.thetasubselect(dims:ptr, dim:ptr, candDims:ptr,
candBat:bat[:oid,:oid], val:any_1, op:str) (:ptr, :bat[:oid,:oid])
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -2555,8 +2555,10 @@ static stmt* addCells(mvc *sql, stmt *s)
//find where the selections over the dimensions start and put an
st_cells
if((s->type == st_uselect || s->type == st_uselect2) && s->op1->type ==
st_dimension) {
s = stmt_cells(sql->sa, s);
- } else if(s->op3)
- s->op3 = addCells(sql, s->op3);
+ }
+ //Uncomment in case the cells projection is needed before performing
any other selection
+ //else if(s->op3)
+ // s->op3 = addCells(sql, s->op3);
return s;
}
/*
diff --git a/sql/backends/monet5/sql_gencode.c
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -765,6 +765,7 @@ pushSchema(MalBlkPtr mb, InstrPtr q, sql
return pushNil(mb, q, TYPE_str);
}
+#if 0
static int find_uselect(stmt *s){
if(!s)
return -1;
@@ -772,6 +773,7 @@ static int find_uselect(stmt *s){
return s->nr;
return find_uselect(s->op3);
}
+#endif
/*
* @-
@@ -1218,7 +1220,9 @@ static int
renameVariable(mb, getArg(q, 1), "r1_%d", s->nr);
renameVariable(mb, getArg(q, 2), "r2_%d", s->nr);
} break;
- case st_mbrselect: {
+ case st_mbrselect:
+#if 0
+ }
int l, r=-1, sub=-1;
if ((l = _dumpstmt(sql, mb, s->op1)) < 0)
return -1;
@@ -1297,11 +1301,16 @@ static int
}
}
s->nr = getDestVar(q);
- } break;
+ }
+#endif
+ break;
case st_uselect:{
bit need_not = FALSE;
int l, r, sub, anti;
node *n;
+
+ char nme[SMALLBUFSIZ];
+ int uval = -1;
if ((l = _dumpstmt(sql, mb, s->op1)) < 0)
return -1;
@@ -1432,34 +1441,30 @@ static int
case cmp_equal:
case cmp_notequal: {
q = newStmt2(mb, algebraRef,
cmd);
- if(s->op1->type ==
st_dimension) {
- char nme[SMALLBUFSIZ];
- int uval = -1;
-
- snprintf(nme, SMALLBUFSIZ, "Y_%d", l);
- uval = findVariable(mb, nme);
- assert(uval >= 0);
+
+ if(s->op1->type == st_dimension) { //selection over a
dimension, two outputs
+ snprintf(nme,
SMALLBUFSIZ, "Y_%d", l);
+ uval = findVariable(mb, nme);
+
+ assert(uval >=0);
setVarType(mb,
getArg(q, 0), TYPE_ptr);
setVarUDFtype(mb,
getArg(q, 0));
q = pushReturn(mb, q,
newTmpVariable(mb, newBatType(TYPE_oid, TYPE_oid)));
q = pushArgument(mb, q,
l); //all the dimensions
q = pushArgument(mb, q,
uval); //the current dimension
-
- if(sub > 0) {
//candidates
- snprintf(nme,
SMALLBUFSIZ, "Y_%d", sub);
- uval = findVariable(mb, nme);
- assert(uval >= 0);
-
- q =
pushArgument(mb, q, sub);
+ } else
+ q = pushArgument(mb, q,
l);
+
+ if(sub > 0) { //candidates
+ q = pushArgument(mb, q,
sub);
+
+ //check whether two
candidates
+ snprintf(nme,
SMALLBUFSIZ, "Y_%d", sub);
+ uval = findVariable(mb, nme);
+ if(uval >= 0)
q =
pushArgument(mb, q, uval);
- }
- } else {
- q = pushArgument(mb, q,
l);
-
- if (sub > 0)
- q =
pushArgument(mb, q, sub);
- }
+ }
q = pushArgument(mb, q, r);
q = pushArgument(mb, q, r);
q = pushBit(mb, q, TRUE);
@@ -1470,32 +1475,28 @@ static int
case cmp_gt:
case cmp_gte: {
q = newStmt2(mb, algebraRef,
cmd);
- if(s->op1->type ==
st_dimension) {
- char nme[SMALLBUFSIZ];
- int uval = -1;
-
- snprintf(nme, SMALLBUFSIZ, "Y_%d", l);
- uval = findVariable(mb, nme);
- assert(uval >= 0);
+ if(s->op1->type ==
st_dimension) { //selection over a dimension, two outputs
+ snprintf(nme,
SMALLBUFSIZ, "Y_%d", l);
+ uval = findVariable(mb, nme);
+
+ assert(uval >=0);
setVarType(mb,
getArg(q, 0), TYPE_ptr);
setVarUDFtype(mb,
getArg(q, 0));
q = pushReturn(mb, q,
newTmpVariable(mb, newBatType(TYPE_oid, TYPE_oid)));
q = pushArgument(mb, q,
l); //all the dimensions
q = pushArgument(mb, q,
uval); //the current dimension
-
- if(sub > 0) {
//candidates
- snprintf(nme,
SMALLBUFSIZ, "Y_%d", sub);
- uval = findVariable(mb, nme);
- assert(uval >= 0);
-
- q =
pushArgument(mb, q, sub);
+ } else
+ q = pushArgument(mb, q,
l);
+
+ if(sub > 0) { //candidates
+ q = pushArgument(mb, q,
sub);
+
+ //check whether two
candidates
+ snprintf(nme,
SMALLBUFSIZ, "Y_%d", sub);
+ uval = findVariable(mb, nme);
+ if(uval >= 0)
q =
pushArgument(mb, q, uval);
- }
- } else {
- q = pushArgument(mb, q,
l);
- if (sub > 0)
- q =
pushArgument(mb, q, sub);
}
q = pushArgument(mb, q, r);
} break;
@@ -1549,6 +1550,9 @@ static int
char *cmd = (s->type == st_uselect2) ? subselectRef :
subrangejoinRef;
int sub = -1;
+ char nme[SMALLBUFSIZ];
+ int uval = -1;
+
if (l < 0)
return -1;
if (s->op4.stval &&
@@ -1595,9 +1599,7 @@ static int
q = newStmt1(mb, algebraRef, "subselect");
if(s->op1->type == st_dimension) {
- char nme[SMALLBUFSIZ];
- int uval = -1;
-
+
snprintf(nme, SMALLBUFSIZ, "Y_%d", l);
uval = findVariable(mb, nme);
assert(uval >= 0);
@@ -1607,19 +1609,15 @@ static int
q = pushReturn(mb, q,
newTmpVariable(mb, newBatType(TYPE_oid, TYPE_oid)));
q = pushArgument(mb, q, k); //all the
dimensions
q = pushArgument(mb, q, uval); //the
current dimension
-
- if(sub > 0) { //candidates
- snprintf(nme, SMALLBUFSIZ,
"Y_%d", sub);
- uval = findVariable(mb, nme);
- assert(uval >= 0);
-
- q = pushArgument(mb, q, sub);
+ } else
+ q = pushArgument(mb, q, k);
+
+ if(sub > 0) { //candidates
+ q = pushArgument(mb, q, sub);
+ snprintf(nme, SMALLBUFSIZ, "Y_%d", sub);
+ uval = findVariable(mb, nme);
+ if(uval >= 0)
q = pushArgument(mb, q, uval);
- }
- } else {
- q = pushArgument(mb, q, k);
- if (sub > 0)
- q = pushArgument(mb, q, sub);
}
q = pushBit(mb, q, TRUE);
q = pushBit(mb, q, TRUE);
@@ -1663,9 +1661,6 @@ static int
if (s->type == st_join2)
q = pushReturn(mb, q, newTmpVariable(mb,
TYPE_any));
else if(s->type == st_uselect2 && s->op1->type ==
st_dimension) {
- char nme[SMALLBUFSIZ];
- int uval = -1;
-
snprintf(nme, SMALLBUFSIZ, "Y_%d", l);
uval = findVariable(mb, nme);
assert(uval >= 0);
@@ -1675,19 +1670,16 @@ static int
q = pushReturn(mb, q, newTmpVariable(mb,
newBatType(TYPE_oid, TYPE_oid)));
q = pushArgument(mb, q, l); //all the dimensions
q = pushArgument(mb, q, uval); //the current
dimension
-
- if(sub > 0) { //candidates
- snprintf(nme, SMALLBUFSIZ, "Y_%d", sub);
- uval = findVariable(mb, nme);
- assert(uval >= 0);
-
- q = pushArgument(mb, q, sub);
+ } else
+ q = pushArgument(mb, q, l);
+
+ if(sub > 0) { //candidates
+ q = pushArgument(mb, q, sub);
+
+ snprintf(nme, SMALLBUFSIZ, "Y_%d", sub);
+ uval = findVariable(mb, nme);
+ if(uval >= 0)
q = pushArgument(mb, q, uval);
- }
- } else {
- q = pushArgument(mb, q, l);
- if (sub > 0) /* only for uselect2 */
- q = pushArgument(mb, q, sub);
}
if (rs) {
q = pushArgument(mb, q, rs);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list