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

Reply via email to