Changeset: 7b1e29ae11c7 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7b1e29ae11c7
Modified Files:
gdk/gdk_aggr.c
Branch: Jul2017
Log Message:
Since we now store the max group ID, use it for aggregates.
diffs (80 lines):
diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -84,38 +84,46 @@ BATgroupaggrinit(BAT *b, BAT *g, BAT *e,
ngrp = 1;
} else if (e == NULL) {
/* we need to find out the min and max of g */
- min = oid_nil; /* note that oid_nil > 0! (unsigned) */
- max = 0;
- if (BATtdense(g)) {
- min = g->tseqbase;
- max = g->tseqbase + BATcount(g) - 1;
- } else if (g->tsorted) {
- gids = (const oid *) Tloc(g, 0);
- /* find first non-nil */
- for (i = 0, ngrp = BATcount(g); i < ngrp; i++, gids++) {
- if (*gids != oid_nil) {
- min = *gids;
- break;
+ PROPrec *prop;
+
+ prop = BATgetprop(g, GDK_MAX_VALUE);
+ if (prop) {
+ min = 0; /* just assume it starts at 0 */
+ max = prop->v.val.oval;
+ } else {
+ min = oid_nil; /* note that oid_nil > 0! (unsigned) */
+ max = 0;
+ if (BATtdense(g)) {
+ min = g->tseqbase;
+ max = g->tseqbase + BATcount(g) - 1;
+ } else if (g->tsorted) {
+ gids = (const oid *) Tloc(g, 0);
+ /* find first non-nil */
+ for (i = 0, ngrp = BATcount(g); i < ngrp; i++,
gids++) {
+ if (*gids != oid_nil) {
+ min = *gids;
+ break;
+ }
}
+ if (min != oid_nil) {
+ /* found a non-nil, max must be last
+ * value (and there is one!) */
+ max = * (const oid *) Tloc(g,
BUNlast(g) - 1);
+ }
+ } else {
+ /* we'll do a complete scan */
+ gids = (const oid *) Tloc(g, 0);
+ for (i = 0, ngrp = BATcount(g); i < ngrp; i++,
gids++) {
+ if (*gids != oid_nil) {
+ if (*gids < min)
+ min = *gids;
+ if (*gids > max)
+ max = *gids;
+ }
+ }
+ /* note: max < min is possible if all groups
+ * are nil (or BATcount(g)==0) */
}
- if (min != oid_nil) {
- /* found a non-nil, max must be last
- * value (and there is one!) */
- max = * (const oid *) Tloc(g, BUNlast(g) - 1);
- }
- } else {
- /* we'll do a complete scan */
- gids = (const oid *) Tloc(g, 0);
- for (i = 0, ngrp = BATcount(g); i < ngrp; i++, gids++) {
- if (*gids != oid_nil) {
- if (*gids < min)
- min = *gids;
- if (*gids > max)
- max = *gids;
- }
- }
- /* note: max < min is possible if all groups
- * are nil (or BATcount(g)==0) */
}
ngrp = max < min ? 0 : max - min + 1;
} else {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list