Changeset: 51541b42da8d for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=51541b42da8d
Modified Files:
        gdk/gdk_batop.c
Branch: Jun2016
Log Message:

During BATordered scan, record information we learn about revordered.


diffs (69 lines):

diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -839,7 +839,9 @@ BATslice(BAT *b, BUN l, BUN h)
 }
 
 /* Return whether the BAT is ordered or not.  If we don't know, invest
- * in a scan and record the results in the bat descriptor.  */
+ * in a scan and record the results in the bat descriptor.  If during
+ * the scan we happen to find evidence that the BAT is not reverse
+ * sorted, we record the location.  */
 int
 BATordered(BAT *b)
 {
@@ -866,6 +868,11 @@ BATordered(BAT *b)
                                        b->T->nosorted = p;
                                        ALGODEBUG fprintf(stderr, "#BATordered: 
fixed nosorted(" BUNFMT ") for %s#" BUNFMT " (" LLFMT " usec)\n", p, 
BATgetId(b), BATcount(b), GDKusec() - t0);
                                        goto doreturn;
+                               } else if (!b->trevsorted &&
+                                          b->T->norevsorted == 0 &&
+                                          iptr[p - 1] < iptr[p]) {
+                                       b->T->norevsorted = p;
+                                       ALGODEBUG fprintf(stderr, "#BATordered: 
fixed norevsorted(" BUNFMT ") for %s#" BUNFMT "\n", p, BATgetId(b), 
BATcount(b));
                                }
                        }
                        break;
@@ -877,22 +884,41 @@ BATordered(BAT *b)
                                        b->T->nosorted = p;
                                        ALGODEBUG fprintf(stderr, "#BATordered: 
fixed nosorted(" BUNFMT ") for %s#" BUNFMT " (" LLFMT " usec)\n", p, 
BATgetId(b), BATcount(b), GDKusec() - t0);
                                        goto doreturn;
+                               } else if (!b->trevsorted &&
+                                          b->T->norevsorted == 0 &&
+                                          lptr[p - 1] < lptr[p]) {
+                                       b->T->norevsorted = p;
+                                       ALGODEBUG fprintf(stderr, "#BATordered: 
fixed norevsorted(" BUNFMT ") for %s#" BUNFMT "\n", p, BATgetId(b), 
BATcount(b));
                                }
                        }
                        break;
                }
                default:
                        for (q = BUNlast(b), p = BUNfirst(b) + 1; p < q; p++) {
-                               if (cmpf(BUNtail(bi, p - 1), BUNtail(bi, p)) > 
0) {
+                               int c;
+                               if ((c = cmpf(BUNtail(bi, p - 1), BUNtail(bi, 
p))) > 0) {
                                        b->T->nosorted = p;
                                        ALGODEBUG fprintf(stderr, "#BATordered: 
fixed nosorted(" BUNFMT ") for %s#" BUNFMT " (" LLFMT " usec)\n", p, 
BATgetId(b), BATcount(b), GDKusec() - t0);
                                        goto doreturn;
+                               } else if (!b->trevsorted &&
+                                          b->T->norevsorted == 0 &&
+                                          c < 0) {
+                                       b->T->norevsorted = p;
+                                       ALGODEBUG fprintf(stderr, "#BATordered: 
fixed norevsorted(" BUNFMT ") for %s#" BUNFMT "\n", p, BATgetId(b), 
BATcount(b));
                                }
                        }
                        break;
                }
+               /* we only get here if we completed the scan; note
+                * that if we didn't record evidence about *reverse*
+                * sortedness, we know that the BAT is also reverse
+                * sorted */
                b->tsorted = 1;
                ALGODEBUG fprintf(stderr, "#BATordered: fixed sorted for %s#" 
BUNFMT " (" LLFMT " usec)\n", BATgetId(b), BATcount(b), GDKusec() - t0);
+               if (!b->trevsorted && b->T->norevsorted == 0) {
+                       b->trevsorted = 1;
+                       ALGODEBUG fprintf(stderr, "#BATordered: fixed revsorted 
for %s#" BUNFMT "\n", BATgetId(b), BATcount(b));
+               }
        }
   doreturn:
        MT_lock_unset(&GDKhashLock(abs(b->batCacheid)));
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to