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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list