Changeset: 575ed6cd0370 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=575ed6cd0370
Added Files:
        sql/server/rel_graph.c
        sql/server/rel_graph.h
Modified Files:
        .gitignore
        sql/backends/monet5/rel_bin.c
        sql/include/sql_relation.h
        sql/server/rel_distribute.c
        sql/server/rel_dump.c
        sql/server/rel_optimizer.c
        sql/server/rel_partition.c
        sql/server/rel_rel.c
        sql/server/rel_select.c
Branch: graph0
Log Message:

Semantic phase (only join)


diffs (truncated from 682 to 300 lines):

diff --git a/.gitignore b/.gitignore
--- a/.gitignore
+++ b/.gitignore
@@ -116,3 +116,4 @@ syntax: regexp
 /.settings/
 /build
 /symbols.xml
+/Default/
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
@@ -1329,6 +1329,8 @@ rel2bin_args(backend *be, sql_rel *rel, 
        case op_delete:
                args = rel2bin_args(be, rel->r, args);
                break;
+       case op_graph:
+               assert(0 && "Not implemented yet"); // TODO: not handled
        }
        return args;
 }
@@ -4783,6 +4785,8 @@ subrel_bin(backend *be, sql_rel *rel, li
        case op_ddl:
                s = rel2bin_ddl(be, rel, refs);
                break;
+       case op_graph:
+               assert(0 && "Not implemented yet"); // TODO: not handled
        }
        if (s && rel_is_ref(rel)) {
                list_append(refs, rel);
@@ -5023,6 +5027,8 @@ rel_deps(sql_allocator *sa, sql_rel *r, 
                        exps_deps(sa, r->exps, refs, l);
                }
                break;
+       case op_graph:
+               assert(0 && "Not implemented yet"); // TODO: not handled
        }
        if (r->exps)
                exps_deps(sa, r->exps, refs, l);
diff --git a/sql/include/sql_relation.h b/sql/include/sql_relation.h
--- a/sql/include/sql_relation.h
+++ b/sql/include/sql_relation.h
@@ -163,7 +163,8 @@ typedef enum operator_type {
        op_sample,
        op_insert,      /* insert(l=table, r insert expressions) */ 
        op_update,      /* update(l=table, r update expressions) */
-       op_delete       /* delete(l=table, r delete expression) */
+       op_delete,      /* delete(l=table, r delete expression) */
+       op_graph,
 } operator_type;
 
 #define is_atom(et) \
@@ -225,6 +226,8 @@ typedef enum operator_type {
        (op == op_insert || op == op_update || op == op_delete)
 #define is_sample(op) \
        (op == op_sample)
+#define is_graph(op) \
+       (op == op_graph)
 
 /* NO NIL semantics of aggr operations */
 #define need_no_nil(e) \
@@ -295,4 +298,13 @@ typedef struct relation {
        void *p;        /* properties for the optimizer, distribution */
 } sql_rel;
 
+typedef struct {
+       sql_rel relation;
+       sql_rel *edges; // edge table
+       list *efrom;
+       list *eto;
+       list *qfrom;
+       list *qto;
+} sql_graph;
+
 #endif /* SQL_RELATION_H */
diff --git a/sql/server/rel_distribute.c b/sql/server/rel_distribute.c
--- a/sql/server/rel_distribute.c
+++ b/sql/server/rel_distribute.c
@@ -65,6 +65,8 @@ has_remote_or_replica( sql_rel *rel )
                if (rel->r && has_remote_or_replica( rel->r )) 
                        return 1;
                break;
+       case op_graph:
+               assert(0 && "Not implemented yet"); // TODO: not handled
        }
        return 0;
 }
@@ -175,6 +177,8 @@ replica(mvc *sql, sql_rel *rel, char *ur
        case op_delete:
                rel->r = replica(sql, rel->r, uri);
                break;
+       case op_graph:
+               assert(0 && "Not implemented yet"); // TODO: not handled
        }
        return rel;
 }
@@ -270,6 +274,8 @@ distribute(mvc *sql, sql_rel *rel)
        case op_delete:
                rel->r = distribute(sql, rel->r);
                break;
+       case op_graph:
+               assert(0 && "Not implemented yet"); // TODO: not handled
        }
        return rel;
 }
@@ -316,6 +322,8 @@ rel_remote_func(mvc *sql, sql_rel *rel)
        case op_delete:
                rel->r = rel_remote_func(sql, rel->r);
                break;
+       case op_graph:
+               assert(0 && "Not implemented yet"); // TODO: not handled
        }
        if (find_prop(rel->p, PROP_REMOTE) != NULL) {
                list *exps = rel_projections(sql, rel, NULL, 1, 1);
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
@@ -288,6 +288,8 @@ op2string(operator_type op)
        case op_update: 
        case op_delete: 
                return "modify op";
+       case op_graph:
+               return "graph";
        default:
                return "unknown";
        }
@@ -504,6 +506,39 @@ rel_print_(mvc *sql, stream  *fout, sql_
                if (rel->exps)
                        exps_print(sql, fout, rel->exps, depth, 1, 0);
        }       break;
+       case op_graph: {
+               sql_graph *graph_ptr = (sql_graph*) rel;
+               print_indent(sql, fout, depth, decorate);
+               mnstr_printf(fout, "graph");
+               if (rel_is_ref(rel->l)) {
+                       int nr = find_ref(refs, rel->l);
+                       print_indent(sql, fout, depth+1, decorate);
+                       mnstr_printf(fout, "& REF %d ", nr);
+               } else
+                       rel_print_(sql, fout, rel->l, depth+1, refs, decorate);
+               if (rel->r) {
+                       if (rel_is_ref(rel->r)) {
+                               int nr = find_ref(refs, rel->r);
+                               print_indent(sql, fout, depth+1, decorate);
+                               mnstr_printf(fout, "& REF %d ", nr);
+                       } else
+                               rel_print_(sql, fout, rel->r, depth+1, refs, 
decorate);
+               }
+               if(rel_is_ref(graph_ptr->edges)){
+                       int nr = find_ref(refs, graph_ptr->edges);
+                       print_indent(sql, fout, depth+1, decorate);
+                       mnstr_printf(fout, "& REF %d ", nr);
+               } else {
+                       rel_print_(sql, fout, rel->r, depth+1, refs, decorate);
+               }
+               exps_print(sql, fout, graph_ptr->qfrom, depth, 1, 0);
+               mnstr_printf(fout, " -> ");
+               exps_print(sql, fout, graph_ptr->qto, depth, 1, 0);
+               mnstr_printf(fout, ", src: ");
+               exps_print(sql, fout, graph_ptr->efrom, depth, 1, 0);
+               mnstr_printf(fout, ", dst: ");
+               exps_print(sql, fout, graph_ptr->eto, depth, 1, 0);
+       }   break;
        default:
                assert(0);
        }
@@ -575,6 +610,25 @@ rel_print_refs(mvc *sql, stream* fout, s
                        list_append(refs, rel->r);
                }
                break;
+       case op_graph:
+       {
+               sql_graph* graph_ptr = (sql_graph*) rel;
+               rel_print_refs(sql, fout, rel->l, depth, refs, decorate);
+               if (rel->l && rel_is_ref(rel->l) && !find_ref(refs, rel->l)) {
+                       rel_print_(sql, fout, rel->l, depth, refs, decorate);
+                       list_append(refs, rel->l);
+               }
+               rel_print_refs(sql, fout, rel->r, depth, refs, decorate);
+               if (rel->r && rel_is_ref(rel->r) && !find_ref(refs, rel->r)) {
+                       rel_print_(sql, fout, rel->r, depth, refs, decorate);
+                       list_append(refs, rel->r);
+               }
+               rel_print_refs(sql, fout, graph_ptr->edges, depth, refs, 
decorate);
+               if (graph_ptr->edges && rel_is_ref(graph_ptr->edges) && 
!find_ref(refs, graph_ptr->edges)) {
+                       rel_print_(sql, fout, graph_ptr->edges, depth, refs, 
decorate);
+                       list_append(refs, graph_ptr->edges);
+               }
+       }
        }
 }
 
diff --git a/sql/server/rel_graph.c b/sql/server/rel_graph.c
new file mode 100644
--- /dev/null
+++ b/sql/server/rel_graph.c
@@ -0,0 +1,264 @@
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0.  If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * Copyright 1997 - July 2008 CWI, August 2008 - 2016 MonetDB B.V.
+ */
+
+#include "monetdb_config.h"
+#include "rel_graph.h"
+
+#include <assert.h>
+
+#include "rel_dump.h"
+#include "rel_exp.h"
+#include "rel_rel.h"
+#include "rel_select.h"
+#include "sql_relation.h" // rel_graph
+
+sql_rel* rel_graph_reaches(mvc *sql, sql_rel *rel, symbol *sq, int context){
+    dnode* lstoperands = NULL; // temp to navigate over the operands
+    symbol* sym_qfrom = NULL; // the `from' column in the ast
+    symbol* sym_qto = NULL; // the `to' column in the ast
+    sql_exp* qfrom = NULL; // reference to the `from' column
+    sql_exp* qto = NULL; // reference to the `to' column
+    symbol* sym_edges_tbl = NULL; // the table edges in the ast
+    sql_rel* tbl_edges = NULL; // the edges table exp~
+    symbol* sym_edges_from = NULL; // reference to the `edges from' column in 
the ast
+    symbol* sym_edges_to = NULL; // ref to the `edges to' column in the ast
+    sql_exp* efrom = NULL; // ref to the edges column `from'
+    sql_exp* eto= NULL; // ref to the edges column `to'
+    sql_subtype* exptype = NULL; // the expression type for all columns
+    sql_exp* graph_join = NULL; // the produced predicate for the join
+    exp_kind exp_kind_value = {type_value, card_column, TRUE};
+    sql_graph* graph_ptr; // the created operator
+    sql_rel* result = NULL; // final output operator
+    int use_views_old = 0; // temporary to remember the old value of 
sql->use_views
+
+    assert(sq->token == SQL_GRAPH_REACHES && "Invalid label in the AST, 
expected SQL_GRAPH_REACHES");
+
+    // disable stmt caching for this query as WIP
+    sql->caching = false;
+
+    // let's see what we have got so far
+    printf("[Semantic analysis] Input relation: %s", rel_to_str(sql, rel));
+
+    lstoperands = sq->data.lval->h;
+    sym_qfrom = lstoperands->data.sym; // first operand symbol( dlist( table, 
column ) )
+    lstoperands = lstoperands->next; // move next
+    sym_qto = lstoperands->data.sym; // second operand symbol( dlist( table, 
column ) )
+
+    qfrom = rel_value_exp(sql, &rel, sym_qfrom, context, exp_kind_value);
+    if(!qfrom) return NULL; // cannot refer to qfrom
+    qto = rel_value_exp(sql, &rel, sym_qto, context, exp_kind_value);
+    if(!qto) return NULL; // cannot refer to qto
+
+    // edges table
+    lstoperands = lstoperands->next;
+    sym_edges_tbl = lstoperands->data.sym;
+    use_views_old = sql->use_views; // TODO: ask Ni3ls the rationale of this 
trick
+    sql->use_views = TRUE; // table_ref can find references declared with 
`WITH'
+    tbl_edges = table_ref(sql, NULL, sym_edges_tbl, /* lateral = */ 0);
+    sql->use_views = use_views_old; // restore the previous value
+    if(!tbl_edges) return NULL; // error
+
+    // find the columns in tbl_edges
+    lstoperands = lstoperands->next;
+    sym_edges_from = lstoperands->data.sym;
+    efrom = rel_value_exp(sql, &tbl_edges, sym_edges_from, context, 
exp_kind_value);
+    if(!efrom) return NULL; // error
+    lstoperands = lstoperands->next;
+    sym_edges_to = lstoperands->data.sym;
+    eto = rel_value_exp(sql, &tbl_edges, sym_edges_to, context, 
exp_kind_value);
+    if(!eto) return NULL; // error
+
+    // check the types match
+    exptype = exp_subtype(efrom);
+    if(subtype_cmp(exptype, exp_subtype(eto)) < 0){
+       return sql_error(sql, 03, "Types for the edge columns `%s' and `%s' do 
not match", efrom->name, eto->name);
+    }
+    qfrom = rel_check_type(sql, exptype, qfrom, type_equal);
+    if(!qfrom) return NULL; // cannot convert qfrom into the same type of efrom
+    qto = rel_check_type(sql, exptype, qto, type_equal);
+    if(!qto) return NULL; // cannot convert qto into the same type of eto
+
+    // build the new operator graph join operator
+    *graph_ptr = sa_alloc(sql->sa, sizeof(sql_graph));
+    if(!graph_ptr) { return sql_error(sql, 03, "Cannot allocate rel_graph"); }
+    memset(graph_ptr, 0, sizeof(graph_ptr));
+    result = (sql_rel*) graph_ptr;
+    sql_ref_init(&result->ref);
+    result->l = rel;
+    result->exps = sa_list(sql->sa); // empty list
+    result->card = CARD_MULTI;
+    result->nrcols = rel->nrcols;
+    graph_ptr->edges = tbl_edges;
+    graph_ptr->efrom = sa_list(sql->sa);
+    list_append(graph_ptr->efrom, efrom);
+    graph_ptr->eto = sa_list(sql->sa);
+    list_append(graph_ptr->eto, eto);
+    graph_ptr->qfrom = sa_list(sql->sa);
+    list_append(graph_ptr->qfrom, qfrom);
+    graph_ptr->qto = sa_list(sql->sa);
+    list_append(graph_ptr->qto, qto);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to