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