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

Reply via email to