Changeset: 99a7b40605af for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=99a7b40605af
Modified Files:
        monetdb5/mal/mal_interpreter.c
        monetdb5/mal/mal_listing.c
        monetdb5/modules/kernel/bat5.c
        monetdb5/modules/kernel/bat5.h
        monetdb5/modules/kernel/bat5.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
Branch: graph0
Log Message:

Yield the new resultset after performing the shortest path operator


diffs (truncated from 418 to 300 lines):

diff --git a/monetdb5/mal/mal_interpreter.c b/monetdb5/mal/mal_interpreter.c
--- a/monetdb5/mal/mal_interpreter.c
+++ b/monetdb5/mal/mal_interpreter.c
@@ -475,6 +475,9 @@ str runMALsequence(Client cntxt, MalBlkP
        if (stk == NULL)
                throw(MAL, "mal.interpreter", MAL_STACK_FAIL);
 
+
+       printf("[DEBUG] [Interpreter] MAL Plan: %s\n", mal2str(mb, 0, 
mb->stop));
+
        /* prepare extended backup and garbage structures */
        if (startpc+1 == stoppc) {
                pci = getInstrPtr(mb, startpc);
diff --git a/monetdb5/mal/mal_listing.c b/monetdb5/mal/mal_listing.c
--- a/monetdb5/mal/mal_listing.c
+++ b/monetdb5/mal/mal_listing.c
@@ -289,12 +289,12 @@ instruction2str(MalBlkPtr mb, MalStkPtr 
        case CMDcall:
        case ASSIGNsymbol :
                // is any variable explicit or used
-               for (i = 0; i < p->retc; i++)
-                       if ( !isTmpVar(mb,getArg(p,i)) || isVarUsed(mb, 
getArg(p, i)) || isVarUDFtype(mb,getArg(p,i)))
-                               break;
-
-               if (i == p->retc)
-                       break;
+//             for (i = 0; i < p->retc; i++)
+//                     if ( !isTmpVar(mb,getArg(p,i)) || isVarUsed(mb, 
getArg(p, i)) || isVarUDFtype(mb,getArg(p,i)))
+//                             break;
+//
+//             if (i == p->retc)
+//                     break;
 
                /* display multi-assignment list */
                if (p->retc > 1)
diff --git a/monetdb5/modules/kernel/bat5.c b/monetdb5/modules/kernel/bat5.c
--- a/monetdb5/modules/kernel/bat5.c
+++ b/monetdb5/modules/kernel/bat5.c
@@ -1031,6 +1031,22 @@ BKCgetSequenceBase(oid *r, const bat *bi
        return MAL_SUCCEED;
 }
 
+str
+BKCresetSequenceBase(bat *ret, const bat *bid)
+{
+       BAT* b;
+
+       if ((b = BATdescriptor(*bid)) == NULL) {
+               throw(MAL, "bat.resetSequenceBase", RUNTIME_OBJECT_MISSING);
+       }
+
+       b->hseqbase = 0;
+       *ret = b->batCacheid;
+       BBPkeepref(b->batCacheid);
+
+       return MAL_SUCCEED;
+}
+
 /*
  * Shrinking a void-headed BAT using a list of oids to ignore.
  */
diff --git a/monetdb5/modules/kernel/bat5.h b/monetdb5/modules/kernel/bat5.h
--- a/monetdb5/modules/kernel/bat5.h
+++ b/monetdb5/modules/kernel/bat5.h
@@ -52,6 +52,7 @@ mal_export str BKCsave2(void *r, const b
 mal_export str BKCsetHash(bit *ret, const bat *bid);
 mal_export str BKCsetImprints(bit *ret, const bat *bid);
 mal_export str BKCgetSequenceBase(oid *r, const bat *bid);
+mal_export str BKCresetSequenceBase(bat *ret, const bat *bid);
 mal_export str BKCshrinkBAT(bat *ret, const bat *bid, const bat *did);
 mal_export str BKCreuseBAT(bat *ret, const bat *bid, const bat *did);
 mal_export str BKCshrinkBATmap(bat *ret, const bat *bid, const bat *did);
diff --git a/monetdb5/modules/kernel/bat5.mal b/monetdb5/modules/kernel/bat5.mal
--- a/monetdb5/modules/kernel/bat5.mal
+++ b/monetdb5/modules/kernel/bat5.mal
@@ -115,6 +115,10 @@ command getSequenceBase( b:bat[:any_1]):
 address BKCgetSequenceBase
 comment "Get the sequence base for the void column of a BAT.";
 
+command resetSequenceBase( b:bat[:any_1]) :bat[:any_1]
+address BKCresetSequenceBase
+comment "Reset the base index for the input BAT to position zero.";
+
 command isSorted(b:bat[:any_1]) :bit 
 address BKCisSorted
 comment "Returns true if BAT values are ordered.";
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
@@ -2959,7 +2959,8 @@ insert_check_ukey(mvc *sql, list *insert
                                stmt *cs = list_fetch(inserts, c->c->colnr); 
 
                                if (orderby_grp)
-                                       orderby = stmt_reorder(sql->sa, 
cs->op1, 1, orderby_ids, orderby_grp);
+                                       orderby = stmt_reorder(sql->sa,         
// strong suspects these are the output cols of the operator
+cs->op1, 1, orderby_ids, orderby_grp);
                                else
                                        orderby = stmt_order(sql->sa, cs->op1, 
1);
                                orderby_ids = stmt_result(sql->sa, orderby, 1);
@@ -4558,10 +4559,10 @@ rel2bin_spfw(mvc *sql, sql_rel *rel, lis
        stmt *c = NULL, *g = NULL, *groups = NULL, *smpl = NULL;
        stmt *D = NULL, *vrtx = NULL;
        list *l = NULL;
-       stmt *filter = NULL;
-       stmt *result = NULL;
+       stmt *split = NULL;
        stmt *e_from = NULL, *e_to = NULL, *q_from = NULL, *q_to = NULL;
        stmt *mk_perm = NULL;
+       stmt *result = NULL;
        node *n = NULL; // generic var to iterate through a list
 
        // materialize the input relations
@@ -4591,8 +4592,9 @@ rel2bin_spfw(mvc *sql, sql_rel *rel, lis
        g = stmt_group(sql->sa, c, NULL, NULL, NULL);
        groups = stmt_result(sql->sa, g, 0);
        smpl = stmt_result(sql->sa, g, 1);
-       e_from = stmt_mkpartition(sql->sa, groups, 0, 2);
-       e_to = stmt_mkpartition(sql->sa, groups, 1, 2);
+       split = stmt_slices(sql->sa, groups, 2);
+       e_from = stmt_result(sql->sa, split, 0);
+       e_to = stmt_result(sql->sa, split, 1);
        // mkgraph (naive approach)
        e_from = stmt_order(sql->sa, e_from, /* direction = */ 0);
        mk_perm = stmt_result(sql->sa, e_from, 1);
@@ -4613,19 +4615,19 @@ rel2bin_spfw(mvc *sql, sql_rel *rel, lis
        q_from = stmt_result(sql->sa, vrtx, 0);
        q_to = stmt_result(sql->sa, vrtx, 1);
 
-       // finally execute the shortest path operator
+       // execute the shortest path operator
        spfw = stmt_spfw(sql->sa, q_from, q_to, graph);
 
-       // apply the selection filter
-       filter = stmt_result(sql->sa, spfw, 0);
+       // almost done, create the new resultset
        l = sa_list(sql->sa);
-       for(node *n = left->op4.lval->h; n; n = n->next){
-               stmt *col = n->data;
-               if(col->nrcols == 0)
-                       col = stmt_const(sql->sa, filter, col);
-               else
-                       col = stmt_project(sql->sa, filter, col);
-               list_append(l, col);
+       for( n = left->op4.lval->h; n; n = n->next ) {
+               stmt *c = n->data;
+               const char *rnme = table_name(sql->sa, c);
+               const char *nme = column_name(sql->sa, c);
+               stmt *s = stmt_project(sql->sa, spfw, column(sql->sa, c));
+
+               s = stmt_alias(sql->sa, s, rnme, nme);
+               list_append(l, s);
        }
        result = stmt_list(sql->sa, l);
 
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
@@ -2781,7 +2781,7 @@ static int
                        if(ref_op < 0)
                                return -1;
 
-                       q = newStmt(mb, batRef, copyRef);
+                       q = newStmt(mb, algebraRef, copyRef);
                        q = pushArgument(mb, q, ref_op);
                        ref_cpy = getDestVar(q);
 
@@ -2806,6 +2806,7 @@ static int
                        InstrPtr join = NULL, cmp = NULL, cmp_not = NULL;
                        int /*jl1 = -1,*/ jl2 = -1, /*jl3 = -1,*/ jr1 = -1, jr2 
= -1, jr3 = -1;
                        InstrPtr qfrom_oid = NULL, qto_oid = NULL;
+                       int qtemp = -1;
 
                        // process the operands
                        ref_left = _dumpstmt(sql, mb, s->op1);
@@ -2845,7 +2846,10 @@ static int
                        join = pushArgument(mb, join, getDestVar(cnt1));
                        jl2 = getDestVar(join);
 
-//                     qtemp = newTmpVariable(mb, TYPE_bat); // qfrom
+                       qfrom_oid = newAssignment(mb);
+                       qfrom_oid = pushNil(mb, qfrom_oid, TYPE_bat);
+                       qtemp = getDestVar(qfrom_oid);
+
                        qto_oid = newAssignment(mb); // qto
                        pushArgument(mb, qto_oid, jr2);
 
@@ -2875,10 +2879,11 @@ static int
 //                     jl3 = getDestVar(join);
 
                        qfrom_oid = newAssignment(mb);
-                       pushArgument(mb, qfrom_oid, jr3);
+                       getArg(qfrom_oid, 0) = qtemp; // dest
+                       qfrom_oid = pushArgument(mb, qfrom_oid, jr3);
 
                        stmt_endif = newAssignment(mb);
-                       getArg(stmt_endif, 0) = getDestVar(cmp);
+                       getArg(stmt_endif, 0) = getDestVar(stmt_if);
                        stmt_endif->argc = stmt_endif->retc = 1;
                        stmt_endif->barrier = EXITsymbol;
 
@@ -2890,15 +2895,16 @@ static int
                        stmt_else = pushArgument(mb, stmt_else, 
getDestVar(cmp_not));
 
                        qfrom_oid = newAssignment(mb);
+                       getArg(qfrom_oid, 0) = qtemp; // dest
                        pushArgument(mb, qfrom_oid, jr1);
 
                        stmt_endif = newAssignment(mb);
-                       getArg(stmt_endif, 0) = getDestVar(cmp_not);
+                       getArg(stmt_endif, 0) = getDestVar(stmt_else);
                        stmt_endif->argc = stmt_endif->retc = 1;
                        stmt_endif->barrier = EXITsymbol;
 
                        // abi convention for st_result
-                       s->nr = getDestVar(qfrom_oid);
+                       s->nr = qtemp; // = qfrom_oid
                        renameVariable(mb, getDestVar(qto_oid), "r1_%d", s->nr);
                } break;
                case st_mkpartition: {
@@ -2929,41 +2935,103 @@ static int
                        q = pushArgument(mb, q, ref_stmt);
                        s->nr = getDestVar(q);
                } break;
+               case st_slices: {
+                       int ref_stmt = -1;
+                       int num_slices = s->flag;
+                       InstrPtr hseqbase_oid = NULL;
+                       InstrPtr hseqbase_lng = NULL;
+                       InstrPtr count = NULL;
+                       InstrPtr interval = NULL;
+                       InstrPtr step = NULL;
+
+                       if(num_slices < 1)
+                               return -1;
+
+                       ref_stmt = _dumpstmt(sql, mb, s->op1);
+                       if(ref_stmt < 0)
+                               return -1;
+
+                       hseqbase_oid = newStmt(mb, "bat", "getSequenceBase");
+                       hseqbase_oid = pushArgument(mb, hseqbase_oid, ref_stmt);
+
+                       hseqbase_lng = newStmt(mb, "calc", "lng");
+                       hseqbase_lng = pushArgument(mb, hseqbase_lng, 
getDestVar(hseqbase_oid));
+
+                       count = newStmt(mb, "aggr", "count");
+                       count = pushArgument(mb, count, ref_stmt);
+
+                       interval = newStmt(mb, "calc", "-");
+                       interval = pushArgument(mb, interval, 
getDestVar(count));
+                       interval = pushArgument(mb, interval, 
getDestVar(hseqbase_lng));
+
+                       // assume that interval % num_slices == 0
+                       step = newStmt(mb, "calc", "/");
+                       step = pushArgument(mb, step, getDestVar(interval));
+                       step = pushLng(mb, step, (lng) num_slices);
+
+                       for(int i = 0; i < num_slices; i++){
+                               InstrPtr start = NULL, end_plus_1 = NULL, end = 
NULL,
+                                               slice_indexed = NULL, 
slice_final = NULL;
+
+                               start = newStmt(mb, "calc", "*");
+                               start = pushArgument(mb, start, 
getDestVar(step));
+                               start = pushLng(mb, start, i);
+
+                               end_plus_1 = newStmt(mb, "calc", "+");
+                               end_plus_1 = pushArgument(mb, end_plus_1, 
getDestVar(start));
+                               end_plus_1 = pushArgument(mb, end_plus_1, 
getDestVar(step));
+
+                               end = newStmt(mb, "calc", "-");
+                               end = pushArgument(mb, end, 
getDestVar(end_plus_1));
+                               end = pushLng(mb, end, 1);
+
+                               slice_indexed = newStmt(mb, "algebra", "slice");
+                               slice_indexed = pushArgument(mb, slice_indexed, 
ref_stmt);
+                               slice_indexed = pushArgument(mb, slice_indexed, 
getDestVar(start));
+                               slice_indexed = pushArgument(mb, slice_indexed, 
getDestVar(end));
+
+                               // reset hseqbase = 0
+                               slice_final = newStmt(mb, "bat", 
"resetSequenceBase");
+                               slice_final = pushArgument(mb, slice_final, 
getDestVar(slice_indexed));
+
+                               // abi convention
+                               if(i==0){
+                                       s->nr = getDestVar(slice_final);
+                               } else {
+                                       
snprintf(mb->var[getDestVar(slice_final)]->id, IDLENGTH, "r%d_%d", i, s->nr);
+                               }
+                       }
+               } break;
                case st_spfw: {
-                       int left = -1, right = -1, qfrom = -1, qto = -1;
+                       int efrom = -1, eto = -1, qfrom = -1, qto = -1;
                        node* n = NULL;
 
-                       left = _dumpstmt(sql, mb, s->op1);
-                       if(left < 0)
+                       qfrom = _dumpstmt(sql, mb, s->op1);
+                       if(qfrom < 0)
                                return -1;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to