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

Reply via email to