Changeset: 129094d42aa3 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=129094d42aa3
Modified Files:
monetdb5/optimizer/opt_prelude.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
sql/server/rel_dump.c
sql/server/rel_dump.h
sql/server/rel_optimizer.c
sql/server/rel_rel.c
Branch: graph0
Log Message:
MIL Codegen - WIP
diffs (truncated from 336 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
@@ -94,6 +94,8 @@ str getRef;
str getTraceRef;
str generatorRef;
str grabRef;
+str graphRef;
+str graph_makeRef;
str groupRef;
str subgroupRef;
str subgroupdoneRef;
@@ -326,6 +328,8 @@ void optimizerInit(void)
getTraceRef = putName("getTrace");
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/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
@@ -4553,10 +4553,81 @@ rel2bin_ddl(mvc *sql, sql_rel *rel, list
static stmt *
rel2bin_spfw(mvc *sql, sql_rel *rel, list *refs)
{
- printf("[Codegen] Input relation: %s\n", rel_to_str(sql, rel));
-
- // for the time being, just ignore spfw and generate the code for the
upper table
- return subrel_bin(sql, rel->l, refs);
+ stmt *edges = NULL, *spfw = NULL, *graph = NULL;
+ stmt *left = NULL, right = NULL;
+ stmt *c = NULL, *g = NULL, *groups = NULL, *smpl = NULL;
+ stmt *D = NULL;
+ stmt *p0 = NULL, *p1 = NULL;
+ list *l = NULL;
+ stmt *e_from = NULL, *e_to = NULL, *q_from = NULL, *q_to = NULL;
+ node *n = NULL;
+
+ // materialize the input relations
+ left = subrel_bin(sql->sa, rel->l, refs);
+ if(!left) return NULL;
+ (void) right;
+ edges = subrel_bin(sql->sa, 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
+ n = rel->exps->h;
+ q_from = exp_bin(sql->sa, 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);
+ n = n->next;
+ e_from = exp_bin(sql->sa, 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);
+
+ // create the graph
+ // this is, like, super fun!
+ l = sa_list(sql->sa);
+ list_append(l, e_from);
+ list_append(l, e_to);
+ c = stmt_concat(sql->sa, l);
+ 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);
+ graph = stmt_mkgraph(sql->sa, e_from, e_to);
+
+ // 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);
}
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,6 +2771,37 @@ static int
if (q == NULL)
return -1;
} break;
+ case st_mkgraph: {
+
+ } break;
+ case st_spfw: {
+ stmt *qfrom = NULL, *qto = NULL, *efrom = NULL, *eto =
NULL;
+ int left = -1, edges = -1;
+ node* n = NULL;
+
+ left = _dumpstmt(sql, mb, s->op1);
+ if(left < 0)
+ return -1;
+
+ edges = _dumpstmt(sql, mb, s->op2);
+ if(edges < 0)
+ return -1;
+
+ // retrieve the columns
+ n = s->op4.lval->h;
+ qfrom = n->data;
+ n = n->next;
+ qto = n->data;
+ n = n->next;
+ efrom = n->data;
+ n = n->next;
+ eto = n->data;
+
+ (void) qfrom;
+ (void) qto;
+ (void) efrom;
+ (void) eto;
+ } break;
}
if (mb->errors)
return -1;
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
@@ -120,6 +120,9 @@ st_type2string(st_type type)
ST(control_end);
ST(return);
ST(assign);
+
+ ST(mkgraph);
+ ST(spfw);
default:
return "unknown"; /* just needed for broken compilers ! */
}
@@ -320,6 +323,8 @@ stmt_deps(list *dep_list, stmt *s, int d
case st_uselect:
case st_uselect2:
+
+ case st_spfw:
if (s->op1)
push(s->op1);
if (s->op2)
@@ -1361,6 +1366,7 @@ const char *
case st_tdiff:
case st_tinter:
case st_convert:
+ case st_spfw:
return column_name(sa, st->op1);
case st_Nop:
{
@@ -1432,6 +1438,7 @@ const char *
case st_tdiff:
case st_tinter:
case st_aggr:
+ case st_spfw:
return table_name(sa, st->op1);
case st_table_clear:
@@ -1489,6 +1496,7 @@ schema_name(sql_allocator *sa, stmt *st)
case st_convert:
case st_Nop:
case st_aggr:
+ case st_spfw:
return schema_name(sa, st->op1);
case st_alias:
/* there are no schema aliases, ie look into the base column */
@@ -1593,6 +1601,51 @@ stmt_assign(sql_allocator *sa, const cha
}
stmt *
+stmt_concat(sql_allocator *sa, list* l)
+{
+ stmt *s = stmt_create(sa, st_concat);
+ s->op4.lval = l;
+ s->nr = 1;
+ return s;
+}
+
+stmt *
+stmt_mkgraph(sql_allocator *sa, stmt* from, stmt* to)
+{
+ stmt *s = stmt_create(sa, st_mkgraph);
+ s->op1 = from;
+ s->op2 = to;
+ s->nrcols = 3; // 4 with the weights
+ return s;
+}
+
+stmt *
+stmt_mkpartition(sql_allocator *sa, stmt* st, int partno, int num_partitions)
+{
+ stmt *s = stmt_create(sa, st_mkpartition);
+ list *l = sa_list(sa);
+ s->op1 = st;
+ list_append(l, (void*) partno);
+ list_append(l, (void*) num_partitions);
+ s->op4 = l;
+ s->nrcols = 1;
+ return s;
+}
+
+stmt *
+stmt_spfw(sql_allocator *sa, stmt* l, stmt* edges)
+{
+ stmt *s = stmt_create(sa, st_spfw);
+ s->op1 = l;
+ s->op2 = edges;
+
+ // strong suspects these are the output cols of the operator
+ s->nrcols = 2;
+
+ return s;
+}
+
+stmt *
const_column(sql_allocator *sa, stmt *val)
{
sql_subtype *ct = tail_type(val);
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
@@ -94,7 +94,13 @@ typedef enum stmt_type {
st_cond,
st_control_end,
st_return,
- st_assign
+ st_assign,
+
+ // these are new kids in the town
+ st_concat,
+ st_mkgraph,
+ st_mkpartition,
+ st_spfw,
} st_type;
/* flag to indicate anti join/select */
@@ -240,6 +246,10 @@ extern stmt *stmt_if(sql_allocator *sa,
extern stmt *stmt_return(sql_allocator *sa, stmt *val, int
nr_of_declared_tables);
extern stmt *stmt_assign(sql_allocator *sa, const char *varname, stmt *val,
int level);
+extern stmt *stmt_concat(sql_allocator *sa, list *l);
+extern stmt *stmt_mkgraph(sql_allocator *sa, stmt *from, stmt *to); // +
weights
+extern stmt *stmt_spfw(sql_allocator *sa, stmt* l, stmt* edges);
+
extern sql_subtype *tail_type(stmt *st);
extern int stmt_has_null(stmt *s);
diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -1360,3 +1360,18 @@ rel_to_str(mvc *sql, sql_rel *rel)
mnstr_destroy(s);
return res;
}
+
+str
+exp_to_str(mvc *sql, sql_exp *exp)
+{
+ buffer *b;
+ stream *s = buffer_wastream(b = buffer_create(1024), "exp_dump");
+ char *res = NULL;
+
+ exp_print(sql, s, exp, 0, /*comma = */ 0, 0);
+ mnstr_printf(s, "\n");
+ res = buffer_get_buf(b);
+ buffer_destroy(b);
+ mnstr_destroy(s);
+ return res;
+}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list