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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list