Changeset: caa27e234528 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=caa27e234528
Modified Files:
        gdk/gdk_select.c
Branch: Oct2014
Log Message:

Cleanup: get rid of too generic BATslice2.


diffs (185 lines):

diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -86,54 +86,70 @@ newempty(const char *func)
 }
 
 static BAT *
-BATslice2(BAT *b, BUN l1, BUN h1, BUN l2, BUN h2)
+doublerange(oid l1, oid h1, oid l2, oid h2)
 {
-       BUN p, q;
        BAT *bn;
-       BATiter bi = bat_iterator(b);
+       oid *p;
 
-       BATcheck(b, "BATslice");
-       if (h2 > BATcount(b))
-               h2 = BATcount(b);
-       if (h1 < l1)
-               h1 = l1;
-       if (h2 < l2)
-               h2 = l2;
-       l1 += BUNfirst(b);
-       l2 += BUNfirst(b);
-       h1 += BUNfirst(b);
-       h2 += BUNfirst(b);
+       assert(l1 <= h1);
+       assert(l2 <= h2);
+       assert(h1 <= l2);
+       if (l1 == h1 || l2 == h2) {
+               bn = BATnew(TYPE_void, TYPE_void, h1 - l1 + h2 - l2, TRANSIENT);
+               if (bn == NULL)
+                       return NULL;
+               BATsetcount(bn, h1 - l1 + h2 - l2);
+               BATseqbase(bn, 0);
+               BATseqbase(BATmirror(bn), l1 == h1 ? l2 : l1);
+               return bn;
+       }
+       bn = BATnew(TYPE_void, TYPE_oid, h1 - l1 + h2 - l2, TRANSIENT);
+       if (bn == NULL)
+               return NULL;
+       BATsetcount(bn, h1 - l1 + h2 - l2);
+       BATseqbase(bn, 0);
+       p = (oid *) Tloc(bn, BUNfirst(bn));
+       while (l1 < h1)
+               *p++ = l1++;
+       while (l2 < h2)
+               *p++ = l2++;
+       bn->tkey = 1;
+       bn->tsorted = 1;
+       bn->trevsorted = BATcount(bn) <= 1;
+       return bn;
+}
 
-       if (l1 > BUN_MAX || l2 > BUN_MAX || h1 > BUN_MAX || h2 > BUN_MAX) {
-               GDKerror("BATslice2: boundary out of range\n");
+static BAT *
+doubleslice(BAT *b, BUN l1, BUN h1, BUN l2, BUN h2)
+{
+       BAT *bn;
+       oid *p;
+       const oid *o;
+
+       assert(l1 <= h1);
+       assert(l2 <= h2);
+       assert(h1 <= l2);
+       assert(b->tsorted);
+       assert(b->tkey);
+       if (b->ttype == TYPE_void)
+               return doublerange(l1 + b->tseqbase, h1 + b->tseqbase,
+                                  l2 + b->tseqbase, h2 + b->tseqbase);
+       bn = BATnew(TYPE_void, TYPE_oid, h1 - l1 + h2 - l2, TRANSIENT);
+       if (bn == NULL)
                return NULL;
-       }
-
-       bn = BATnew(TYPE_void, ATOMtype(b->htype), h1 - l1 + h2 - l2, 
TRANSIENT);
-       if (bn == NULL)
-               return bn;
-       for (p = (BUN) l1, q = (BUN) h1; p < q; p++) {
-               bunfastapp(bn, BUNhead(bi, p));
-       }
-       for (p = (BUN) l2, q = (BUN) h2; p < q; p++) {
-               bunfastapp(bn, BUNhead(bi, p));
-       }
+       BATsetcount(bn, h1 - l1 + h2 - l2);
        BATseqbase(bn, 0);
-       bn->tsorted = BAThordered(b);
-       bn->trevsorted = BAThrevordered(b);
-       BATkey(BATmirror(bn), BAThkey(b));
-       bn->T->nonil = b->H->nonil;
-       bn->T->nil = 0;
-       if (bn->tkey && bn->ttype == TYPE_oid) {
-               if (BATcount(bn) == 0) {
-                       bn->tdense = TRUE;
-                       BATseqbase(BATmirror(bn), 0);
-               }
-       }
-       return bn;
-      bunins_failed:
-       BBPreclaim(bn);
-       return NULL;
+       p = (oid *) Tloc(bn, BUNfirst(bn));
+       o = (const oid *) Tloc(b, BUNfirst(b) + l1);
+       while (l1++ < h1)
+               *p++ = *o++;
+       o = (const oid *) Tloc(b, BUNfirst(b) + l2);
+       while (l2++ < h2)
+               *p++ = *o++;
+       bn->tkey = 1;
+       bn->tsorted = 1;
+       bn->trevsorted = BATcount(bn) <= 1;
+       return virtualize(bn);
 }
 
 static BAT *
@@ -1150,7 +1166,6 @@ BATsubselect(BAT *b, BAT *s, const void 
        }
 
        if (b->tsorted || b->trevsorted) {
-               BAT *v;
                BUN low = 0;
                BUN high = b->batCount;
 
@@ -1181,6 +1196,8 @@ BATsubselect(BAT *b, BAT *s, const void 
                                l = 0;
                        if ((BUN) l > low)
                                low = (BUN) l;
+                       if (low > high)
+                               low = high;
                } else if (b->tsorted) {
                        ALGODEBUG fprintf(stderr, "#BATsubselect(b=%s#" BUNFMT
                                          ",s=%s,anti=%d): sorted\n",
@@ -1238,11 +1255,13 @@ BATsubselect(BAT *b, BAT *s, const void 
                                        low = SORTfndfirst(s, &o) - BUNfirst(s);
                                        o = (oid) high + b->H->seq;
                                        high = SORTfndfirst(s, &o) - 
BUNfirst(s);
-                                       v = VIEWhead(BATmirror(s));
+                                       bn = doubleslice(s, first, low, high, 
BATcount(s));
                                } else {
-                                       v = VIEWhead(b);        /* [oid,nil] */
+                                       bn = doublerange(first + b->hseqbase,
+                                                        low + b->hseqbase,
+                                                        high + b->hseqbase,
+                                                        BATcount(b) + 
b->hseqbase);
                                }
-                               bn = BATslice2(v, first, low, high, 
BATcount(v));
                        } else {
                                BUN last = SORTfndlast(b, nil) - BUNfirst(b);
                                /* match: [0..low) + [high..last) */
@@ -1253,11 +1272,13 @@ BATsubselect(BAT *b, BAT *s, const void 
                                        low = SORTfndfirst(s, &o) - BUNfirst(s);
                                        o = (oid) high + b->H->seq;
                                        high = SORTfndfirst(s, &o) - 
BUNfirst(s);
-                                       v = VIEWhead(BATmirror(s));
+                                       bn = doubleslice(s, 0, low, high, last);
                                } else {
-                                       v = VIEWhead(b);        /* [oid,nil] */
+                                       bn = doublerange(0 + b->hseqbase,
+                                                        low + b->hseqbase,
+                                                        high + b->hseqbase,
+                                                        last + b->hseqbase);
                                }
-                               bn = BATslice2(v, 0, low, high, last);
                        }
                } else {
                        /* match: [low..high) */
@@ -1266,13 +1287,13 @@ BATsubselect(BAT *b, BAT *s, const void 
                                low = SORTfndfirst(s, &o) - BUNfirst(s);
                                o = (oid) high + b->H->seq;
                                high = SORTfndfirst(s, &o) - BUNfirst(s);
-                               v = VIEWhead(BATmirror(s));
+                               bn = doubleslice(s, 0, 0, low, high);
                        } else {
-                               v = VIEWhead(b);        /* [oid,nil] */
+                               bn = doublerange(0, 0,
+                                                low + b->hseqbase,
+                                                high + b->hseqbase);
                        }
-                       bn = BATmirror(BATslice(v, low, high));
                }
-               BBPunfix(v->batCacheid);
                bn->hseqbase = 0;
                bn->hkey = 1;
                bn->hsorted = 1;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to