Changeset: d9fa0e9bf2d0 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d9fa0e9bf2d0 Modified Files: gdk/gdk_aggr.c Branch: Feb2013 Log Message:
Fixing aggregates: if there is a candidate list, loop through it, not
everything.
diffs (truncated from 803 to 300 lines):
diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -119,14 +119,13 @@ BATgroupaggrinit(const BAT *b, const BAT
} else {
/* we'll do a complete scan */
gids = (const oid *) Tloc(g, BUNfirst(g));
- for (i = 0, ngrp = BATcount(g); i < ngrp; i++) {
+ for (i = 0, ngrp = BATcount(g); i < ngrp; i++, gids++) {
if (*gids != oid_nil) {
if (*gids < min)
min = *gids;
if (*gids > max)
max = *gids;
}
- gids++;
}
/* note: max < min is possible if all groups
* are nil (or BATcount(g)==0) */
@@ -168,8 +167,8 @@ BATgroupaggrinit(const BAT *b, const BAT
sum = 0; \
if (nonil) { \
*seen = start < end; \
- for (i = start; i < end && nils == 0; i++,
vals++) { \
- x = *vals; \
+ for (i = start; i < end && nils == 0; i++) { \
+ x = vals[i]; \
ADD_WITH_CHECK(TYPE1, x, \
TYPE2, sum, \
TYPE2, sum, \
@@ -177,8 +176,8 @@ BATgroupaggrinit(const BAT *b, const BAT
} \
} else { \
int seenval = 0; \
- for (i = start; i < end && nils == 0; i++,
vals++) { \
- x = *vals; \
+ for (i = start; i < end && nils == 0; i++) { \
+ x = vals[i]; \
if (x == TYPE1##_nil) { \
if (!skip_nils) { \
sum = TYPE2##_nil; \
@@ -205,14 +204,11 @@ BATgroupaggrinit(const BAT *b, const BAT
"\n", \
func, start, end); \
sum = 0; \
- for (i = start; i < end && nils == 0; i++, vals++) { \
- if (i < *cand - seqb) { \
- continue; \
- } \
- assert(i == *cand - seqb); \
- if (++cand == candend) \
- end = i + 1; \
- x = *vals; \
+ while (cand < candend) { \
+ i = *cand++ - seqb; \
+ if (i >= end) \
+ break; \
+ x = vals[i]; \
if (x == TYPE1##_nil) { \
if (!skip_nils) { \
sum = TYPE2##_nil; \
@@ -234,16 +230,16 @@ BATgroupaggrinit(const BAT *b, const BAT
"start " BUNFMT ", end " BUNFMT \
"\n", \
func, start, end); \
- for (i = start; i < end; i++, vals++) { \
+ for (i = start; i < end; i++) { \
if (gids == NULL || \
- (*gids >= min && *gids <= max)) { \
- gid = gids ? *gids - min : (oid) i; \
+ (gids[i] >= min && gids[i] <= max)) { \
+ gid = gids ? gids[i] - min : (oid) i; \
if (nil_if_empty && \
!(seen[gid >> 5] & (1 << (gid &
0x1F)))) { \
seen[gid >> 5] |= 1 << (gid &
0x1F); \
sums[gid] = 0; \
} \
- x = *vals; \
+ x = vals[i]; \
if (x == TYPE1##_nil) { \
if (!skip_nils) { \
sums[gid] =
TYPE2##_nil; \
@@ -251,38 +247,33 @@ BATgroupaggrinit(const BAT *b, const BAT
} \
} else if (sums[gid] != TYPE2##_nil) { \
ADD_WITH_CHECK(TYPE1, x, \
- TYPE2,
sums[gid], \
- TYPE2,
sums[gid], \
+ TYPE2, \
+ sums[gid], \
+ TYPE2, \
+ sums[gid], \
goto overflow); \
} \
} \
- if (gids) \
- gids++; \
} \
} else { \
ALGODEBUG fprintf(stderr, \
- "#%s: with candidates, with groups; "
\
- "start " BUNFMT ", end " BUNFMT \
- "\n", \
+ "#%s: with candidates, with " \
+ "groups; start " BUNFMT ", " \
+ "end " BUNFMT "\n", \
func, start, end); \
- for (i = start; i < end; i++, vals++) { \
- if (i < *cand - seqb) { \
- if (gids) \
- gids++; \
- continue; \
- } \
- assert(i == *cand - seqb); \
- if (++cand == candend) \
- end = i + 1; \
+ while (cand < candend) { \
+ i = *cand++ - seqb; \
+ if (i >= end) \
+ break; \
if (gids == NULL || \
- (*gids >= min && *gids <= max)) { \
- gid = gids ? *gids - min : (oid) i; \
+ (gids[i] >= min && gids[i] <= max)) {
\
+ gid = gids ? gids[i] - min : (oid) i; \
if (nil_if_empty && \
!(seen[gid >> 5] & (1 << (gid &
0x1F)))) { \
seen[gid >> 5] |= 1 << (gid &
0x1F); \
sums[gid] = 0; \
} \
- x = *vals; \
+ x = vals[i]; \
if (x == TYPE1##_nil) { \
if (!skip_nils) { \
sums[gid] =
TYPE2##_nil; \
@@ -290,13 +281,13 @@ BATgroupaggrinit(const BAT *b, const BAT
} \
} else if (sums[gid] != TYPE2##_nil) { \
ADD_WITH_CHECK(TYPE1, x, \
- TYPE2,
sums[gid], \
- TYPE2,
sums[gid], \
+ TYPE2, \
+ sums[gid], \
+ TYPE2, \
+ sums[gid], \
goto overflow); \
} \
} \
- if (gids) \
- gids++; \
} \
} \
} while (0)
@@ -622,123 +613,141 @@ BATsum(void *res, int tp, BAT *b, BAT *s
#define AGGR_PROD(TYPE1, TYPE2, TYPE3) \
do { \
const TYPE1 *vals = (const TYPE1 *) values; \
- for (i = start; i < end; i++, vals++) { \
+ assert(gidincr == 0 || gidincr == 1); \
+ gid = 0; /* doesn't change if gidincr == 0 */ \
+ for (;;) { \
if (cand) { \
- if (i < *cand - seqb) { \
- if (gids) \
- gids += gidincr; \
- continue; \
- } \
- assert(i == *cand - seqb); \
- if (++cand == candend) \
- end = i + 1; \
+ if (cand == candend) \
+ break; \
+ i = *cand++ - seqb; \
+ if (i >= end) \
+ break; \
+ } else { \
+ i = start++; \
+ if (i == end) \
+ break; \
} \
if (gids == NULL || gidincr == 0 || \
- (*gids >= min && *gids <= max)) { \
- gid = gids ? *gids - min : (oid) i; \
+ (gids[i] >= min && gids[i] <= max)) { \
+ if (gidincr) { \
+ if (gids) \
+ gid = gids[i] - min; \
+ else \
+ gid = (oid) i; \
+ } \
if (nil_if_empty && \
!(seen[gid >> 5] & (1 << (gid & 0x1F)))) { \
seen[gid >> 5] |= 1 << (gid & 0x1F); \
prods[gid] = 1; \
} \
- if (*vals == TYPE1##_nil) { \
+ if (vals[i] == TYPE1##_nil) { \
if (!skip_nils) { \
prods[gid] = TYPE2##_nil; \
nils++; \
} \
} else if (prods[gid] != TYPE2##_nil) { \
- MUL4_WITH_CHECK(TYPE1, *vals, \
+ MUL4_WITH_CHECK(TYPE1, vals[i], \
TYPE2, prods[gid], \
TYPE2, prods[gid], \
TYPE3, \
goto overflow); \
} \
} \
- if (gids) \
- gids += gidincr; \
} \
} while (0)
#define AGGR_PROD_LNG(TYPE) \
do { \
const TYPE *vals = (const TYPE *) values; \
- for (i = start; i < end; i++, vals++) { \
+ assert(gidincr == 0 || gidincr == 1); \
+ gid = 0; /* doesn't change if gidincr == 0 */ \
+ for (;;) { \
if (cand) { \
- if (i < *cand - seqb) { \
- if (gids) \
- gids += gidincr; \
- continue; \
- } \
- assert(i == *cand - seqb); \
- if (++cand == candend) \
- end = i + 1; \
+ if (cand == candend) \
+ break; \
+ i = *cand++ - seqb; \
+ if (i >= end) \
+ break; \
+ } else { \
+ i = start++; \
+ if (i == end) \
+ break; \
} \
if (gids == NULL || gidincr == 0 || \
- (*gids >= min && *gids <= max)) { \
- gid = gids ? *gids - min : (oid) i; \
+ (gids[i] >= min && gids[i] <= max)) { \
+ if (gidincr) { \
+ if (gids) \
+ gid = gids[i] - min; \
+ else \
+ gid = (oid) i; \
+ } \
if (nil_if_empty && \
!(seen[gid >> 5] & (1 << (gid & 0x1F)))) { \
seen[gid >> 5] |= 1 << (gid & 0x1F); \
prods[gid] = 1; \
} \
- if (*vals == TYPE##_nil) { \
+ if (vals[i] == TYPE##_nil) { \
if (!skip_nils) { \
prods[gid] = lng_nil; \
nils++; \
} \
} else if (prods[gid] != lng_nil) { \
- LNGMUL_CHECK(TYPE, *vals, \
+ LNGMUL_CHECK(TYPE, vals[i], \
lng, prods[gid], \
prods[gid], \
goto overflow); \
} \
} \
- if (gids) \
- gids += gidincr; \
} \
} while (0)
#define AGGR_PROD_FLOAT(TYPE1, TYPE2) \
do { \
const TYPE1 *vals = (const TYPE1 *) values; \
- for (i = start; i < end; i++, vals++) { \
+ assert(gidincr == 0 || gidincr == 1); \
+ gid = 0; /* doesn't change if gidincr == 0 */ \
+ for (;;) { \
if (cand) { \
- if (i < *cand - seqb) { \
- if (gids) \
- gids += gidincr; \
- continue; \
- } \
- assert(i == *cand - seqb); \
- if (++cand == candend) \
- end = i + 1; \
+ if (cand == candend) \
+ break; \
+ i = *cand++ - seqb; \
+ if (i >= end) \
+ break; \
+ } else { \
+ i = start++; \
+ if (i == end) \
+ break; \
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list
