Changeset: 0f8f143a1df6 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0f8f143a1df6
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/include/sql_relation.h
        sql/server/rel_distribute.c
        sql/server/rel_dump.c
        sql/server/rel_exp.c
        sql/server/rel_graph.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:

Split op_graph in op_graph_join and op_graph_select


diffs (truncated from 529 to 300 lines):

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
@@ -1331,7 +1331,8 @@ rel2bin_args(backend *be, sql_rel *rel, 
        case op_delete:
                args = rel2bin_args(be, rel->r, args);
                break;
-       case op_graph:
+       case op_graph_join:
+       case op_graph_select:
                assert(0 && "Not implemented yet"); // TODO: not handled
        }
        return args;
@@ -4787,7 +4788,8 @@ subrel_bin(backend *be, sql_rel *rel, li
        case op_ddl:
                s = rel2bin_ddl(be, rel, refs);
                break;
-       case op_graph:
+       case op_graph_join:
+       case op_graph_select:
                assert(0 && "Not implemented yet"); // TODO: not handled
        }
        if (s && rel_is_ref(rel)) {
@@ -5031,7 +5033,8 @@ rel_deps(sql_allocator *sa, sql_rel *r, 
                        exps_deps(sa, r->exps, refs, l);
                }
                break;
-       case op_graph:
+       case op_graph_join:
+       case op_graph_select:
                assert(0 && "Not implemented yet"); // TODO: not handled
        }
        if (r->exps)
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
@@ -160,7 +160,8 @@ typedef enum operator_type {
        op_groupby,     
        op_topn,
        op_sample,
-       op_graph,
+       op_graph_join,
+       op_graph_select,
        op_insert,      /* insert(l=table, r insert expressions) */ 
        op_update,      /* update(l=table, r update expressions) */
        op_delete,      /* delete(l=table, r delete expression) */
@@ -229,9 +230,7 @@ typedef enum operator_type {
 #define is_sample(op) \
        (op == op_sample)
 #define is_graph(op) \
-       (op == op_graph)
-#define is_join_like(op) \
-       (is_join(op) || is_graph(op))
+       (op == op_graph_join || op_graph_select)
 
 /* NO NIL semantics of aggr operations */
 #define need_no_nil(e) \
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,7 +65,8 @@ has_remote_or_replica( sql_rel *rel )
                if (rel->r && has_remote_or_replica( rel->r )) 
                        return 1;
                break;
-       case op_graph:
+       case op_graph_join:
+       case op_graph_select:
                assert(0 && "Not implemented yet"); // TODO: not handled
        }
        return 0;
@@ -177,7 +178,8 @@ replica(mvc *sql, sql_rel *rel, char *ur
        case op_delete:
                rel->r = replica(sql, rel->r, uri);
                break;
-       case op_graph:
+       case op_graph_join:
+       case op_graph_select:
                assert(0 && "Not implemented yet"); // TODO: not handled
        }
        return rel;
@@ -274,7 +276,8 @@ distribute(mvc *sql, sql_rel *rel)
        case op_delete:
                rel->r = distribute(sql, rel->r);
                break;
-       case op_graph:
+       case op_graph_join:
+       case op_graph_select:
                assert(0 && "Not implemented yet"); // TODO: not handled
        }
        return rel;
@@ -322,7 +325,8 @@ rel_remote_func(mvc *sql, sql_rel *rel)
        case op_delete:
                rel->r = rel_remote_func(sql, rel->r);
                break;
-       case op_graph:
+       case op_graph_join:
+       case op_graph_select:
                assert(0 && "Not implemented yet"); // TODO: not handled
        }
        if (find_prop(rel->p, PROP_REMOTE) != NULL) {
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
@@ -294,8 +294,10 @@ op2string(operator_type op)
        case op_update: 
        case op_delete: 
                return "modify op";
-       case op_graph:
-               return "graph";
+       case op_graph_join:
+               return "graph/2";
+       case op_graph_select:
+               return "graph/1";
        default:
                return "unknown";
        }
@@ -512,10 +514,10 @@ rel_print_(mvc *sql, stream  *fout, sql_
                if (rel->exps)
                        exps_print(sql, fout, rel->exps, depth, 1, 0);
        }       break;
-       case op_graph: {
+       case op_graph_join: {
                sql_graph *graph_ptr = (sql_graph*) rel;
                print_indent(sql, fout, depth, decorate);
-               mnstr_printf(fout, "graph");
+               mnstr_printf(fout, "%s", op2string(rel->op));
                if (rel_is_ref(rel->l)) {
                        int nr = find_ref(refs, rel->l);
                        print_indent(sql, fout, depth+1, decorate);
@@ -615,7 +617,8 @@ rel_print_refs(mvc *sql, stream* fout, s
                        list_append(refs, rel->r);
                }
                break;
-       case op_graph:
+       case op_graph_join:
+       case op_graph_select:
        {
                sql_graph* graph_ptr = (sql_graph*) rel;
                rel_print_refs(sql, fout, rel->l, depth, refs, decorate);
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -584,7 +584,7 @@ exp_graph(mvc *sql, list *l, list *r)
        sql_exp *e = exp_create(sql->sa, e_graph);
        e->l = l;
        e->r = r;
-       e->card = CARD_ATOM;
+       e->card = CARD_MULTI;
        return e;
 }
 
@@ -1229,7 +1229,7 @@ rel_find_exp_( sql_rel *rel, sql_exp *e)
        case e_atom:
                return e;
        case e_graph:
-               assert(0 && "Not implemented yet");
+               return NULL;
        }
        return ne;
 }
@@ -1246,6 +1246,7 @@ rel_find_exp( sql_rel *rel, sql_exp *e)
                case op_full:
                case op_join:
                case op_apply:
+               case op_graph_join:
                        ne = rel_find_exp(rel->l, e);
                        if (!ne) 
                                ne = rel_find_exp(rel->r, e);
diff --git a/sql/server/rel_graph.c b/sql/server/rel_graph.c
--- a/sql/server/rel_graph.c
+++ b/sql/server/rel_graph.c
@@ -51,9 +51,8 @@ sql_rel* rel_graph_reaches(mvc *sql, sql
     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_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 = NULL; // the created operator
     sql_exp* exp_ptr = NULL; // the created expression ( x reaches y )
@@ -77,6 +76,10 @@ sql_rel* rel_graph_reaches(mvc *sql, sql
     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
+    // TODO: to be handled with graph_select
+    if(qfrom->card != CARD_MULTI || qto->card != CARD_MULTI){
+       return sql_error(sql, 42, "["__FILE__ ":%d] select/filter syntax not 
implemented yet", __LINE__);
+    }
 
     // edges table
     lstoperands = lstoperands->next;
@@ -113,13 +116,13 @@ sql_rel* rel_graph_reaches(mvc *sql, sql
     memset(graph_ptr, 0, sizeof(sql_graph));
     result = (sql_rel*) graph_ptr;
     sql_ref_init(&result->ref);
-    result->op = op_graph;
+    result->op = op_graph_select;
     result->l = rel;
     exp_ptr = (sql_exp*) sa_alloc(sql->sa, sizeof(sql_exp));
     if(!exp_ptr) { return sql_error(sql, 03, "Cannot allocate sql_exp 
[e_graph] "); }
     memset(exp_ptr, 0, sizeof(sql_exp));
     exp_ptr->type = e_graph;
-    exp_ptr->card = CARD_ATOM; // it shouldn't matter
+    exp_ptr->card = CARD_MULTI;
     exp_ptr->l = sa_list(sql->sa);
     list_append(exp_ptr->l, qfrom);
     exp_ptr->r = sa_list(sql->sa);
@@ -138,7 +141,7 @@ sql_rel* rel_graph_reaches(mvc *sql, sql
     // let us see if what we are creating makes sense
     printf("[Semantic analysis] Output relation: %s\n", rel2str1(sql, result));
 
-    return result;
+    return rel;
 }
 
 /*****************************************************************************
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -156,7 +156,8 @@ name_find_column( sql_rel *rel, char *rn
        case op_update:
        case op_delete:
                break;
-       case op_graph:
+       case op_graph_join:
+       case op_graph_select:
                assert(0 && "Not implemented yet"); // TODO: not handled
        }
        if (alias) { /* we found an expression with the correct name, but
@@ -259,7 +260,8 @@ rel_properties(mvc *sql, global_props *g
                if (rel->r) 
                        rel_properties(sql, gp, rel->r);
                break;
-       case op_graph: {
+       case op_graph_join:
+       case op_graph_select: {
                sql_graph* graph_ptr = (sql_graph*) rel;
                // propagate
                rel_properties(sql, gp, rel->l);
@@ -300,7 +302,8 @@ rel_properties(mvc *sql, global_props *g
        case op_delete:
        case op_ddl:
                break;
-       case op_graph:
+       case op_graph_join:
+       case op_graph_select:
                break;
        }
 }
@@ -1106,7 +1109,8 @@ rel_join_order(mvc *sql, sql_rel *rel)
                rel->l = rel_join_order(sql, rel->l);
                rel->r = rel_join_order(sql, rel->r);
                break;
-       case op_graph:
+       case op_graph_join:
+       case op_graph_select:
                assert(0 && "Not implemented yet"); // TODO: not handled
        }
        if (is_join(rel->op) && rel->exps && !rel_is_ref(rel)) {
@@ -3886,6 +3890,7 @@ rel_push_select_down(int *changes, mvc *
                if (rel_is_ref(rel->l) && rel->l == rel_find_ref(r->r)){
                        sql_rel *lx = rel->l;
                        sql_rel *rx = r->r;
+                       // TODO: maybe it needs to be handled for graphs as 
well. It needs an use case where this rule fires
                        if (lx->ref.refcnt == 2 && !rel_is_ref(rx)) {
                                while (rx->l && !rel_is_ref(rx->l) &&
                                       (is_project(rx->op) || 
@@ -3911,6 +3916,7 @@ rel_push_select_down(int *changes, mvc *
        if (is_select(rel->op) && r && (is_join(r->op) || is_apply(r->op)) && 
!(rel_is_ref(r))) {
                sql_rel *jl = r->l;
                sql_rel *jr = r->r;
+               // booleans, can we push down in the lhs and rhs?
                int left = r->op == op_join || r->op == op_left;
                int right = r->op == op_join || r->op == op_right;
 
@@ -5378,10 +5384,10 @@ rel_remove_join(int *changes, mvc *sql, 
 static sql_rel *
 rel_push_project_up(int *changes, mvc *sql, sql_rel *rel) 
 {
-       const int is_join_like = is_join_like(rel->op);
+       const int is_join_like = is_join(rel->op) || rel->op == op_graph_join;
 
        /* project/project cleanup is done later */
-       if (is_join_like || is_select(rel->op)) {
+       if (is_join(rel->op) || is_select(rel->op) || is_graph(rel->op)) {
                node *n;
                list *exps = NULL, *l_exps, *r_exps;
                sql_rel *l = rel->l;
@@ -5400,7 +5406,7 @@ rel_push_project_up(int *changes, mvc *s
                        return rel;
 
                // Same for graphs, avoid the infinite recursion O.o'
-               if(rel->op == op_graph && ((l->op != op_project) ||
+               if(is_graph(rel->op) && ((l->op != op_project) ||
                                (r && r->op != op_project) ||
                                (r && rel_is_ref(r))))
                        return rel;
@@ -5430,7 +5436,7 @@ rel_push_project_up(int *changes, mvc *s
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to