Changeset: e717e65382fb for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e717e65382fb
Modified Files:
monetdb5/mal/mal_interpreter.c
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:
Forward the permutation map to the graph operator
diffs (223 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,8 +475,11 @@ 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));
+ do { // DEBUG ONLY
+ char * value = getenv("MALPLAN");
+ if(value != NULL && strcmp(value, "1") == 0)
+ printf("[DEBUG] [Interpreter] MAL Plan: %s\n",
mal2str(mb, 0, mb->stop));
+ } while(0);
/* prepare extended backup and garbage structures */
if (startpc+1 == stoppc) {
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
@@ -4554,13 +4554,14 @@ rel2bin_ddl(mvc *sql, sql_rel *rel, list
static stmt *
rel2bin_spfw(mvc *sql, sql_rel *rel, list *refs)
{
- stmt *edges = NULL, *spfw = NULL, *graph = NULL;
+ stmt *edges = NULL, *spfw = NULL, *graph = NULL, *query = NULL;
stmt *left = NULL, *right = NULL;
stmt *c = NULL, *g = NULL, *groups = NULL, *smpl = NULL;
stmt *D = NULL, *vrtx = NULL;
list *l = NULL;
stmt *split = NULL;
- stmt *e_from = NULL, *e_to = NULL, *q_from = NULL, *q_to = NULL;
+ stmt *e_from = NULL, *e_to = NULL;
+ stmt *q_from = NULL, *q_to = NULL;
stmt *mk_perm = NULL;
stmt *result = NULL;
node *n = NULL; // generic var to iterate through a list
@@ -4596,7 +4597,7 @@ rel2bin_spfw(mvc *sql, sql_rel *rel, lis
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);
+ e_from = stmt_order(sql->sa, e_from, /* direction (0 = DESC, 1 = ASC) =
*/ 1);
mk_perm = stmt_result(sql->sa, e_from, 1);
e_from = stmt_prefixsum(sql->sa, e_from);
// FIXME e_weights = stmt_project(sql->sa, mk_perm, e_weights) etc..
@@ -4612,11 +4613,13 @@ rel2bin_spfw(mvc *sql, sql_rel *rel, lis
// TODO I was not able to figure out how to perform a join with a
candidate list at this layer
// postpone the translation at the mal codegen ftb
vrtx = stmt_exp2vrtx(sql->sa, q_from, q_to, D);
- q_from = stmt_result(sql->sa, vrtx, 0);
- q_to = stmt_result(sql->sa, vrtx, 1);
+ l = sa_list(sql->sa);
+ for(int i = 0; i < 3; i++)
+ list_append(l, stmt_result(sql->sa, vrtx, i));
+ query = stmt_list(sql->sa, l);
// execute the shortest path operator
- spfw = stmt_spfw(sql->sa, q_from, q_to, graph);
+ spfw = stmt_spfw(sql->sa, query, graph);
// almost done, create the new resultset
l = sa_list(sql->sa);
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
@@ -2800,11 +2800,12 @@ static int
s->nr = ref_cpy;
} break;
case st_exp2vrtx: {
+ // this stmt became a mess
int ref_left = -1, ref_right = -1, ref_domain = 1;
InstrPtr cnt1 = NULL, cnt2 = NULL;
InstrPtr stmt_if = NULL, stmt_else = NULL, stmt_endif =
NULL;
InstrPtr join = NULL, cmp = NULL, cmp_not = NULL;
- int /*jl1 = -1,*/ jl2 = -1, /*jl3 = -1,*/ jr1 = -1, jr2
= -1, jr3 = -1;
+ int jl1 = -1, jl2 = -1, /*jl3 = -1,*/ jr1 = -1, jr2 =
-1, jr3 = -1;
InstrPtr qfrom_oid = NULL, qto_oid = NULL;
int qtemp = -1;
@@ -2832,7 +2833,7 @@ static int
join = pushNil(mb, join, TYPE_bat);
join = pushBit(mb, join, FALSE);
join = pushArgument(mb, join, getDestVar(cnt1));
-// jl1 = getDestVar(join);
+ jl1 = getDestVar(join);
// second join
jr2 = newTmpVariable(mb, TYPE_any);
@@ -2840,7 +2841,7 @@ static int
join = pushReturn(mb, join, jr2);
join = pushArgument(mb, join, ref_right);
join = pushArgument(mb, join, ref_domain);
- join = pushArgument(mb, join, jr1);
+ join = pushArgument(mb, join, jl1);
join = pushNil(mb, join, TYPE_bat);
join = pushBit(mb, join, FALSE);
join = pushArgument(mb, join, getDestVar(cnt1));
@@ -2876,7 +2877,7 @@ static int
join = pushNil(mb, join, TYPE_bat);
join = pushBit(mb, join, FALSE);
join = pushArgument(mb, join, getDestVar(cnt2));
-// jl3 = getDestVar(join);
+// jl3 = getDestVar(join); // jl3 is the same of jl2
qfrom_oid = newAssignment(mb);
getArg(qfrom_oid, 0) = qtemp; // dest
@@ -2904,8 +2905,9 @@ static int
stmt_endif->barrier = EXITsymbol;
// abi convention for st_result
- s->nr = qtemp; // = qfrom_oid
- renameVariable(mb, getDestVar(qto_oid), "r1_%d", s->nr);
+ s->nr = jl2;
+ renameVariable(mb, getDestVar(qfrom_oid), "r1_%d",
s->nr);
+ renameVariable(mb, getDestVar(qto_oid), "r2_%d", s->nr);
} break;
case st_mkpartition: {
int ref_stmt = -1;
@@ -3003,35 +3005,40 @@ static int
}
} break;
case st_spfw: {
- int efrom = -1, eto = -1, qfrom = -1, qto = -1;
+ const /*size_t*/ int query_sz = 3; // num operands for
the query
+ const /*size_t*/ int graph_sz = 2; // num operands for
the graph
node* n = NULL;
- qfrom = _dumpstmt(sql, mb, s->op1);
- if(qfrom < 0)
+ // generate the query
+ if(_dumpstmt(sql, mb, s->op1) < 0)
return -1;
- qto = _dumpstmt(sql, mb, s->op2);
- if(qto < 0)
+ // generate the graph
+ if(_dumpstmt(sql, mb, s->op2) < 0)
return -1;
- if(_dumpstmt(sql, mb, s->op3) < 0)
- return -1;
-
- n = s->op3->op4.lval->h;
- efrom = ((stmt *) n->data)->nr;
- n = n->next;
- eto = ((stmt *) n->data)->nr;
- // TODO weights
-
// command spfw(qf:bat[:oid], qt:bat[:oid],
V:bat[:oid], E:bat[:oid]) --> :bat[:oid]
q = newStmt(mb, graphRef, "spfw");
- q = pushArgument(mb, q, qfrom);
- q = pushArgument(mb, q, qto);
- q = pushArgument(mb, q, efrom);
- q = pushArgument(mb, q, eto);
+
+ // set the query params
+ assert(s->op1->type == st_list && s->op1->op4.lval->cnt
== query_sz);
+ n = s->op1->op4.lval->h;
+ for(int i = 0; i < query_sz; i++){
+ q = pushArgument(mb, q, ((stmt*) n->data)->nr);
+ n = n->next;
+ }
+
+ // set the graph params
+ assert(s->op2->type == st_list && s->op2->op4.lval->cnt
== graph_sz);
+ n = s->op2->op4.lval->h;
+ for(int i = 0; i < graph_sz; i++){
+ q = pushArgument(mb, q, ((stmt*) n->data)->nr);
+ n = n->next;
+ }
// abi convention
s->nr = getDestVar(q); // filter
+ #undef sz
} break;
}
if (mb->errors)
diff --git a/sql/backends/monet5/sql_statement.c
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -1625,8 +1625,7 @@ stmt_exp2vrtx(sql_allocator *sa, stmt *f
s->op1 = from;
s->op2 = to;
s->op3 = domain;
- s->nrcols = from->nrcols + to->nrcols;
- assert(s->nrcols == from->nrcols *2 && "from & to are supposed to have
the same number of columns");
+ s->nrcols = 3;
return s;
}
@@ -1667,15 +1666,14 @@ stmt_prefixsum(sql_allocator *sa, stmt*
stmt *
-stmt_spfw(sql_allocator *sa, stmt* qfrom, stmt *qto, stmt* graph)
+stmt_spfw(sql_allocator *sa, stmt* query, stmt* graph)
{
stmt *s = stmt_create(sa, st_spfw);
- s->op1 = qfrom;
- s->op2 = qto;
- s->op3 = graph;
+ s->op1 = query;
+ s->op2 = graph;
// strong suspects these are the output cols of the operator
- s->nrcols = 2;
+ s->nrcols = 1;
return s;
}
diff --git a/sql/backends/monet5/sql_statement.h
b/sql/backends/monet5/sql_statement.h
--- a/sql/backends/monet5/sql_statement.h
+++ b/sql/backends/monet5/sql_statement.h
@@ -253,7 +253,7 @@ extern stmt *stmt_exp2vrtx(sql_allocator
extern stmt *stmt_mkpartition(sql_allocator *sa, stmt* st, int partno, int
num_partitions);
extern stmt *stmt_prefixsum(sql_allocator *sa, stmt* op);
extern stmt *stmt_slices(sql_allocator *sa, stmt* op, int num);
-extern stmt *stmt_spfw(sql_allocator *sa, stmt* qfrom, stmt *qto, stmt* graph);
+extern stmt *stmt_spfw(sql_allocator *sa, stmt* query, stmt* graph);
extern sql_subtype *tail_type(stmt *st);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list