Changeset: 9f8247663622 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9f8247663622
Modified Files:
monetdb5/optimizer/opt_prelude.c
monetdb5/optimizer/opt_prelude.h
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:
MAL codegen (naive approach)
Not tested yet
diffs (truncated from 512 to 300 lines):
diff --git a/monetdb5/optimizer/opt_prelude.c b/monetdb5/optimizer/opt_prelude.c
--- a/monetdb5/optimizer/opt_prelude.c
+++ b/monetdb5/optimizer/opt_prelude.c
@@ -95,7 +95,6 @@ str getTraceRef;
str generatorRef;
str grabRef;
str graphRef;
-str graph_makeRef;
str groupRef;
str subgroupRef;
str subgroupdoneRef;
@@ -329,7 +328,6 @@ void optimizerInit(void)
generatorRef = putName("generator");
grabRef = putName("grab");
graphRef = putName("graph");
- graph_makeRef = putName("gmake");
groupRef = putName("group");
subgroupRef = putName("subgroup");
subgroupdoneRef= putName("subgroupdone");
diff --git a/monetdb5/optimizer/opt_prelude.h b/monetdb5/optimizer/opt_prelude.h
--- a/monetdb5/optimizer/opt_prelude.h
+++ b/monetdb5/optimizer/opt_prelude.h
@@ -92,6 +92,7 @@ mal_export str getRef;
mal_export str getTraceRef;
mal_export str generatorRef;
mal_export str grabRef;
+mal_export str graphRef;
mal_export str groupRef;
mal_export str subgroupRef;
mal_export str subgroupdoneRef;
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,34 +4554,36 @@ static stmt *
rel2bin_spfw(mvc *sql, sql_rel *rel, list *refs)
{
stmt *edges = NULL, *spfw = NULL, *graph = NULL;
- stmt *left = NULL, right = NULL;
+ stmt *left = NULL, *right = NULL;
stmt *c = NULL, *g = NULL, *groups = NULL, *smpl = NULL;
- stmt *D = NULL;
- stmt *p0 = NULL, *p1 = NULL;
+ stmt *D = NULL, *vrtx = NULL;
list *l = NULL;
+ stmt *filter = NULL;
+ stmt *result = NULL;
stmt *e_from = NULL, *e_to = NULL, *q_from = NULL, *q_to = NULL;
- node *n = NULL;
+ stmt *mk_perm = NULL;
+ node *n = NULL; // generic var to iterate through a list
// materialize the input relations
- left = subrel_bin(sql->sa, rel->l, refs);
+ left = subrel_bin(sql, rel->l, refs);
if(!left) return NULL;
(void) right;
- edges = subrel_bin(sql->sa, rel->r, refs);
+ edges = subrel_bin(sql, rel->r, refs);
if(!edges) return NULL;
// refer to the columns
- assert(rel->exps->cnt == 4 && "Expected four columns as input (ftb)");
// TODO weights missing
+ assert(rel->exps->cnt == 4 && "Expected four columns as input (ftb)");
// TODO weights are missing
n = rel->exps->h;
- q_from = exp_bin(sql->sa, n->data, left, NULL, NULL, NULL, NULL, NULL);
+ q_from = exp_bin(sql, n->data, left, NULL, NULL, NULL, NULL, NULL);
n = n->next;
- q_to = exp_bin(sql->sa, n->data, left, NULL, NULL, NULL, NULL, NULL);
+ q_to = exp_bin(sql, n->data, left, NULL, NULL, NULL, NULL, NULL);
n = n->next;
- e_from = exp_bin(sql->sa, n->data, edges, NULL, NULL, NULL, NULL, NULL);
+ e_from = exp_bin(sql, n->data, edges, NULL, NULL, NULL, NULL, NULL);
n = n->next;
- e_to = exp_bin(sql->sa, n->data, edges, NULL, NULL, NULL, NULL, NULL);
+ e_to = exp_bin(sql, n->data, edges, NULL, NULL, NULL, NULL, NULL);
// create the graph
- // this is, like, super fun!
+ // this is, like, super fun....
l = sa_list(sql->sa);
list_append(l, e_from);
list_append(l, e_to);
@@ -4591,43 +4593,45 @@ rel2bin_spfw(mvc *sql, sql_rel *rel, lis
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);
- graph = stmt_mkgraph(sql->sa, e_from, e_to);
+ // mkgraph (naive approach)
+ e_from = stmt_order(sql->sa, e_from, /* direction = */ 0);
+ 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..
+ e_to = stmt_project(sql->sa, mk_perm, e_to);
+ l = sa_list(sql->sa);
+ list_append(l, e_from);
+ list_append(l, e_to);
+ // FIXME list_append(l, e_weights);
+ graph = stmt_list(sql->sa, l);
// map the values in qfrom, qto into vertex IDs
D = stmt_project(sql->sa, smpl, c); // domain
-
- // make the operator
- spfw = stmt_spfw(sql->sa, left, graph);
-
-
-
-// spfw->op4.lval = sa_list(sql->sa);
-// for(node* n = rel->exps->h; n; n = n->next){
-// list_append(spfw->op4.lval, exp_bin(sql, n->data, left, edges,
NULL, NULL, NULL, NULL));
-// }
-//
-// // input columns (for debug reasons)
-// do { // damn c
-// int i = 0;
-// for(node* n = left->op4.lval->h; n; n = n->next, i++){
-// stmt* s = n->data;
-// printf("[%d] %s %s, with f: %s %s, type: %d, tbl:
%p\n", i, s->tname, s->cname, table_name(sql->sa, s), column_name(sql->sa, s),
s->type, s->op4.tval);
-// }
-// } while(0);
-//
-// // apply the filter
-// r = stmt_result(sql->sa, spfw, 0);
-// l = sa_list(sql->sa);
-// for(node *n = left->op4.lval->h; n; n = n->next) {
-// stmt *col = n->data;
-//
-// if (col->nrcols == 0) /* constant */
-// col = stmt_const(sql->sa, r, col);
-// else
-// col = stmt_project(sql->sa, r, col);
-// list_append(l, col);
-// }
-// return stmt_list(sql->sa, l);
+ // 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);
+
+ // finally 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);
+ 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);
+ }
+ result = stmt_list(sql->sa, l);
+
+ print_tree(sql->sa, result); // FIXME debug only
+
+ return result;
}
static stmt *
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
@@ -2771,36 +2771,199 @@ static int
if (q == NULL)
return -1;
} break;
- case st_mkgraph: {
-
+ case st_concat: {
+ int ref_cpy = -1;
+ int ref_op = -1;
+ node *n = s->op4.lval->h;
+
+ // for the first value, copy the bat
+ ref_op = _dumpstmt(sql, mb, n->data);
+ if(ref_op < 0)
+ return -1;
+
+ q = newStmt(mb, batRef, copyRef);
+ q = pushArgument(mb, q, ref_op);
+ ref_cpy = getDestVar(q);
+
+ // for the remaining operands, append them to the
copied bat
+ for (n = n->next; n; n = n->next){
+ ref_op = _dumpstmt(sql, mb, n->data);
+ if(ref_op < 0)
+ return -1;
+
+ q = newStmt(mb, batRef, appendRef);
+ q = pushArgument(mb, q, ref_cpy);
+ q = pushArgument(mb, q, ref_op);
+// q = pushBit(mb, q, TRUE); // FIXME: should it
be forced?
+ ref_cpy = getDestVar(q);
+ }
+ s->nr = ref_cpy;
+ } break;
+ case st_exp2vrtx: {
+ 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;
+ InstrPtr qfrom_oid = NULL, qto_oid = NULL;
+
+ // process the operands
+ ref_left = _dumpstmt(sql, mb, s->op1);
+ if(ref_left < 0)
+ return -1;
+ ref_right = _dumpstmt(sql, mb, s->op2);
+ if(ref_right < 0)
+ return -1;
+ ref_domain = _dumpstmt(sql, mb, s->op3);
+ if(ref_domain < 0)
+ return -1;
+
+ cnt1 = newStmt(mb, aggrRef, countRef);
+ pushArgument(mb, cnt1, ref_left);
+
+ // let's start with the first join
+ jr1 = newTmpVariable(mb, TYPE_any);
+ join = newStmt(mb, algebraRef, "subsemijoin");
+ pushReturn(mb, join, jr1);
+ pushArgument(mb, join, ref_left);
+ pushArgument(mb, join, ref_domain);
+ pushNil(mb, join, TYPE_bat);
+ pushNil(mb, join, TYPE_bat);
+ pushBit(mb, join, FALSE);
+ pushLng(mb, q, getDestVar(cnt1));
+// jl1 = getDestVar(join);
+
+ // second join
+ jr2 = newTmpVariable(mb, TYPE_any);
+ join = newStmt(mb, algebraRef, "subsemijoin");
+ pushReturn(mb, join, jr2);
+ pushArgument(mb, join, ref_right);
+ pushArgument(mb, join, ref_domain);
+ pushArgument(mb, join, jr1);
+ pushNil(mb, join, TYPE_bat);
+ pushBit(mb, join, FALSE);
+ pushLng(mb, q, getDestVar(cnt1));
+ jl2 = getDestVar(join);
+
+// qtemp = newTmpVariable(mb, TYPE_bat); // qfrom
+ qto_oid = newAssignment(mb); // qto
+ pushArgument(mb, qto_oid, jr2);
+
+ cnt1 = newStmt(mb, aggrRef, countRef);
+ pushArgument(mb, cnt1, jr1);
+ cnt2 = newStmt(mb, aggrRef, countRef);
+ pushArgument(mb, cnt2, jr2);
+
+ // if |jr1| > |jr2|
+ cmp = newStmt(mb, "calc", "==");
+ pushArgument(mb, cmp, getDestVar(cnt1));
+ pushArgument(mb, cmp, getDestVar(cnt2));
+ stmt_if = newAssignment(mb);
+ stmt_if->barrier = BARRIERsymbol;
+ stmt_if = pushArgument(mb, stmt_if, getDestVar(cmp));
+
+ // third join
+ jr3 = newTmpVariable(mb, TYPE_any);
+ join = newStmt(mb, algebraRef, "subsemijoin");
+ pushReturn(mb, join, jr3);
+ pushArgument(mb, join, ref_left);
+ pushArgument(mb, join, ref_domain);
+ pushArgument(mb, join, jl2); // candidate list for
ref_left
+ pushNil(mb, join, TYPE_bat);
+ pushBit(mb, join, FALSE);
+ pushArgument(mb, join, getDestVar(cnt2));
+// jl3 = getDestVar(join);
+
+ qfrom_oid = newAssignment(mb);
+ pushArgument(mb, qfrom_oid, jr3);
+
+ stmt_endif = newAssignment(mb);
+ getArg(stmt_endif, 0) = getDestVar(cmp);
+ stmt_endif->argc = stmt_endif->retc = 1;
+ stmt_endif->barrier = EXITsymbol;
+
+ // else |jr1| == |jr2|
+ cmp_not = newStmt(mb, calcRef, notRef);
+ pushArgument(mb, cmp_not, getDestVar(cmp));
+ stmt_else = newAssignment(mb);
+ stmt_else->barrier = BARRIERsymbol;
+ stmt_else = pushArgument(mb, stmt_else,
getDestVar(cmp_not));
+
+ qfrom_oid = newAssignment(mb);
+ pushArgument(mb, qfrom_oid, jr1);
+
+ stmt_endif = newAssignment(mb);
+ getArg(stmt_endif, 0) = getDestVar(cmp_not);
+ stmt_endif->argc = stmt_endif->retc = 1;
+ stmt_endif->barrier = EXITsymbol;
+
+ // abi convention for st_result
+ s->nr = getDestVar(qfrom_oid);
+ renameVariable(mb, getDestVar(qto_oid), "r1_%d", s->nr);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list