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

Using iterator to rewrite remote and replica tables, later more optimizations 
can be done here


diffs (truncated from 647 to 300 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
@@ -24,14 +24,11 @@ has_remote_or_replica( sql_rel *rel )
        case op_basetable: {
                sql_table *t = rel->l;
 
-               if (t && (isReplicaTable(t) || isRemote(t)))
-                       return 1;
-               break;
+               return t && (isReplicaTable(t) || isRemote(t));
        }
        case op_table:
                if (IS_TABLE_PROD_FUNC(rel->flag) || rel->flag == 
TABLE_FROM_RELATION)
-                       if (has_remote_or_replica( rel->l ))
-                               return 1;
+                       return has_remote_or_replica( rel->l );
                break;
        case op_join:
        case op_left:
@@ -45,35 +42,23 @@ has_remote_or_replica( sql_rel *rel )
        case op_inter:
        case op_except:
        case op_merge:
-               if (has_remote_or_replica( rel->l ) ||
-                       has_remote_or_replica( rel->r ))
-                       return 1;
-               break;
+
+       case op_insert:
+       case op_update:
+       case op_delete:
+               return has_remote_or_replica( rel->l ) || 
has_remote_or_replica( rel->r );
        case op_project:
        case op_select:
        case op_groupby:
        case op_topn:
        case op_sample:
        case op_truncate:
-               if (has_remote_or_replica( rel->l ))
-                       return 1;
-               break;
+               return has_remote_or_replica( rel->l );
        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 (has_remote_or_replica( rel->l ))
-                               return 1;
-               } else if (rel->flag == ddl_list || rel->flag == ddl_exception) 
{
-                       if (has_remote_or_replica( rel->l ) ||
-                               has_remote_or_replica( rel->r ))
-                       return 1;
-               }
-               break;
-       case op_insert:
-       case op_update:
-       case op_delete:
-               if (has_remote_or_replica( rel->l ) ||
-                       has_remote_or_replica( rel->r ))
-                       return 1;
+               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*/)
+                       return has_remote_or_replica( rel->l );
+               if (rel->flag == ddl_list || rel->flag == ddl_exception)
+                       return has_remote_or_replica( rel->l ) || 
has_remote_or_replica( rel->r );
                break;
        }
        return 0;
@@ -112,91 +97,20 @@ rewrite_replica( mvc *sql, sql_rel *rel,
        /* set_remote() */
        if (remote_prop && p && isRemote(p)) {
                char *local_name = sa_strconcat(sql->sa, sa_strconcat(sql->sa, 
p->s->base.name, "."), p->base.name);
-               if (!local_name) {
-                       return NULL;
-               }
                prop *p = r->p = prop_create(sql->sa, PROP_REMOTE, r->p);
-               if (!p) {
-                       return NULL;
-               }
-
                p->value = local_name;
        }
        return r;
 }
 
-static list * exps_replica(mvc *sql, list *exps, char *uri) ;
-static sql_rel * replica(mvc *sql, sql_rel *rel, char *uri);
-
-static sql_exp *
-exp_replica(mvc *sql, sql_exp *e, char *uri)
+static sql_rel *
+replica(visitor *v, sql_rel *rel)
 {
-       switch(e->type) {
-       case e_column:
-               break;
-       case e_atom:
-               if (e->f)
-                       e->f = exps_replica(sql, e->f, uri);
-               break;
-       case e_convert:
-               e->l = exp_replica(sql, e->l, uri);
-               break;
-       case e_aggr:
-       case e_func:
-               e->l = exps_replica(sql, e->l, uri);
-               e->r = exps_replica(sql, e->r, uri);
-               break;
-       case e_cmp:
-               if (e->flag == cmp_or || e->flag == cmp_filter) {
-                       e->l = exps_replica(sql, e->l, uri);
-                       e->r = exps_replica(sql, e->r, uri);
-               } else if (e->flag == cmp_in || e->flag == cmp_notin) {
-                       e->l = exp_replica(sql, e->l, uri);
-                       e->r = exps_replica(sql, e->r, uri);
-               } else {
-                       e->l = exp_replica(sql, e->l, uri);
-                       e->r = exps_replica(sql, e->r, uri);
-                       if (e->f)
-                               e->f = exps_replica(sql, e->f, uri);
-               }
-               break;
-       case e_psm:
-               if (e->flag & PSM_SET || e->flag & PSM_RETURN || e->flag & 
PSM_EXCEPTION) {
-                       e->l = exp_replica(sql, e->l, uri);
-               } else if (e->flag & PSM_WHILE || e->flag & PSM_IF) {
-                       e->l = exp_replica(sql, e->l, uri);
-                       e->r = exps_replica(sql, e->r, uri);
-                       if (e->f)
-                               e->f = exps_replica(sql, e->f, uri);
-               } else if (e->flag & PSM_REL) {
-                       e->l = replica(sql, e->l, uri);
-               }
-               break;
-       }
-       return e;
-}
-
-static list *
-exps_replica(mvc *sql, list *exps, char *uri)
-{
-       node *n;
-
-       if (!exps)
-               return exps;
-       for( n = exps->h; n; n = n->next)
-               n->data = exp_replica(sql, n->data, uri);
-       return exps;
-}
-
-static sql_rel *
-replica(mvc *sql, sql_rel *rel, char *uri)
-{
-       if (!rel)
-               return rel;
-
+       const char *uri = v->data;
+ 
        if (rel_is_ref(rel)) {
                if (has_remote_or_replica(rel)) {
-                       sql_rel *nrel = rel_copy(sql, rel, 1);
+                       sql_rel *nrel = rel_copy(v->sql, rel, 1);
 
                        rel_destroy(rel);
                        rel = nrel;
@@ -204,170 +118,53 @@ replica(mvc *sql, sql_rel *rel, char *ur
                        return rel;
                }
        }
-       switch (rel->op) {
-       case op_basetable: {
+       if (is_basetable(rel->op)) {
                sql_table *t = rel->l;
 
-               if (t && isReplicaTable(t)) {
-                       node *n;
-
+               if (t && isReplicaTable(t) && !list_empty(t->members)) {
                        if (uri) {
                                /* replace by the replica which matches the uri 
*/
-                               for (n = t->members->h; n; n = n->next) {
+                               for (node *n = t->members->h; n; n = n->next) {
                                        sql_part *p = n->data;
-                                       sql_table *pt = 
find_sql_table_id(sql->session->tr, t->s, p->member);
+                                       sql_table *pt = 
find_sql_table_id(v->sql->session->tr, t->s, p->member);
 
                                        if (isRemote(pt) && strcmp(uri, 
pt->query) == 0) {
-                                               rel = rewrite_replica(sql, rel, 
t, p, 0);
+                                               rel = rewrite_replica(v->sql, 
rel, t, p, 0);
                                                break;
                                        }
                                }
                        } else { /* no match, find one without remote or use 
first */
-                               if (t->members) {
-                                       int fnd = 0;
-                                       sql_part *p;
-                                       for (n = t->members->h; n; n = n->next) 
{
-                                               sql_part *p = n->data;
-                                               sql_table *pt = 
find_sql_table_id(sql->session->tr, t->s, p->member);
+                               int fnd = 0;
+                               sql_part *p;
+                               for (node *n = t->members->h; n; n = n->next) {
+                                       sql_part *p = n->data;
+                                       sql_table *pt = 
find_sql_table_id(v->sql->session->tr, t->s, p->member);
 
-                                               if (!isRemote(pt)) {
-                                                       fnd = 1;
-                                                       rel = 
rewrite_replica(sql, rel, t, p, 0);
-                                                       break;
-                                               }
+                                       if (!isRemote(pt)) {
+                                               fnd = 1;
+                                               rel = rewrite_replica(v->sql, 
rel, t, p, 0);
+                                               break;
                                        }
-                                       if (!fnd) {
-                                               p = t->members->h->data;
-                                               rel = rewrite_replica(sql, rel, 
t, p, 1);
-                                       }
-                               } else {
-                                       rel = NULL;
+                               }
+                               if (!fnd) {
+                                       p = t->members->h->data;
+                                       rel = rewrite_replica(v->sql, rel, t, 
p, 1);
                                }
                        }
                }
-       } break;
-       case op_table:
-               if (IS_TABLE_PROD_FUNC(rel->flag) || rel->flag == 
TABLE_FROM_RELATION)
-                       rel->l = replica(sql, rel->l, uri);
-               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_merge:
-               rel->l = replica(sql, rel->l, uri);
-               rel->r = replica(sql, rel->r, uri);
-               break;
-       case op_project:
-       case op_select:
-       case op_groupby:
-       case op_topn:
-       case op_sample:
-       case op_truncate:
-               rel->l = replica(sql, rel->l, uri);
-               break;
-       case op_ddl:
-               if ((rel->flag == ddl_psm || rel->flag == ddl_exception) && 
rel->exps)
-                       rel->exps = exps_replica(sql, rel->exps, uri);
-               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*/) {
-                       rel->l = replica(sql, rel->l, uri);
-               } else if (rel->flag == ddl_list || rel->flag == ddl_exception) 
{
-                       rel->l = replica(sql, rel->l, uri);
-                       rel->r = replica(sql, rel->r, uri);
-               }
-               break;
-       case op_insert:
-       case op_update:
-       case op_delete:
-               rel->l = replica(sql, rel->l, uri);
-               rel->r = replica(sql, rel->r, uri);
-               break;
        }
        return rel;
 }
 
-static list * exps_distribute(mvc *sql, list *exps) ;
-static sql_rel * distribute(mvc *sql, sql_rel *rel);
-
-static sql_exp *
-exp_distribute(mvc *sql, sql_exp *e)
+static sql_rel *
+distribute(visitor *v, sql_rel *rel)
 {
-       switch(e->type) {
-       case e_column:
-               break;
-       case e_atom:
-               if (e->f)
-                       e->f = exps_distribute(sql, e->f);
-               break;
-       case e_convert:
-               e->l = exp_distribute(sql, e->l);
-               break;
-       case e_aggr:
-       case e_func:
-               e->l = exps_distribute(sql, e->l);
-               e->r = exps_distribute(sql, e->r);
-               break;
-       case e_cmp:
-               if (e->flag == cmp_or || e->flag == cmp_filter) {
-                       e->l = exps_distribute(sql, e->l);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to