Changeset: 3391fa2b099f for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/3391fa2b099f Modified Files: sql/server/rel_optimize_proj.c Branch: balanced_union Log Message:
Implements push_join_down_munion optimizer WIP 2 diffs (63 lines): diff --git a/sql/server/rel_optimize_proj.c b/sql/server/rel_optimize_proj.c --- a/sql/server/rel_optimize_proj.c +++ b/sql/server/rel_optimize_proj.c @@ -3726,10 +3726,14 @@ rel_push_join_down_munion(visitor *v, sq !(je = rel_is_join_on_pkey(rel, aligned_pk_fk)))) return rel; - // TODO: why? bailout for no semijoin without pkey joins + // TODO: why? bailout for union semijoin without pkey joins expressions if (is_semi(rel->op) && is_munion(l->op) && !je) return rel; + /* if both sides are munions we assume that they will have the same number of children */ + if (is_munion(l->op) && is_munion(r->op) && list_length(l->l) != list_length(r->l)) + return rel; + if (is_munion(l->op) && !need_distinct(l) && !is_single(l) && !is_munion(r->op)){ /* join(munion(a,b,c), d) -> munion(join(a,d), join(b,d), join(c,d)) */ @@ -3756,8 +3760,41 @@ rel_push_join_down_munion(visitor *v, sq } else if (is_munion(l->op) && !need_distinct(l) && !is_single(l) && is_munion(r->op) && !need_distinct(r) && !is_single(r) && je) { - /* join(munion(a,b,c), union(d,e,f)) -> munion(join(a,d), join(b,e), join(c,f)) */ - // TODO + /* join(munion(a,b,c), munion(d,e,f)) -> munion(join(a,d), join(b,e), join(c,f)) */ + list *cps = sa_list(v->sql->sa); + /* create pairwise joins between left and right parts. assume eq num of parts (see earlier bailout) */ + for (node *n = ((list*)l->l)->h, *m=((list*)r->l)->h; n && m; n = n->next, m = m->next) { + /* left part */ + sql_rel *lp = rel_dup(n->data); + if (!is_project(lp->op)) + lp = rel_project(v->sql->sa, lp, rel_projections(v->sql, lp, NULL, 1, 1)); + rel_rename_exps(v->sql, l->exps, lp->exps); + if (l != ol) { + lp = rel_project(v->sql->sa, lp, NULL); + lp->exps = exps_copy(v->sql, ol->exps); + set_processed(lp); + } + /* right part */ + sql_rel *rp = rel_dup(m->data); + if (!is_project(rp->op)) + rp = rel_project(v->sql->sa, rp, rel_projections(v->sql, rp, NULL, 1, 1)); + rel_rename_exps(v->sql, l->exps, rp->exps); + if (l != ol) { + rp = rel_project(v->sql->sa, rp, NULL); + rp->exps = exps_copy(v->sql, ol->exps); + set_processed(rp); + } + /* combine them */ + sql_rel *cp = rel_crossproduct(v->sql->sa, lp, rp, rel->op); + cp->exps = exps_copy(v->sql, exps); + cp->attr = exps_copy(v->sql, attr); + set_processed(cp); + cp = rel_project(v->sql->sa, cp, rel_projections(v->sql, cp, NULL, 1, 1)); + cps = append(cps, cp); + } + v->changes++; + return rel_inplace_setop_n_ary(v->sql, rel, cps, op_munion, + rel_projections(v->sql, rel, NULL, 1, 1)); } else if (!is_munion(l->op) && is_munion(r->op) && !need_distinct(r) && !is_single(r) && !is_semi(rel->op)) { _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org