Changeset: 9ad313a513b8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9ad313a513b8
Modified Files:
        gdk/gdk_group.c
Branch: Jul2017
Log Message:

Store maximum group number as BAT property.


diffs (61 lines):

diff --git a/gdk/gdk_group.c b/gdk/gdk_group.c
--- a/gdk/gdk_group.c
+++ b/gdk/gdk_group.c
@@ -560,6 +560,8 @@ BATgroup_internal(BAT **groups, BAT **ex
 #endif
        BUN start, end, cnt;
        const oid *restrict cand, *candend;
+       oid maxgrp = 0;         /* maximum value of g BAT (if subgrouping) */
+       PROPrec *prop;
 
        if (b == NULL) {
                GDKerror("BATgroup: b must exist\n");
@@ -635,6 +637,19 @@ BATgroup_internal(BAT **groups, BAT **ex
                }
                return GDK_SUCCEED;
        }
+       if (g) {
+               if (BATtdense(g))
+                       maxgrp = g->tseqbase + BATcount(g);
+               else if (BATtordered(g))
+                       maxgrp = * (oid *) Tloc(g, BATcount(g) - 1);
+               else {
+                       prop = BATgetprop(g, GDK_MAX_VALUE);
+                       if (prop)
+                               maxgrp = prop->v.val.oval;
+                       else
+                               BATmax(g, &maxgrp);
+               }
+       }
        if (BATordered(b) && BATordered_rev(b)) {
                /* all values are equal */
                if (g == NULL || (BATordered(g) && BATordered_rev(g))) {
@@ -696,6 +711,10 @@ BATgroup_internal(BAT **groups, BAT **ex
                        gn = COLcopy(g, g->ttype, 0, TRANSIENT);
                        if (gn == NULL)
                                goto error;
+                       prop = BATgetprop(g, GDK_MAX_VALUE);
+                       if (prop)
+                               BATsetprop(gn, GDK_MAX_VALUE, TYPE_oid, 
&maxgrp);
+
                        *groups = gn;
                        if (extents) {
                                en = COLcopy(e, e->ttype, 0, TRANSIENT);
@@ -720,6 +739,8 @@ BATgroup_internal(BAT **groups, BAT **ex
                goto error;
        ngrps = (oid *) Tloc(gn, 0);
        maxgrps = cnt / 10;
+       if (maxgrps < maxgrp)
+               maxgrps += maxgrp;
        if (e && maxgrps < BATcount(e))
                maxgrps += BATcount(e);
        if (h && maxgrps < BATcount(h))
@@ -1165,6 +1186,8 @@ BATgroup_internal(BAT **groups, BAT **ex
        gn->trevsorted = ngrp == 1 || BATcount(gn) <= 1;
        gn->tnonil = 1;
        gn->tnil = 0;
+       ngrp--;      /* max value is one less than number of values */
+       BATsetprop(gn, GDK_MAX_VALUE, TYPE_oid, &ngrp);
        *groups = gn;
        return GDK_SUCCEED;
   error:
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to