Changeset: b0d5baf854eb for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b0d5baf854eb
Modified Files:
        sql/server/rel_distribute.c
Branch: new_rmt_opt
Log Message:

Rewrite remote opt cleanup


diffs (168 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
@@ -238,7 +238,7 @@ rel_merge_remote_prop(visitor *v, prop *
 }
 
 static sql_rel *
-rel_rewrite_remote_2_(visitor *v, sql_rel *rel)
+rel_rewrite_remote_(visitor *v, sql_rel *rel)
 {
        prop *p, *pl, *pr;
 
@@ -394,154 +394,10 @@ rel_rewrite_remote_2_(visitor *v, sql_re
 }
 
 static sql_rel *
-rel_rewrite_remote_(visitor *v, sql_rel *rel)
-{
-       prop *p, *pl, *pr;
-
-       if (!eliminate_remote_or_replica_refs(v, &rel))
-               return rel;
-
-       sql_rel *l = rel->l, *r = rel->r; /* look on left and right relations 
after possibly doing rel_copy */
-
-       switch (rel->op) {
-       case op_basetable: {
-               sql_table *t = rel->l;
-
-               /* when a basetable wraps a sql_table (->l) which is remote we 
want to store its remote
-                * uri to the REMOTE property. As the property is pulled up the 
tree it can be used in
-                * the case of binary rel operators (see later switch cases) in 
order to
-                * 1. resolve properly (same uri) replica tables in the other 
subtree (that's why we
-                *    call the rewrite_replica)
-                * 2. pull REMOTE over the binary op if the other subtree has a 
matching uri remote table
-                */
-               if (t && isRemote(t) && (p = find_prop(rel->p, PROP_REMOTE)) == 
NULL) {
-                       p = rel->p = prop_create(v->sql->sa, PROP_REMOTE, 
rel->p);
-                       p->id = t->base.id;
-                       p->value.pval = (void *)mapiuri_uri(t->query, 
v->sql->sa);
-               }
-       } break;
-       case op_table:
-               if (IS_TABLE_PROD_FUNC(rel->flag) || rel->flag == 
TABLE_FROM_RELATION) {
-                       if (l && (p = find_prop(l->p, PROP_REMOTE)) != NULL) {
-                               l->p = prop_remove(l->p, p);
-                               if (!find_prop(rel->p, PROP_REMOTE)) {
-                                       p->p = rel->p;
-                                       rel->p = p;
-                               }
-                       }
-               } break;
-       case op_join:
-       case op_left:
-       case op_right:
-       case op_full:
-
-       case op_semi:
-       case op_anti:
-
-       case op_union:
-       case op_inter:
-       case op_except:
-
-       case op_insert:
-       case op_update:
-       case op_delete:
-       case op_merge:
-               if (is_join(rel->op) && list_empty(rel->exps) &&
-                       find_prop(l->p, PROP_REMOTE) == NULL &&
-                       find_prop(r->p, PROP_REMOTE) == NULL) {
-                       /* cleanup replica's */
-                       visitor rv = { .sql = v->sql };
-
-                       l = rel->l = rel_visitor_bottomup(&rv, l, 
&rel_rewrite_replica_);
-                       rv.data = NULL;
-                       r = rel->r = rel_visitor_bottomup(&rv, r, 
&rel_rewrite_replica_);
-                       if ((!l || !r) && v->sql->session->status) /* if the 
recursive calls failed */
-                               return NULL;
-               }
-               if ((is_join(rel->op) || is_semi(rel->op) || is_set(rel->op)) &&
-                       (pl = find_prop(l->p, PROP_REMOTE)) != NULL &&
-                       find_prop(r->p, PROP_REMOTE) == NULL) {
-                       visitor rv = { .sql = v->sql, .data = pl->value.pval };
-
-                       if (!(r = rel_visitor_bottomup(&rv, r, 
&rel_rewrite_replica_)) && v->sql->session->status)
-                               return NULL;
-                       rv.data = NULL;
-                       if (!(r = rel->r = rel_visitor_bottomup(&rv, r, 
&rel_rewrite_remote_)) && v->sql->session->status)
-                               return NULL;
-               } else if ((is_join(rel->op) || is_semi(rel->op) || 
is_set(rel->op)) &&
-                       find_prop(l->p, PROP_REMOTE) == NULL &&
-                       (pr = find_prop(r->p, PROP_REMOTE)) != NULL) {
-                       visitor rv = { .sql = v->sql, .data = pr->value.pval };
-
-                       if (!(l = rel_visitor_bottomup(&rv, l, 
&rel_rewrite_replica_)) && v->sql->session->status)
-                               return NULL;
-                       rv.data = NULL;
-                       if (!(l = rel->l = rel_visitor_bottomup(&rv, l, 
&rel_rewrite_remote_)) && v->sql->session->status)
-                               return NULL;
-               }
-
-               if (rel->flag&MERGE_LEFT) /* search for any remote tables but 
don't propagate over to this relation */
-                       return rel;
-
-               /* if both subtrees have the REMOTE property with the same uri 
then pull it up */
-               if (l && (pl = find_prop(l->p, PROP_REMOTE)) != NULL &&
-                       r && (pr = find_prop(r->p, PROP_REMOTE)) != NULL &&
-                       strcmp(pl->value.pval, pr->value.pval) == 0) {
-                       l->p = prop_remove(l->p, pl);
-                       r->p = prop_remove(r->p, pr);
-                       if (!find_prop(rel->p, PROP_REMOTE)) {
-                               pl->p = rel->p;
-                               rel->p = pl;
-                       }
-               }
-               break;
-       case op_project:
-       case op_select:
-       case op_groupby:
-       case op_topn:
-       case op_sample:
-       case op_truncate:
-               if (l && (p = find_prop(l->p, PROP_REMOTE)) != NULL) {
-                       l->p = prop_remove(l->p, p);
-                       if (!find_prop(rel->p, PROP_REMOTE)) {
-                               p->p = rel->p;
-                               rel->p = p;
-                       }
-               }
-               break;
-       case op_ddl:
-               if (rel->flag == ddl_output || rel->flag == ddl_create_seq || 
rel->flag == ddl_alter_seq /*|| rel->flag == ddl_alter_table || rel->flag == 
ddl_create_table || rel->flag == ddl_create_view*/) {
-                       if (l && (p = find_prop(l->p, PROP_REMOTE)) != NULL) {
-                               l->p = prop_remove(l->p, p);
-                               if (!find_prop(rel->p, PROP_REMOTE)) {
-                                       p->p = rel->p;
-                                       rel->p = p;
-                               }
-                       }
-               } else if (rel->flag == ddl_list || rel->flag == ddl_exception) 
{
-                       if (l && (pl = find_prop(l->p, PROP_REMOTE)) != NULL &&
-                               r && (pr = find_prop(r->p, PROP_REMOTE)) != 
NULL &&
-                               strcmp(pl->value.pval, pr->value.pval) == 0) {
-                               l->p = prop_remove(l->p, pl);
-                               r->p = prop_remove(r->p, pr);
-                               if (!find_prop(rel->p, PROP_REMOTE)) {
-                                       pl->p = rel->p;
-                                       rel->p = pl;
-                               }
-                       }
-               }
-               break;
-       }
-       return rel;
-}
-
-static sql_rel *
 rel_rewrite_remote(visitor *v, global_props *gp, sql_rel *rel)
 {
        (void) gp;
-       // TODO next call is no-op remove together with the rel_rewrite_remote_ 
impl
-       rel_visitor_bottomup(v, NULL, &rel_rewrite_remote_);
-       rel = rel_visitor_bottomup(v, rel, &rel_rewrite_remote_2_);
+       rel = rel_visitor_bottomup(v, rel, &rel_rewrite_remote_);
        rel = rel_visitor_topdown(v, rel, &rel_rewrite_replica_);
        return rel;
 }
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to