Changeset: f1c125e8dec2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/f1c125e8dec2
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/server/rel_optimize_sel.c
Branch: ordered-set-aggregates
Log Message:

only run the grouped topn when needed and don't run normal topn after 
groupedtopn


diffs (63 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -4470,7 +4470,7 @@ rel2bin_project(backend *be, sql_rel *re
                        sql_exp *gbe = n->data;
                        bool last = (!n->next || 
!is_partitioning((sql_exp*)n->next->data));
 
-                       if (!is_partitioning(gbe))
+                       if (!topn->grouped || !is_partitioning(gbe))
                                break;
                        /* create group by */
                        stmt *gbcol = exp_bin(be, gbe, sub, NULL, NULL, NULL, 
NULL, NULL, 0, 0, 0);
@@ -4779,6 +4779,17 @@ rel2bin_groupby(backend *be, sql_rel *re
        return cursub;
 }
 
+static bool
+has_partitioning( list *exps )
+{
+       for(node *n = exps->h; n; n = n->next){
+               sql_exp *gbe = n->data;
+               if (is_partitioning(gbe))
+                       return true;
+       }
+       return false;
+}
+
 static stmt *
 rel2bin_topn(backend *be, sql_rel *rel, list *refs)
 {
@@ -4797,6 +4808,8 @@ rel2bin_topn(backend *be, sql_rel *rel, 
                                        sub = rel2bin_project(be, rl, refs, 
rel);
                        } else
                                sub = rel2bin_project(be, rl, refs, rel);
+                       if (rl->grouped && rl->r && has_partitioning(rl->r))
+                               return sub;
                } else {
                        sub = subrel_bin(be, rl, refs);
                }
diff --git a/sql/server/rel_optimize_sel.c b/sql/server/rel_optimize_sel.c
--- a/sql/server/rel_optimize_sel.c
+++ b/sql/server/rel_optimize_sel.c
@@ -3834,15 +3834,18 @@ rel_push_select_down(visitor *v, sql_rel
                                                        sql_subfunc *rankf = 
ranke->f;
                                                        if (rankf->func->type 
== F_ANALYTIC) { /* rank functions cannot have a frame */
                                                                // For now only 
for rank/row_number without partition by
+                                                               sql_rel *tn = 
NULL;
                                                                if 
(strcmp(rankf->func->base.name, "rank") == 0 && is_simple_project(pl->op) && 
pl->r /* &&
                                                                                
!rank_exp_has_partition_key(ranke)*/) {
-                                                                       r->l = 
rel_topn(v->sql->sa, r->l, append(sa_list(v->sql->sa), e->r));
+                                                                       tn = 
r->l = rel_topn(v->sql->sa, r->l, append(sa_list(v->sql->sa), e->r));
+                                                                       
tn->grouped = 1;
                                                                        
v->changes++;
                                                                        break;
                                                                }
                                                                if 
(strcmp(rankf->func->base.name, "row_number") == 0 && list_empty(r->r) && 
!is_topn(pl->op) /*&&
                                                                                
!rank_exp_has_partition_key(ranke)*/) {
-                                                                       r->l = 
rel_topn(v->sql->sa, r->l, append(sa_list(v->sql->sa), e->r));
+                                                                       tn = 
r->l = rel_topn(v->sql->sa, r->l, append(sa_list(v->sql->sa), e->r));
+                                                                       
tn->grouped = 1;
                                                                        
v->changes++;
                                                                        break;
                                                                }
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to