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

Reply via email to