Changeset: d8536d07233c for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d8536d07233c
Modified Files:
        gdk/gdk_align.c
        gdk/gdk_bat.c
        gdk/gdk_batop.c
Branch: Jul2015
Log Message:

Improve maintenance of nosorted and norevsorted properties.
Also some improvements to nokey and nodense.


diffs (truncated from 632 to 300 lines):

diff --git a/gdk/gdk_align.c b/gdk/gdk_align.c
--- a/gdk/gdk_align.c
+++ b/gdk/gdk_align.c
@@ -120,11 +120,15 @@ ALIGNsetH(BAT *b1, BAT *b2)
        b1->hrevsorted = BAThrevordered(b2);
        b1->halign = b2->halign;
        b1->batDirtydesc = TRUE;
-       b1->H->norevsorted = (BUN) (b2->H->norevsorted + diff);
-       b1->H->nokey[0] = (BUN) (b2->H->nokey[0] + diff);
-       b1->H->nokey[1] = (BUN) (b2->H->nokey[1] + diff);
-       b1->H->nosorted = (BUN) (b2->H->nosorted + diff);
-       b1->H->nodense = (BUN) (b2->H->nodense + diff);
+       b1->H->norevsorted = b2->H->norevsorted ? (BUN) (b2->H->norevsorted + 
diff) : 0;
+       if (b2->H->nokey[0] != b2->H->nokey[1]) {
+               b1->H->nokey[0] = (BUN) (b2->H->nokey[0] + diff);
+               b1->H->nokey[1] = (BUN) (b2->H->nokey[1] + diff);
+       } else {
+               b1->H->nokey[0] = b1->H->nokey[1] = 0;
+       }
+       b1->H->nosorted = b2->H->nosorted ? (BUN) (b2->H->nosorted + diff): 0;
+       b1->H->nodense = b2->H->nodense ? (BUN) (b2->H->nodense + diff) : 0;
 }
 
 /*
@@ -765,15 +769,37 @@ VIEWbounds(BAT *b, BAT *view, BUN l, BUN
                h = BATcount(b);
        if (h < l)
                h = l;
+       cnt = h - l;
        l += BUNfirst(b);
        view->batFirst = view->batDeleted = view->batInserted = 0;
-       cnt = h - l;
        view->H->heap.base = (view->htype) ? BUNhloc(bi, l) : NULL;
        view->T->heap.base = (view->ttype) ? BUNtloc(bi, l) : NULL;
        view->H->heap.size = headsize(view, cnt);
        view->T->heap.size = tailsize(view, cnt);
        BATsetcount(view, cnt);
        BATsetcapacity(view, cnt);
+       view->H->nosorted = view->H->norevsorted = view->H->nodense = 0;
+       view->H->nokey[0] = view->H->nokey[1] = 0;
+       if (view->T->nosorted > l && view->T->nosorted < l + cnt)
+               view->T->nosorted -= l;
+       else
+               view->T->nosorted = 0;
+       if (view->T->norevsorted > l && view->T->norevsorted < l + cnt)
+               view->T->norevsorted -= l;
+       else
+               view->T->norevsorted = 0;
+       if (view->T->nodense > l && view->T->nodense < l + cnt)
+               view->T->nodense -= l;
+       else
+               view->T->nodense = 0;
+       if (view->T->nokey[0] >= l && view->T->nokey[0] < l + cnt &&
+           view->T->nokey[1] >= l && view->T->nokey[1] < l + cnt &&
+           view->T->nokey[0] != view->T->nokey[1]) {
+               view->T->nokey[0] -= l;
+               view->T->nokey[1] -= l;
+       } else {
+               view->T->nokey[0] = view->T->nokey[1] = 0;
+       }
 }
 
 /*
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -589,6 +589,10 @@ BATclear(BAT *b, int force)
        BATseqbase(BATmirror(b), 0);
        b->batDirty = TRUE;
        BATsettrivprop(b);
+       b->H->nosorted = b->H->norevsorted = b->H->nodense = 0;
+       b->H->nokey[0] = b->H->nokey[1] = 0;
+       b->T->nosorted = b->T->norevsorted = b->T->nodense = 0;
+       b->T->nokey[0] = b->T->nokey[1] = 0;
        return GDK_SUCCEED;
 }
 
@@ -937,29 +941,75 @@ BATcopy(BAT *b, int ht, int tt, int writ
                ALIGNsetH(bn, b);
        } else if (ATOMstorage(ht) == ATOMstorage(b->htype) &&
                   ATOMcompare(ht) == ATOMcompare(b->htype)) {
+               BUN l = BUNfirst(b), h = BUNlast(b);
                bn->hsorted = b->hsorted;
                bn->hrevsorted = b->hrevsorted;
                bn->hdense = b->hdense && ATOMtype(bn->htype) == TYPE_oid;
                if (b->hkey)
                        BATkey(bn, TRUE);
                bn->H->nonil = b->H->nonil;
+               if (b->H->nosorted > l && b->H->nosorted < h)
+                       bn->H->nosorted = b->H->nosorted - l + BUNfirst(bn);
+               else
+                       bn->H->nosorted = 0;
+               if (b->H->norevsorted > l && b->H->norevsorted < h)
+                       bn->H->norevsorted = b->H->norevsorted - l + 
BUNfirst(bn);
+               else
+                       bn->H->norevsorted = 0;
+               if (b->H->nodense > l && b->H->nodense < h)
+                       bn->H->nodense = b->H->nodense - l + BUNfirst(bn);
+               else
+                       bn->H->nodense = 0;
+               if (b->H->nokey[0] >= l && b->H->nokey[0] < h &&
+                   b->H->nokey[1] >= l && b->H->nokey[1] < h &&
+                   b->H->nokey[0] != b->H->nokey[1]) {
+                       bn->H->nokey[0] = b->H->nokey[0] - l + BUNfirst(bn);
+                       bn->H->nokey[1] = b->H->nokey[1] - l + BUNfirst(bn);
+               } else {
+                       bn->H->nokey[0] = bn->H->nokey[1] = 0;
+               }
        } else {
                bn->hsorted = bn->hrevsorted = 0; /* set based on count later */
                bn->hdense = bn->H->nonil = 0;
+               bn->H->nosorted = bn->H->norevsorted = bn->H->nodense = 0;
+               bn->H->nokey[0] = bn->H->nokey[1] = 0;
        }
        if (ATOMtype(tt) == ATOMtype(b->ttype)) {
                ALIGNsetT(bn, b);
        } else if (ATOMstorage(tt) == ATOMstorage(b->ttype) &&
                   ATOMcompare(tt) == ATOMcompare(b->ttype)) {
+               BUN l = BUNfirst(b), h = BUNlast(b);
                bn->tsorted = b->tsorted;
                bn->trevsorted = b->trevsorted;
                bn->tdense = b->tdense && ATOMtype(bn->ttype) == TYPE_oid;
                if (b->tkey)
                        BATkey(BATmirror(bn), TRUE);
                bn->T->nonil = b->T->nonil;
+               if (b->T->nosorted > l && b->T->nosorted < h)
+                       bn->T->nosorted = b->T->nosorted - l + BUNfirst(bn);
+               else
+                       bn->T->nosorted = 0;
+               if (b->T->norevsorted > l && b->T->norevsorted < h)
+                       bn->T->norevsorted = b->T->norevsorted - l + 
BUNfirst(bn);
+               else
+                       bn->T->norevsorted = 0;
+               if (b->T->nodense > l && b->T->nodense < h)
+                       bn->T->nodense = b->T->nodense - l + BUNfirst(bn);
+               else
+                       bn->T->nodense = 0;
+               if (b->T->nokey[0] >= l && b->T->nokey[0] < h &&
+                   b->T->nokey[1] >= l && b->T->nokey[1] < h &&
+                   b->T->nokey[0] != b->T->nokey[1]) {
+                       bn->T->nokey[0] = b->T->nokey[0] - l + BUNfirst(bn);
+                       bn->T->nokey[1] = b->T->nokey[1] - l + BUNfirst(bn);
+               } else {
+                       bn->T->nokey[0] = bn->T->nokey[1] = 0;
+               }
        } else {
                bn->tsorted = bn->trevsorted = 0; /* set based on count later */
                bn->tdense = bn->T->nonil = 0;
+               bn->T->nosorted = bn->T->norevsorted = bn->T->nodense = 0;
+               bn->T->nokey[0] = bn->T->nokey[1] = 0;
        }
        if (BATcount(bn) <= 1) {
                bn->hsorted = ATOMlinear(b->htype);
@@ -1062,7 +1112,10 @@ setcolprops(BAT *b, COLrec *col, const v
        if (b->batCount == 0) {
                /* first value */
                col->sorted = col->revsorted = ATOMlinear(col->type) != 0;
+               col->nosorted = col->norevsorted = 0;
                col->key |= 1;
+               col->nokey[0] = col->nokey[1] = 0;
+               col->nodense = 0;
                if (col->type == TYPE_void) {
                        if (x) {
                                col->seq = * (const oid *) x;
@@ -1075,6 +1128,8 @@ setcolprops(BAT *b, COLrec *col, const v
                        if (col->type == TYPE_oid) {
                                col->dense = !isnil;
                                col->seq = * (const oid *) x;
+                               if (isnil)
+                                       col->nodense = BUNlast(b);
                        }
                }
        } else if (col->type == TYPE_void) {
@@ -1082,11 +1137,18 @@ setcolprops(BAT *b, COLrec *col, const v
                 * seqbase and x is not used, so only some properties
                 * are affected */
                if (col->seq != oid_nil) {
-                       col->revsorted = 0;
+                       if (col->revsorted) {
+                               col->norevsorted = BUNlast(b);
+                               col->revsorted = 0;
+                       }
                        col->nil = 0;
                        col->nonil = 1;
                } else {
-                       col->key = 0;
+                       if (col->key) {
+                               col->nokey[0] = BUNfirst(b);
+                               col->nokey[1] = BUNlast(b);
+                               col->key = 0;
+                       }
                        col->nil = 1;
                        col->nonil = 0;
                }
@@ -1103,8 +1165,10 @@ setcolprops(BAT *b, COLrec *col, const v
                       (col->revsorted && cmp < 0) ||
                       (!col->sorted && !col->revsorted))))) {
                        col->key = 0;
-                       col->nokey[0] = pos - 1;
-                       col->nokey[1] = pos;
+                       if (cmp == 0) {
+                               col->nokey[0] = pos - 1;
+                               col->nokey[1] = pos;
+                       }
                }
                if (col->sorted && cmp > 0) {
                        /* out of order */
@@ -1366,7 +1430,6 @@ BUNdelete_(BAT *b, BUN p, bit force)
        BATiter bi = bat_iterator(b);
        BAT *bm = BBP_cache(-b->batCacheid);
        BUN l, last = BUNlast(b) - 1;
-       BUN idx1;
 
        ALIGNdel(b, "BUNdelete", force, BUN_NONE);      /* zap alignment info */
 
@@ -1376,7 +1439,6 @@ BUNdelete_(BAT *b, BUN p, bit force)
         */
        HASHdestroy(b);
        if (p < b->batInserted && !force) {
-               idx1 = p;
                if (p == b->batFirst) { /* first can simply be discarded */
                        if (BAThdense(b)) {
                                bm->tseqbase = ++b->hseqbase;
@@ -1384,35 +1446,46 @@ BUNdelete_(BAT *b, BUN p, bit force)
                        if (BATtdense(b)) {
                                bm->hseqbase = ++b->tseqbase;
                        }
+                       if (b->H->nosorted == b->batFirst)
+                               b->H->nosorted = 0;
+                       if (b->H->norevsorted == b->batFirst)
+                               b->H->norevsorted = 0;
+                       if (b->H->nodense == b->batFirst)
+                               b->H->nodense = 0;
+                       if (b->H->nokey[0] == b->batFirst ||
+                           b->H->nokey[1] == b->batFirst)
+                               b->H->nokey[0] = b->H->nokey[1] = 0;
+                       if (b->T->nosorted == b->batFirst)
+                               b->T->nosorted = 0;
+                       if (b->T->norevsorted == b->batFirst)
+                               b->T->norevsorted = 0;
+                       if (b->T->nodense == b->batFirst)
+                               b->T->nodense = 0;
+                       if (b->T->nokey[0] == b->batFirst ||
+                           b->T->nokey[1] == b->batFirst)
+                               b->T->nokey[0] = b->T->nokey[1] = 0;
                } else {
                        unsigned short hs = Hsize(b), ts = Tsize(b);
 
                        l = BUNfirst(b);
                        acc_move(l,p);
-                       if (b->hsorted) {
-                               b->hsorted = FALSE;
-                               b->H->nosorted = idx1;
-                       }
-                       if (b->hrevsorted) {
-                               b->hrevsorted = FALSE;
-                               b->H->norevsorted = idx1;
-                       }
-                       if (b->hdense) {
-                               b->hdense = FALSE;
-                               b->H->nodense = idx1;
-                       }
-                       if (b->tsorted) {
-                               b->tsorted = FALSE;
-                               b->T->nosorted = idx1;
-                       }
-                       if (b->trevsorted) {
-                               b->trevsorted = FALSE;
-                               b->T->norevsorted = idx1;
-                       }
-                       if (b->tdense) {
-                               b->tdense = FALSE;
-                               b->T->nodense = idx1;
-                       }
+                       b->hsorted = FALSE;
+                       b->hrevsorted = FALSE;
+                       b->hdense = FALSE;
+                       b->tsorted = FALSE;
+                       b->trevsorted = FALSE;
+                       b->tdense = FALSE;
+                       /* zap no* values since we've shuffled values
+                        * and don't want to figure out what the new
+                        * values should be */
+                       b->H->nosorted = 0;
+                       b->H->norevsorted = 0;
+                       b->H->nodense = 0;
+                       b->T->nosorted = 0;
+                       b->T->norevsorted = 0;
+                       b->T->nodense = 0;
+                       b->H->nokey[0] = b->H->nokey[1] = 0;
+                       b->T->nokey[0] = b->T->nokey[1] = 0;
                }
                b->batFirst++;
        } else {
@@ -1441,7 +1514,6 @@ BUNdelete_(BAT *b, BUN p, bit force)
                        assert(b->T->width == sizeof(var_t));
                        (*tatmdel) (b->T->vheap, (var_t *) BUNtloc(bi, p));
                }
-               idx1 = p;
                if (p != last) {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to