Changeset: 043afd5efe04 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/043afd5efe04 Modified Files: sql/server/rel_optimize_proj.c Branch: balanced_union Log Message:
Implements push_join_down_munion optimizer WIP 4 diffs (59 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 @@ -3822,16 +3822,42 @@ rel_push_join_down_munion(visitor *v, sq } else if (!is_munion(l->op) && is_munion(r->op) && !need_distinct(r) && !is_single(r) && is_semi(rel->op) && je) { - /* {semi}join ( A1, munion (B, A2, C)) [A1.partkey = A2.partkey] -> - * {semi}join ( A1, A2 ) - * (ie a single part on n-th munion operand) + /* {semi}join ( A1, munion (B, A2a, C, A2b)) [A1.partkey = A2.partkey] -> + * {semi}join ( A1, munion (A2a, A2b)) + * (ie some parts of an n-th munion operand) * * How to detect that a relation isn't matching? * partitioning is currently done only on pkey/fkey's * ie only matching per part if join is on pkey/fkey (parts) * and part numbers should match. * */ - // TODO + int lpnr = rel_part_nr(l, je); + if (lpnr < 0) + return rel; + + list *ups = sa_list(v->sql->sa); + for (node *n = ((list*)r->l)->h; n; n = n->next) { + if (rel_uses_part_nr(n->data, je, lpnr)) { + sql_rel *pc = rel_dup(n->data); + /*if (!is_project(pc->op))*/ + /*pc = rel_project(v->sql->sa, pc,*/ + /*rel_projections(v->sql, pc, NULL, 1, 1));*/ + /*rel_rename_exps(v->sql, r->exps, pc->exps);*/ + /*if (r != or) {*/ + /*pc = rel_project(v->sql->sa, pc, NULL);*/ + /*pc->exps = exps_copy(v->sql, or->exps);*/ + /*set_processed(pc);*/ + /*}*/ + /*pc = rel_crossproduct(v->sql->sa, rel_dup(ol), pc, rel->op);*/ + /*pc->exps = exps_copy(v->sql, exps);*/ + /*pc->attr = exps_copy(v->sql, attr);*/ + /*set_processed(pc);*/ + ups = append(ups, pc); + } + } + v->changes++; + return rel_inplace_setop_n_ary(v->sql, r, ups, op_munion, + rel_projections(v->sql, rel, NULL, 1, 1)); } } return rel; @@ -3842,7 +3868,7 @@ rel_optimize_unions_topdown_(visitor *v, { rel = rel_push_project_down_union(v, rel); // TODO: implement rel_push_join_down_munion - rel = rel_push_join_down_union(v, rel); + rel = rel_push_join_down_munion(v, rel); return rel; } _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org