Changeset: 8f671cadccdd for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8f671cadccdd
Modified Files:
        gdk/gdk_group.c
Branch: Feb2013
Log Message:

keep track of sortedness of the group IDs we issue


diffs (189 lines):

diff --git a/gdk/gdk_group.c b/gdk/gdk_group.c
--- a/gdk/gdk_group.c
+++ b/gdk/gdk_group.c
@@ -109,9 +109,13 @@
                                        assert(hs->link[hb] == BUN_NONE \
                                               || hs->link[hb] < hb);   \
                                        if (w[p] == w[hb]) {            \
-                                               ngrps[p - r] = ngrps[hb - r]; \
+                                               oid grp = ngrps[hb - r]; \
+                                               ngrps[p - r] = grp;     \
                                                if (histo)              \
-                                                       cnts[ngrps[hb - r]]++; \
+                                                       cnts[grp]++;    \
+                                               if (gn->tsorted &&      \
+                                                   grp != ngrp - 1)    \
+                                                       gn->tsorted = 0; \
                                                break;                  \
                                        }                               \
                                }                                       \
@@ -126,9 +130,13 @@
                                     hb = hs->link[hb]) {               \
                                        if (grps[hb - r] == grps[p - r] && \
                                            w[p] == w[hb]) {            \
-                                               ngrps[p - r] = ngrps[hb - r]; \
+                                               oid grp = ngrps[hb - r]; \
+                                               ngrps[p - r] = grp;     \
                                                if (histo)              \
-                                                       cnts[ngrps[hb - r]]++; \
+                                                       cnts[grp]++;    \
+                                               if (gn->tsorted &&      \
+                                                   grp != ngrp - 1)    \
+                                                       gn->tsorted = 0; \
                                                break;                  \
                                        }                               \
                                }                                       \
@@ -138,9 +146,13 @@
                                     hb != BUN_NONE;                    \
                                     hb = hs->link[hb]) {               \
                                        if (w[p] == w[hb]) {            \
-                                               ngrps[p - r] = ngrps[hb - r]; \
+                                               oid grp = ngrps[hb - r]; \
+                                               ngrps[p - r] = grp;     \
                                                if (histo)              \
-                                                       cnts[ngrps[hb - r]]++; \
+                                                       cnts[grp]++;    \
+                                               if (gn->tsorted &&      \
+                                                   grp != ngrp - 1)    \
+                                                       gn->tsorted = 0; \
                                                break;                  \
                                        }                               \
                                }                                       \
@@ -414,7 +426,8 @@ BATgroup_internal(BAT **groups, BAT **ex
                                                ngrps[p - r] = grp;
                                                if (histo)
                                                        cnts[grp]++;
-                                               if (grp != ngrp - 1)
+                                               if (gn->tsorted &&
+                                                   grp != ngrp - 1)
                                                        gn->tsorted = 0;
                                                break;
                                        }
@@ -449,6 +462,7 @@ BATgroup_internal(BAT **groups, BAT **ex
                                  h ? BATgetId(h) : "NULL", h ? BATcount(h) : 0,
                                  subsorted, gc ? " (g clustered)" : "");
                hs = b->T->hash;
+               gn->tsorted = 1; /* be optimistic */
                for (r = BUNfirst(b), p = r, q = r + BATcount(b); p < q; p++) {
                        v = BUNtail(bi, p);
                        /* this loop is similar, but not equal, to
@@ -474,9 +488,13 @@ BATgroup_internal(BAT **groups, BAT **ex
                                        assert(hs->link[hb] == BUN_NONE
                                               || hs->link[hb] < hb);
                                        if (cmp(v, BUNtail(bi, hb)) == 0) {
-                                               ngrps[p - r] = ngrps[hb - r];
+                                               oid grp = ngrps[hb - r];
+                                               ngrps[p - r] = grp;
                                                if (histo)
-                                                       cnts[ngrps[hb - r]]++;
+                                                       cnts[grp]++;
+                                               if (gn->tsorted &&
+                                                   grp != ngrp - 1)
+                                                       gn->tsorted = 0;
                                                break;
                                        }
                                }
@@ -488,9 +506,13 @@ BATgroup_internal(BAT **groups, BAT **ex
                                     hb = hs->link[hb]) {
                                        if (grps[hb - r] == grps[p - r] &&
                                            cmp(v, BUNtail(bi, hb)) == 0) {
-                                               ngrps[p - r] = ngrps[hb - r];
+                                               oid grp = ngrps[hb - r];
+                                               ngrps[p - r] = grp;
                                                if (histo)
-                                                       cnts[ngrps[hb - r]]++;
+                                                       cnts[grp]++;
+                                               if (gn->tsorted &&
+                                                   grp != ngrp - 1)
+                                                       gn->tsorted = 0;
                                                break;
                                        }
                                }
@@ -499,9 +521,13 @@ BATgroup_internal(BAT **groups, BAT **ex
                                     hb != BUN_NONE;
                                     hb = hs->link[hb]) {
                                        if (cmp(v, BUNtail(bi, hb)) == 0) {
-                                               ngrps[p - r] = ngrps[hb - r];
+                                               oid grp = ngrps[hb - r];
+                                               ngrps[p - r] = grp;
                                                if (histo)
-                                                       cnts[ngrps[hb - r]]++;
+                                                       cnts[grp]++;
+                                               if (gn->tsorted &&
+                                                   grp != ngrp - 1)
+                                                       gn->tsorted = 0;
                                                break;
                                        }
                                }
@@ -510,7 +536,6 @@ BATgroup_internal(BAT **groups, BAT **ex
                                GRPnotfound();
                        }
                }
-               gn->tsorted = BATcount(gn) <= 1;
        } else {
                bit gc = g && (g->tsorted || g->trevsorted);
                const char *nme;
@@ -565,6 +590,7 @@ BATgroup_internal(BAT **groups, BAT **ex
                        goto error;
                }
 
+               gn->tsorted = 1; /* be optimistic */
                switch (ATOMstorage(hs->type)) {
                case TYPE_bte:
                        GRPhashloop(bte);
@@ -595,9 +621,13 @@ BATgroup_internal(BAT **groups, BAT **ex
                                                assert(hs->link[hb] == BUN_NONE
                                                       || hs->link[hb] < hb);
                                                if (cmp(v, BUNtail(bi, hb)) == 
0) {
-                                                       ngrps[p - r] = ngrps[hb 
- r];
+                                                       oid grp = ngrps[hb - r];
+                                                       ngrps[p - r] = grp;
                                                        if (histo)
-                                                               cnts[ngrps[hb - 
r]]++;
+                                                               cnts[grp]++;
+                                                       if (gn->tsorted &&
+                                                           grp != ngrp - 1)
+                                                               gn->tsorted = 0;
                                                        break;
                                                }
                                        }
@@ -612,9 +642,13 @@ BATgroup_internal(BAT **groups, BAT **ex
                                             hb = hs->link[hb]) {
                                                if (grps[hb - r] == grps[p - r] 
&&
                                                    cmp(v, BUNtail(bi, hb)) == 
0) {
-                                                       ngrps[p - r] = ngrps[hb 
- r];
+                                                       oid grp = ngrps[hb - r];
+                                                       ngrps[p - r] = grp;
                                                        if (histo)
-                                                               cnts[ngrps[hb - 
r]]++;
+                                                               cnts[grp]++;
+                                                       if (gn->tsorted &&
+                                                           grp != ngrp - 1)
+                                                               gn->tsorted = 0;
                                                        break;
                                                }
                                        }
@@ -624,9 +658,13 @@ BATgroup_internal(BAT **groups, BAT **ex
                                             hb != BUN_NONE;
                                             hb = hs->link[hb]) {
                                                if (cmp(v, BUNtail(bi, hb)) == 
0) {
-                                                       ngrps[p - r] = ngrps[hb 
- r];
+                                                       oid grp = ngrps[hb - r];
+                                                       ngrps[p - r] = grp;
                                                        if (histo)
-                                                               cnts[ngrps[hb - 
r]]++;
+                                                               cnts[grp]++;
+                                                       if (gn->tsorted &&
+                                                           grp != ngrp - 1)
+                                                               gn->tsorted = 0;
                                                        break;
                                                }
                                        }
@@ -646,7 +684,6 @@ BATgroup_internal(BAT **groups, BAT **ex
                GDKfree(hp);
                GDKfree(hs);
                GDKfree(ext);
-               gn->tsorted = BATcount(gn) <= 1;
        }
        if (extents) {
                BATsetcount(en, (BUN) ngrp);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to