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