Changeset: 4639a1db91b4 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4639a1db91b4 Modified Files: common/stream/stream.c common/stream/stream.h sql/backends/monet5/rel_bin.c sql/backends/monet5/sql_statement.c sql/server/rel_dump.c Branch: graph0 Log Message:
CODEGEN: XML interface for the spfw operator diffs (225 lines): diff --git a/common/stream/stream.c b/common/stream/stream.c --- a/common/stream/stream.c +++ b/common/stream/stream.c @@ -3429,8 +3429,8 @@ buffer_create(size_t size) return b; } -char * -buffer_get_buf(buffer *b) +static char * +buffer_get_buf0(buffer *b, bool unsafe) { char *r; @@ -3440,12 +3440,30 @@ buffer_get_buf(buffer *b) return NULL; r = b->buf; r[b->pos] = '\0'; - b->buf = malloc(b->len); - b->len = b->buf ? b->len : 0; + if(unsafe) { + b->buf = NULL; + b->len = 0; + } else { + b->buf = malloc(b->len); + b->len = b->buf ? b->len : 0; + } b->pos = 0; return r; } +char * +buffer_get_buf(buffer *b) +{ + return buffer_get_buf0(b, false); +} + + +char * +buffer_get_buf_unsafe(buffer *b) +{ + return buffer_get_buf0(b, true); +} + void buffer_destroy(buffer *b) { diff --git a/common/stream/stream.h b/common/stream/stream.h --- a/common/stream/stream.h +++ b/common/stream/stream.h @@ -192,6 +192,7 @@ typedef struct buffer { stream_export void buffer_init(buffer *b, char *buf, size_t size); stream_export buffer *buffer_create(size_t size); stream_export char *buffer_get_buf(buffer *b); +stream_export char *buffer_get_buf_unsafe(buffer *b); stream_export void buffer_destroy(buffer *b); stream_export stream *buffer_rastream(buffer *b, const char *name); 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 @@ -4964,7 +4964,6 @@ subrel_bin(backend *be, sql_rel *rel, li case op_graph_join: case op_graph_select: s = rel2bin_graph(be, rel, refs); - printf("MAL instruction: %s\n", mal2str(be->mb, 0, be->mb->stop)); break; } if (s && rel_is_ref(rel)) { @@ -4996,6 +4995,8 @@ output_rel_bin(backend *be, sql_rel *rel int sqltype = sql->type; stmt *s = subrel_bin(be, rel, refs); + printf("[output_rel_bin] %s\n", mal2str(be->mb, 0, be->mb->stop)); + if (sqltype == Q_SCHEMA) sql->type = sqltype; /* reset */ 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 @@ -3671,12 +3671,23 @@ stmt_gr8_spfw(backend *be, stmt *query, stmt *s = NULL; int dest = -1; int i = -1; + stream *stream = buffer_wastream(buffer_create(1024), "spfw_codegen_query"); // Validate the input parameters assert(query->type == st_list && "Invalid parameter type"); assert(list_length(query->op4.lval) == 4 && "Expected 4 input parameters: left & right candidate ids, left & right vertex ids"); assert(weights->type == st_list && "Invalid parameter type"); + // prepare the query + mnstr_printf(stream, "<spfw from='codegen'>\n"); + + // is this a join? + if(global_flags & SPFW_JOIN){ + mnstr_printf(stream, "\t<operation>join</operation>\n"); + } else { + mnstr_printf(stream, "\t<operation>filter</operation>\n"); + } + // I can use macros too.. #define EVIL_PUSH(S) if (((stmt*) (S))->type == st_none ) { q = pushNil(be->mb, q, TYPE_bat); } \ else if(((stmt*)S)->nr < 0) { return NULL; } else { q = pushArgument(be->mb, q, ((stmt*) S)->nr); } @@ -3691,6 +3702,9 @@ stmt_gr8_spfw(backend *be, stmt *query, for(node *n = weights->op4.lval->h; n; n = n->next){ q = pushReturn(be->mb, q, newTmpVariable(be->mb, TYPE_any)); } + + // the first argument should be the query description + q = pushStr(be->mb, q, ""); // placeholder // input arguments for(node *n = query->op4.lval->h; n; n = n->next){ // query parameters EVIL_PUSH(n->data); @@ -3700,11 +3714,67 @@ stmt_gr8_spfw(backend *be, stmt *query, for(node *n = weights->op4.lval->h; n; n = n->next){ // weights EVIL_PUSH(n->data); } - q = pushInt(be->mb, q, global_flags); #undef EVIL_PUSH - // ABI convention + // describe the input columns + mnstr_printf(stream, "\t<input>\n"); + mnstr_printf(stream, "\t\t<column name='candidates_left' pos='%d' />\n", q->retc +1); + if(be->mb->var[q->argv[q->retc+2]]->value.val.bval != bat_nil) { + mnstr_printf(stream, "\t\t<column name='candidates_right' pos='%d' />\n", q->retc +2); + } + mnstr_printf(stream, "\t\t<column name='src' pos='%d' />\n", q->retc +3); + mnstr_printf(stream, "\t\t<column name='dst' pos='%d' />\n", q->retc +4); + mnstr_printf(stream, "\t</input>\n"); + + // graph columns + mnstr_printf(stream, "\t<graph type='columns'>\n"); + mnstr_printf(stream, "\t\t<column name='src' pos='%d' />\n", q->retc +5); + mnstr_printf(stream, "\t\t<column name='dst' pos='%d' />\n", q->retc +6); + mnstr_printf(stream, "\t</graph>\n"); + + + // spfw + do { + int ret_spfw = 2; // 0 = jl, 1 = jr + int arg_spfw = q->retc + 7; + + mnstr_printf(stream, "\t<subexpr>\n"); + + for(node *n = weights->op4.lval->h; n; n = n->next){ + mnstr_printf(stream, "\t\t<shortest_path>\n"); + mnstr_printf(stream, "\t\t\t<column name='output' pos='%d' />\n", ret_spfw++); + mnstr_printf(stream, "\t\t\t<column name='weights' pos='%d' />\n", arg_spfw++); + mnstr_printf(stream, "\t\t</shortest_path>\n"); + } + + mnstr_printf(stream, "\t</subexpr>\n"); + } while (0); + + + // save the query description + do { + char *spfw_argument_buffer = NULL; + size_t spfw_argument_length = 0; + ValRecord record; + int record_ptr = -1; + + mnstr_printf(stream, "</spfw>"); + spfw_argument_buffer = buffer_get_buf_unsafe(mnstr_get_buffer(stream)); + spfw_argument_length = strlen(spfw_argument_buffer); + + record.vtype = TYPE_str; + record.val.sval = GDKstrdup(spfw_argument_buffer); // TODO: it should check whether the alloc~ succeeded + record.len = (int) spfw_argument_length; + record_ptr = defConstant(be->mb, TYPE_str, &record); + q->argv[q->retc] = record_ptr; + + + free(spfw_argument_buffer); + mnstr_destroy(stream); stream = NULL; + } while(0); + + // API convention dest = getDestVar(q); // jl renameVariable(be->mb, getArg(q, 1), "r1_%d", dest); // jr i = 2; 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 @@ -1412,8 +1412,9 @@ rel_read(mvc *sql, char *r, int *pos, li // DEBUG ONLY -- copy & paste from sql_gencode.c + decorate = TRUE +// use with case, the result needs to be freed once used str -dump_rel( mvc *sql, sql_rel *rel) +dump_rel(mvc *sql, sql_rel *rel) { buffer *b; stream *s = buffer_wastream(b = buffer_create(1024), "rel_dump"); @@ -1423,21 +1424,22 @@ dump_rel( mvc *sql, sql_rel *rel) rel_print_refs(sql, s, rel, 0, refs, TRUE); rel_print_(sql, s, rel, 0, refs, TRUE); mnstr_printf(s, "\n"); - res = buffer_get_buf(b); + res = buffer_get_buf(b); // leaks memory buffer_destroy(b); mnstr_destroy(s); return res; } +// use with case, the result needs to be freed once used str -dump_exps(mvc *sql, list *exps ){ +dump_exps(mvc *sql, list *exps){ buffer *b; stream *s = buffer_wastream(b = buffer_create(1024), "rel_dump"); char *res = NULL; exps_print(sql, s, exps, 0, /*alias=*/ 1, /*brackets=*/0); mnstr_printf(s, "\n"); - res = buffer_get_buf(b); + res = buffer_get_buf(b); // leaks memory buffer_destroy(b); mnstr_destroy(s); return res; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list