Changeset: c3724f77cb63 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c3724f77cb63
Modified Files:
        gdk/gdk_bat.c
        gdk/gdk_search.c
Branch: default
Log Message:

Implemented binary search on reverse-ordered BATs.


diffs (149 lines):

diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -1763,8 +1763,8 @@ BUNfnd(BAT *b, const void *v)
                return r;
        }
        if (!b->H->hash) {
-               if (BAThordered(b))
-                       return (BUN) SORTfnd(b, v);
+               if (BAThordered(b) || BAThrevordered(b))
+                       return SORTfnd(b, v);
        }
        switch (ATOMstorage(b->htype)) {
        case TYPE_bte:
@@ -1861,11 +1861,11 @@ BUNlocate(BAT *b, const void *x, const v
        }
 
        /* next, try to restrict the range using sorted columns */
-       if (BATtordered(b)) {
+       if (BATtordered(b) || BATtrevordered(b)) {
                p = SORTfndfirst(b, y);
                q = SORTfndlast(b, y);
        }
-       if (BAThordered(b)) {
+       if (BAThordered(b) || BAThrevordered(b)) {
                BUN mp = SORTfndfirst(BATmirror(b), x);
                BUN mq = SORTfndlast(BATmirror(b), x);
 
diff --git a/gdk/gdk_search.c b/gdk/gdk_search.c
--- a/gdk/gdk_search.c
+++ b/gdk/gdk_search.c
@@ -456,23 +456,23 @@ SORTfndwhich(BAT *b, const void *v, int 
        BATiter bi = bat_iterator(b);
        BUN diff, end;
 
-       if (b == NULL || !b->tsorted)
+       if (b == NULL || (!b->tsorted && !b->trevsorted))
                return BUN_NONE;
 
        if (which < 0) {
                end = lo;
-               if (lo >= hi || atom_GE(BUNtail(bi, lo), v, b->ttype)) {
+               if (lo >= hi || (b->tsorted ? atom_GE(BUNtail(bi, lo), v, 
b->ttype) : atom_LE(BUNtail(bi, lo), v, b->ttype))) {
                        /* shortcut: if BAT is empty or first (and
-                        * hence all) tail value is >= v, we're
-                        * done */
+                        * hence all) tail value is >= v (if sorted)
+                        * or <= v (if revsorted), we're done */
                        return lo;
                }
        } else if (which > 0) {
                end = hi;
-               if (lo >= hi || atom_LE(BUNtail(bi, hi - 1), v, b->ttype)) {
-                       /* shortcut: if BAT is empty or last (and
-                        * hence all) tail value is <= v, we're
-                        * done */
+               if (lo >= hi || (b->tsorted ? atom_LE(BUNtail(bi, hi - 1), v, 
b->ttype) : atom_GE(BUNtail(bi, hi - 1), v, b->ttype))) {
+                       /* shortcut: if BAT is empty or first (and
+                        * hence all) tail value is <= v (if sorted)
+                        * or >= v (if revsorted), we're done */
                        return hi;
                }
        } else {
@@ -483,31 +483,60 @@ SORTfndwhich(BAT *b, const void *v, int 
                }
        }
 
-       switch (ATOMstorage(b->ttype)) {
-       case TYPE_bte:
-               SORTfndloop(bte, simple_CMP, BUNtloc);
-               break;
-       case TYPE_sht:
-               SORTfndloop(sht, simple_CMP, BUNtloc);
-               break;
-       case TYPE_int:
-               SORTfndloop(int, simple_CMP, BUNtloc);
-               break;
-       case TYPE_lng:
-               SORTfndloop(lng, simple_CMP, BUNtloc);
-               break;
-       case TYPE_flt:
-               SORTfndloop(flt, simple_CMP, BUNtloc);
-               break;
-       case TYPE_dbl:
-               SORTfndloop(dbl, simple_CMP, BUNtloc);
-               break;
-       default:
-               if (b->tvarsized)
-                       SORTfndloop(b->ttype, atom_CMP, BUNtvar);
-               else
-                       SORTfndloop(b->ttype, atom_CMP, BUNtloc);
-               break;
+       if (b->tsorted) {
+               switch (ATOMstorage(b->ttype)) {
+               case TYPE_bte:
+                       SORTfndloop(bte, simple_CMP, BUNtloc);
+                       break;
+               case TYPE_sht:
+                       SORTfndloop(sht, simple_CMP, BUNtloc);
+                       break;
+               case TYPE_int:
+                       SORTfndloop(int, simple_CMP, BUNtloc);
+                       break;
+               case TYPE_lng:
+                       SORTfndloop(lng, simple_CMP, BUNtloc);
+                       break;
+               case TYPE_flt:
+                       SORTfndloop(flt, simple_CMP, BUNtloc);
+                       break;
+               case TYPE_dbl:
+                       SORTfndloop(dbl, simple_CMP, BUNtloc);
+                       break;
+               default:
+                       if (b->tvarsized)
+                               SORTfndloop(b->ttype, atom_CMP, BUNtvar);
+                       else
+                               SORTfndloop(b->ttype, atom_CMP, BUNtloc);
+                       break;
+               }
+       } else {
+               switch (ATOMstorage(b->ttype)) {
+               case TYPE_bte:
+                       SORTfndloop(bte, -simple_CMP, BUNtloc);
+                       break;
+               case TYPE_sht:
+                       SORTfndloop(sht, -simple_CMP, BUNtloc);
+                       break;
+               case TYPE_int:
+                       SORTfndloop(int, -simple_CMP, BUNtloc);
+                       break;
+               case TYPE_lng:
+                       SORTfndloop(lng, -simple_CMP, BUNtloc);
+                       break;
+               case TYPE_flt:
+                       SORTfndloop(flt, -simple_CMP, BUNtloc);
+                       break;
+               case TYPE_dbl:
+                       SORTfndloop(dbl, -simple_CMP, BUNtloc);
+                       break;
+               default:
+                       if (b->tvarsized)
+                               SORTfndloop(b->ttype, -atom_CMP, BUNtvar);
+                       else
+                               SORTfndloop(b->ttype, -atom_CMP, BUNtloc);
+                       break;
+               }
        }
 
        if (which < 0) {
_______________________________________________
Checkin-list mailing list
Checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to