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

Reply via email to