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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list