Changeset: b40b2a3d947e for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b40b2a3d947e
Modified Files:
        sql/server/rel_distribute.c
        sql/server/rel_partition.c
        sql/server/rel_rel.c
Branch: graph0
Log Message:

Handle replica / merge tables for the graph operators


diffs (204 lines):

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
@@ -66,8 +66,11 @@ has_remote_or_replica( sql_rel *rel )
                        return 1;
                break;
        case op_graph_join:
-       case op_graph_select:
-               assert(0 && "Not implemented yet"); // TODO: not handled
+       case op_graph_select: {
+               sql_graph* graph_ptr = (sql_graph*) rel;
+               if (has_remote_or_replica(rel->l) || 
has_remote_or_replica(rel->r) || has_remote_or_replica(graph_ptr->edges))
+                       return 1;
+       } break;
        }
        return 0;
 }
@@ -179,8 +182,12 @@ replica(mvc *sql, sql_rel *rel, char *ur
                rel->r = replica(sql, rel->r, uri);
                break;
        case op_graph_join:
-       case op_graph_select:
-               assert(0 && "Not implemented yet"); // TODO: not handled
+       case op_graph_select: {
+               sql_graph* graph_ptr = (sql_graph*) rel;
+               rel->l = replica(sql, rel->l, uri);
+               rel->r = replica(sql, rel->r, uri);
+               graph_ptr->edges = replica(sql, graph_ptr->edges, uri);
+       } break;
        }
        return rel;
 }
@@ -277,8 +284,63 @@ distribute(mvc *sql, sql_rel *rel)
                rel->r = distribute(sql, rel->r);
                break;
        case op_graph_join:
-       case op_graph_select:
-               assert(0 && "Not implemented yet"); // TODO: not handled
+       case op_graph_select: {
+               sql_graph* graph_ptr = (sql_graph*) rel;
+               sql_rel* g = NULL;
+               prop* pg = NULL;
+
+               // recursion
+               l = rel->l = distribute(sql, rel->l);
+               r = rel->r = distribute(sql, rel->r);
+               g = graph_ptr->edges = distribute(sql, graph_ptr->edges);
+
+               pl = find_prop(l->p, PROP_REMOTE);
+               if(rel->op == op_graph_join)
+                       pr = find_prop(r->p, PROP_REMOTE);
+               else
+                       pr = NULL;
+               pg = find_prop(g->p, PROP_REMOTE);
+
+               // replicas
+               if(pl) {
+                       if(rel->op == op_graph_join && !pr) {
+                               r = rel->r = distribute(sql, replica(sql, 
rel->r, pl->value));
+                               pr = find_prop(r->p, PROP_REMOTE);
+                       }
+                       if(!pg) {
+                               g = graph_ptr->edges = distribute(sql, 
replica(sql, graph_ptr->edges, pl->value));
+                               pg = find_prop(g->p, PROP_REMOTE);
+                       }
+               } else if(pr) {
+//                     if(!pl) {
+                               l = rel->l = distribute(sql, replica(sql, 
rel->l, pr->value));
+                               pl = find_prop(l->p, PROP_REMOTE);
+//                     }
+                       if(!pg) {
+                               g = graph_ptr->edges = distribute(sql, 
replica(sql, graph_ptr->edges, pr->value));
+                               pg = find_prop(g->p, PROP_REMOTE);
+                       }
+               } else if (pg) {
+                       l = rel->l = distribute(sql, replica(sql, rel->l, 
pg->value));
+                       pl = find_prop(l->p, PROP_REMOTE);
+                       if(rel->op == op_graph_join) {
+                               r = rel->r = distribute(sql, replica(sql, 
rel->r, pg->value));
+                               pr = find_prop(r->p, PROP_REMOTE);
+                       }
+               }
+
+               // remove the property if all of them have the same uri
+               if (pl && pg && strcmp(pl->value, pg->value) == 0 &&
+                               (rel->op != op_graph_join || (pr && 
strcmp(pl->value, pr->value) == 0))){
+                       l->p = prop_remove(l->p, pl);
+                       if(pr){ r->p = prop_remove(r->p, pr); }
+                       g->p = prop_remove(g->p, pg);
+
+                       pl->p = rel->p;
+                       rel->p = pl;
+               }
+
+       } break;
        }
        return rel;
 }
@@ -326,8 +388,12 @@ rel_remote_func(mvc *sql, sql_rel *rel)
                rel->r = rel_remote_func(sql, rel->r);
                break;
        case op_graph_join:
-       case op_graph_select:
-               assert(0 && "Not implemented yet"); // TODO: not handled
+       case op_graph_select: {
+               sql_graph* graph_ptr = (sql_graph*) rel;
+               rel->l = rel_remote_func(sql, rel->l);
+               rel->r = rel_remote_func(sql, rel->r);
+               graph_ptr->edges = rel_remote_func(sql, graph_ptr->edges);
+       } break;
        }
        if (find_prop(rel->p, PROP_REMOTE) != NULL) {
                list *exps = rel_projections(sql, rel, NULL, 1, 1);
diff --git a/sql/server/rel_partition.c b/sql/server/rel_partition.c
--- a/sql/server/rel_partition.c
+++ b/sql/server/rel_partition.c
@@ -67,6 +67,9 @@ find_basetables( sql_rel *rel, list *tab
        case op_union: 
        case op_inter: 
        case op_except: 
+
+       case op_graph_join:
+       case op_graph_select:
                if (rel->l)
                        find_basetables(rel->l, tables); 
                if (rel->r)
@@ -88,9 +91,6 @@ find_basetables( sql_rel *rel, list *tab
                if (rel->r)
                        find_basetables(rel->r, tables); 
                break;
-       case op_graph_join:
-       case op_graph_select:
-               assert(0 && "Not implemented yet"); // TODO: not handled
        }
 }
 
@@ -129,9 +129,9 @@ has_groupby(sql_rel *rel)
 {
        if (rel->op == op_groupby) 
                return 1;
-       if (is_join(rel->op)) 
+       if (is_extended_join(rel->op))
                return has_groupby(rel->l) || has_groupby(rel->r);
-       if ((is_select(rel->op) || is_project(rel->op)) && rel->l) 
+       if ((is_extended_select(rel->op) || is_project(rel->op)) && rel->l)
                return has_groupby(rel->l);
        return 0;
 }
@@ -140,6 +140,8 @@ sql_rel *
 rel_partition(mvc *sql, sql_rel *rel) 
 {
        (void)sql;
+       if(rel == NULL) return NULL;
+
        if (rel->op == op_basetable) {
                rel->flag = REL_PARTITION;
        } else if ((rel->op == op_topn || rel->op == op_sample || rel->op == 
op_select) && rel->l) {
@@ -159,6 +161,11 @@ rel_partition(mvc *sql, sql_rel *rel)
                }
                else
                        _rel_partition(sql, rel);
+       } else if (is_graph(rel->op)) {
+               sql_graph* graph_ptr = (sql_graph*) rel;
+               rel_partition(sql, rel->l);
+               rel_partition(sql, rel->r);
+               rel_partition(sql, graph_ptr->edges);
        }
        return rel;
 }
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -104,7 +104,10 @@ rel_create( sql_allocator *sa )
 sql_rel *
 rel_copy( sql_allocator *sa, sql_rel *i )
 {
-       sql_rel *rel = rel_create(sa);
+       sql_rel *rel = NULL;
+       if(!i) return NULL;
+
+       rel = (is_graph(i->op)) ? ((sql_rel*) rel_graph_create(sa)) : 
rel_create(sa);
 
        rel->l = NULL;
        rel->r = NULL;
@@ -124,8 +127,17 @@ rel_copy( sql_allocator *sa, sql_rel *i 
                        rel->r = (i->r)?list_dup(i->r, (fdup)NULL):NULL;
                break;
        case op_graph_join:
-       case op_graph_select:
-               assert(0 && "Not implemented yet");
+       case op_graph_select: {
+               sql_graph* gold = (sql_graph*) i;
+               sql_graph* gnew = (sql_graph*) rel;
+
+               rel->l = rel_copy(sa, i->l);
+               rel->r = rel_copy(sa, i->r);
+               gnew->edges = rel_copy(sa, gold->edges);
+               gnew->efrom = list_dup(gold->efrom, (fdup) NULL);
+               gnew->eto = list_dup(gold->eto, (fdup) NULL);
+               gnew->spfw = list_dup(gold->spfw, (fdup) NULL);
+       } break;
        case op_join:
        case op_left:
        case op_right:
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to