Changeset: f542238ce706 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/f542238ce706
Modified Files:
        gdk/gdk_batop.c
Branch: Sep2022
Log Message:

Propagate sortedness info to parent bat.


diffs (154 lines):

diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -1932,17 +1932,17 @@ BATslice(BAT *b, BUN l, BUN h)
                        int cmp = prevnil ? -!(prevnil = is_##TPE##_nil(next)) 
: (prevnil = is_##TPE##_nil(next)) ? 1 : (prev > next) - (prev < next); \
                        prev = next;                                    \
                        if (cmp > 0) {                                  \
-                               b->tnosorted = p;                       \
+                               b->tnosorted = bi.nosorted = p;         \
                                TRC_DEBUG(ALGO, "Fixed nosorted(" BUNFMT ") for 
" ALGOBATFMT " (" LLFMT " usec)\n", p, ALGOBATPAR(b), GDKusec() - t0); \
                                goto doreturn;                          \
                        } else if (cmp < 0) {                           \
                                if (!b->trevsorted && b->tnorevsorted == 0) { \
-                                       b->tnorevsorted = p;            \
+                                       b->tnorevsorted = bi.norevsorted = p; \
                                        TRC_DEBUG(ALGO, "Fixed norevsorted(" 
BUNFMT ") for " ALGOBATFMT "\n", p, ALGOBATPAR(b)); \
                                }                                       \
                        } else if (!b->tkey && b->tnokey[1] == 0) {     \
-                               b->tnokey[0] = p - 1;                   \
-                               b->tnokey[1] = p;                       \
+                               b->tnokey[0] = bi.nokey[0] = p - 1;     \
+                               b->tnokey[1] = bi.nokey[1] = p;         \
                                TRC_DEBUG(ALGO, "Fixed nokey(" BUNFMT "," 
BUNFMT") for " ALGOBATFMT "\n", p - 1, p, ALGOBATPAR(b)); \
                        }                                               \
                }                                                       \
@@ -2019,19 +2019,19 @@ BATordered(BAT *b)
                                else
                                        c = strcmp(p1, p2);
                                if (c > 0) {
-                                       b->tnosorted = p;
+                                       b->tnosorted = bi.nosorted = p;
                                        TRC_DEBUG(ALGO, "Fixed nosorted(" 
BUNFMT ") for " ALGOBATFMT " (" LLFMT " usec)\n", p, ALGOBATPAR(b), GDKusec() - 
t0);
                                        goto doreturn;
                                } else if (c < 0) {
                                        assert(!b->trevsorted);
                                        if (b->tnorevsorted == 0) {
-                                               b->tnorevsorted = p;
+                                               b->tnorevsorted = 
bi.norevsorted = p;
                                                TRC_DEBUG(ALGO, "Fixed 
norevsorted(" BUNFMT ") for " ALGOBATFMT "\n", p, ALGOBATPAR(b));
                                        }
                                } else if (b->tnokey[1] == 0) {
                                        assert(!b->tkey);
-                                       b->tnokey[0] = p - 1;
-                                       b->tnokey[1] = p;
+                                       b->tnokey[0] = bi.nokey[0] = p - 1;
+                                       b->tnokey[1] = bi.nokey[1] = p;
                                        TRC_DEBUG(ALGO, "Fixed nokey(" BUNFMT 
"," BUNFMT") for " ALGOBATFMT "\n", p - 1, p, ALGOBATPAR(b));
                                }
                        }
@@ -2041,17 +2041,17 @@ BATordered(BAT *b)
                        for (BUN q = BATcount(b), p = 1; p < q; p++) {
                                int c;
                                if ((c = cmpf(BUNtail(bi, p - 1), BUNtail(bi, 
p))) > 0) {
-                                       b->tnosorted = p;
+                                       b->tnosorted = bi.nosorted = p;
                                        TRC_DEBUG(ALGO, "Fixed nosorted(" 
BUNFMT ") for " ALGOBATFMT " (" LLFMT " usec)\n", p, ALGOBATPAR(b), GDKusec() - 
t0);
                                        goto doreturn;
                                } else if (c < 0) {
                                        if (!b->trevsorted && b->tnorevsorted 
== 0) {
-                                               b->tnorevsorted = p;
+                                               b->tnorevsorted = 
bi.norevsorted = p;
                                                TRC_DEBUG(ALGO, "Fixed 
norevsorted(" BUNFMT ") for " ALGOBATFMT "\n", p, ALGOBATPAR(b));
                                        }
                                } else if (!b->tkey && b->tnokey[1] == 0) {
-                                       b->tnokey[0] = p - 1;
-                                       b->tnokey[1] = p;
+                                       b->tnokey[0] = bi.nokey[0] = p - 1;
+                                       b->tnokey[1] = bi.nokey[1] = p;
                                        TRC_DEBUG(ALGO, "Fixed nokey(" BUNFMT 
"," BUNFMT") for " ALGOBATFMT "\n", p - 1, p, ALGOBATPAR(b));
                                }
                        }
@@ -2063,20 +2063,42 @@ BATordered(BAT *b)
                 * sortedness, we know that the BAT is also reverse
                 * sorted; similarly, if we didn't record evidence about
                 * keyness, we know the BAT is key */
-               b->tsorted = true;
+               b->tsorted = bi.sorted = true;
                TRC_DEBUG(ALGO, "Fixed sorted for " ALGOBATFMT " (" LLFMT " 
usec)\n", ALGOBATPAR(b), GDKusec() - t0);
                if (!b->trevsorted && b->tnorevsorted == 0) {
-                       b->trevsorted = true;
+                       b->trevsorted = bi.revsorted = true;
                        TRC_DEBUG(ALGO, "Fixed revsorted for " ALGOBATFMT "\n", 
ALGOBATPAR(b));
                }
                if (!b->tkey && b->tnokey[1] == 0) {
-                       b->tkey = true;
+                       b->tkey = bi.key = true;
                        TRC_DEBUG(ALGO, "Fixed key for " ALGOBATFMT "\n", 
ALGOBATPAR(b));
                }
        }
   doreturn:
        sorted = b->tsorted;
+       bat pbid = VIEWtparent(b);
        MT_lock_unset(&b->theaplock);
+       if (pbid) {
+               BAT *pb = BBP_cache(pbid);
+               MT_lock_set(&pb->theaplock);
+               if (bi.count == BATcount(pb) &&
+                   bi.h == pb->theap &&
+                   bi.type == pb->ttype) {
+                       /* add to knowledge in parent bat */
+                       pb->tsorted |= bi.sorted;
+                       if (pb->tnosorted == 0)
+                               pb->tnosorted = bi.nosorted;
+                       pb->trevsorted |= bi.revsorted;
+                       if (pb->tnorevsorted == 0)
+                               pb->tnorevsorted = bi.norevsorted;
+                       pb->tkey |= bi.key;
+                       if (pb->tnokey[1] == 0) {
+                               pb->tnokey[0] = bi.nokey[0];
+                               pb->tnokey[1] = bi.nokey[1];
+                       }
+               }
+               MT_lock_unset(&pb->theaplock);
+       }
        return sorted;
 }
 
@@ -2099,7 +2121,7 @@ BATordered(BAT *b)
                        TPE prev = vals[p - 1], next = vals[p];         \
                        int cmp = is_flt_nil(prev) ? -!is_flt_nil(next) : 
is_flt_nil(next) ? 1 : (prev > next) - (prev < next); \
                        if (cmp < 0) {                                  \
-                               b->tnorevsorted = p;                    \
+                               b->tnorevsorted = bi.norevsorted = p;   \
                                TRC_DEBUG(ALGO, "Fixed norevsorted(" BUNFMT ") 
for " ALGOBATFMT " (" LLFMT " usec)\n", p, ALGOBATPAR(b), GDKusec() - t0); \
                                goto doreturn;                          \
                        }                                               \
@@ -2168,12 +2190,26 @@ BATordered_rev(BAT *b)
                        break;
                }
                }
-               b->trevsorted = true;
+               b->trevsorted = bi.revsorted = true;
                TRC_DEBUG(ALGO, "Fixed revsorted for " ALGOBATFMT " (" LLFMT " 
usec)\n", ALGOBATPAR(b), GDKusec() - t0);
        }
   doreturn:
        revsorted = b->trevsorted;
+       bat pbid = VIEWtparent(b);
        MT_lock_unset(&b->theaplock);
+       if (pbid) {
+               BAT *pb = BBP_cache(pbid);
+               MT_lock_set(&pb->theaplock);
+               if (bi.count == BATcount(pb) &&
+                   bi.h == pb->theap &&
+                   bi.type == pb->ttype) {
+                       /* add to knowledge in parent bat */
+                       pb->trevsorted |= bi.revsorted;
+                       if (pb->tnorevsorted == 0)
+                               pb->tnorevsorted = bi.norevsorted;
+               }
+               MT_lock_unset(&pb->theaplock);
+       }
        return revsorted;
 }
 
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to