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