Changeset: d44142158174 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/d44142158174
Modified Files:
        gdk/gdk_aggr.c
Branch: Jul2021
Log Message:

Fixed group handling in grouped min and max aggregates.


diffs (104 lines):

diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -3252,12 +3252,11 @@ BATgroupsize(BAT *b, BAT *g, BAT *e, BAT
                                i = canditer_next(ci) - b->hseqbase;    \
                                if (!skip_nils ||                       \
                                    !is_##TYPE##_nil(vals[i])) {        \
-                                       oids[i] = i + b->hseqbase;      \
+                                       oids[gid++] = i + b->hseqbase;  \
                                        nils--;                         \
                                }                                       \
                        }                                               \
                } else {                                                \
-                       gid = 0; /* in case gids == NULL */             \
                        while (ncand > 0) {                             \
                                ncand--;                                \
                                i = canditer_next(ci) - b->hseqbase;    \
@@ -3288,7 +3287,7 @@ do_groupmin(oid *restrict oids, BAT *b, 
            oid min, oid max, struct canditer *restrict ci, BUN ncand,
            bool skip_nils, bool gdense)
 {
-       oid gid;
+       oid gid = 0;
        BUN i, nils;
        int t;
        const void *nil;
@@ -3341,15 +3340,16 @@ do_groupmin(oid *restrict oids, BAT *b, 
                                while (ncand > 0) {
                                        ncand--;
                                        i = canditer_next(ci);
-                                       oids[i - b->hseqbase] = i;
+                                       oids[gid++] = i;
                                        nils--;
                                }
                        } else {
                                while (ncand > 0) {
                                        ncand--;
                                        i = canditer_next(ci);
-                                       if (is_oid_nil(oids[i - b->hseqbase])) {
-                                               oids[i - b->hseqbase] = i;
+                                       gid = gids[i - b->hseqbase] - min;
+                                       if (is_oid_nil(oids[gid])) {
+                                               oids[gid] = i;
                                                nils--;
                                        }
                                }
@@ -3366,12 +3366,11 @@ do_groupmin(oid *restrict oids, BAT *b, 
                                i = canditer_next(ci) - b->hseqbase;
                                if (!skip_nils ||
                                    (*atomcmp)(BUNtail(bi, i), nil) != 0) {
-                                       oids[i] = i + b->hseqbase;
+                                       oids[gid++] = i + b->hseqbase;
                                        nils--;
                                }
                        }
                } else {
-                       gid = 0; /* in case gids == NULL */
                        while (ncand > 0) {
                                ncand--;
                                i = canditer_next(ci) - b->hseqbase;
@@ -3413,7 +3412,7 @@ do_groupmax(oid *restrict oids, BAT *b, 
            oid min, oid max, struct canditer *restrict ci, BUN ncand,
            bool skip_nils, bool gdense)
 {
-       oid gid;
+       oid gid = 0;
        BUN i, nils;
        int t;
        const void *nil;
@@ -3466,16 +3465,17 @@ do_groupmax(oid *restrict oids, BAT *b, 
                                while (ncand > 0) {
                                        ncand--;
                                        i = canditer_next(ci);
-                                       oids[i - b->hseqbase] = i;
+                                       oids[gid++] = i;
                                        nils--;
                                }
                        } else {
                                while (ncand > 0) {
                                        ncand--;
                                        i = canditer_next(ci);
-                                       if (is_oid_nil(oids[i - b->hseqbase]))
+                                       gid = gids[i - b->hseqbase] - min;
+                                       if (is_oid_nil(oids[gid]))
                                                nils--;
-                                       oids[i - b->hseqbase] = i;
+                                       oids[gid] = i;
                                }
                        }
                }
@@ -3490,12 +3490,11 @@ do_groupmax(oid *restrict oids, BAT *b, 
                                i = canditer_next(ci) - b->hseqbase;
                                if (!skip_nils ||
                                    (*atomcmp)(BUNtail(bi, i), nil) != 0) {
-                                       oids[i] = i + b->hseqbase;
+                                       oids[gid++] = i + b->hseqbase;
                                        nils--;
                                }
                        }
                } else {
-                       gid = 0; /* in case gids == NULL */
                        while (ncand > 0) {
                                ncand--;
                                i = canditer_next(ci) - b->hseqbase;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to