Changeset: 79bde2de5b96 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=79bde2de5b96
Modified Files:
        gdk/gdk_bat.c
        gdk/gdk_batop.c
Branch: default
Log Message:

Maintain min/max properties in append.
I.e. BUNappend and BATappend, and also BUNdelete and BUNinplace.


diffs (213 lines):

diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -1050,7 +1050,37 @@ BUNappend(BAT *b, const void *t, bool fo
 
        IMPSdestroy(b); /* no support for inserts in imprints yet */
        OIDXdestroy(b);
-       PROPdestroy(b);
+       if (b->ttype != TYPE_void
+           && ATOMlinear(b->ttype)
+           && ATOMcmp(b->ttype, t, ATOMnilptr(b->ttype)) != 0) {
+               PROPrec *prop;
+
+               if (b->batCount == 1) {
+                       BATsetprop(b, GDK_MAX_VALUE, b->ttype, t);
+                       BATsetprop(b, GDK_MIN_VALUE, b->ttype, t);
+               } else {
+                       if ((prop = BATgetprop(b, GDK_MAX_VALUE)) != NULL &&
+                           ATOMcmp(b->ttype, VALptr(&prop->v), t) < 0) {
+                               BATsetprop(b, GDK_MAX_VALUE, b->ttype, t);
+                       }
+                       if ((prop = BATgetprop(b, GDK_MIN_VALUE)) != NULL &&
+                           ATOMcmp(b->ttype, VALptr(&prop->v), t) > 0) {
+                               BATsetprop(b, GDK_MIN_VALUE, b->ttype, t);
+                       }
+               }
+#if 0          /* enable if we have more properties than just min/max */
+               do {
+                       for (prop = b->tprops; prop; prop = prop->next)
+                               if (prop->id != GDK_MAX_VALUE &&
+                                   prop->id != GDK_MIN_VALUE) {
+                                       BATrmprop(b, prop->id);
+                                       break;
+                               }
+               } while (prop);
+#endif
+       } else {
+               PROPdestroy(b);
+       }
        if (b->thash == (Hash *) 1 ||
            (b->thash && ((size_t *) b->thash->heap.base)[0] & (1 << 24))) {
                /* don't bother first loading the hash to then change
@@ -1072,6 +1102,8 @@ BUNdelete(BAT *b, oid o)
 {
        BUN p;
        BATiter bi = bat_iterator(b);
+       const void *val;
+       PROPrec *prop;
 
        assert(!is_oid_nil(b->hseqbase) || BATcount(b) == 0);
        if (o < b->hseqbase || o >= b->hseqbase + BATcount(b)) {
@@ -1085,7 +1117,16 @@ BUNdelete(BAT *b, oid o)
                return GDK_FAIL;
        }
        b->batDirtydesc = true;
-       ATOMunfix(b->ttype, BUNtail(bi, p));
+       val = BUNtail(bi, p);
+       if (ATOMcmp(b->ttype, ATOMnilptr(b->ttype), val) != 0) {
+               if ((prop = BATgetprop(b, GDK_MAX_VALUE)) != NULL
+                   && ATOMcmp(b->ttype, VALptr(&prop->v), val) >= 0)
+                       BATrmprop(b, GDK_MAX_VALUE);
+               if ((prop = BATgetprop(b, GDK_MIN_VALUE)) != NULL
+                   && ATOMcmp(b->ttype, VALptr(&prop->v), val) <= 0)
+                       BATrmprop(b, GDK_MIN_VALUE);
+       }
+       ATOMunfix(b->ttype, val);
        ATOMdel(b->ttype, b->tvheap, (var_t *) BUNtloc(bi, p));
        if (p != BUNlast(b) - 1 &&
            (b->ttype != TYPE_void || BATtdense(b))) {
@@ -1117,7 +1158,16 @@ BUNdelete(BAT *b, oid o)
        IMPSdestroy(b);
        OIDXdestroy(b);
        HASHdestroy(b);
-       PROPdestroy(b);
+#if 0          /* enable if we have more properties than just min/max */
+       do {
+               for (prop = b->tprops; prop; prop = prop->next)
+                       if (prop->id != GDK_MAX_VALUE &&
+                           prop->id != GDK_MIN_VALUE) {
+                               BATrmprop(b, prop->id);
+                               break;
+                       }
+       } while (prop);
+#endif
        return GDK_SUCCEED;
 }
 
@@ -1140,6 +1190,7 @@ BUNinplace(BAT *b, BUN p, const void *t,
        BATiter bi = bat_iterator(b);
        int tt;
        BUN prv, nxt;
+       const void *val;
 
        assert(p >= b->batInserted || force);
 
@@ -1151,8 +1202,9 @@ BUNinplace(BAT *b, BUN p, const void *t,
                         BATgetId(b));
                return GDK_FAIL;
        }
+       val = BUNtail(bi, p);   /* old value */
        if (b->tnil &&
-           ATOMcmp(b->ttype, BUNtail(bi, p), ATOMnilptr(b->ttype)) == 0 &&
+           ATOMcmp(b->ttype, val, ATOMnilptr(b->ttype)) == 0 &&
            ATOMcmp(b->ttype, t, ATOMnilptr(b->ttype)) != 0) {
                /* if old value is nil and new value isn't, we're not
                 * sure anymore about the nil property, so we must
@@ -1160,7 +1212,52 @@ BUNinplace(BAT *b, BUN p, const void *t,
                b->tnil = false;
        }
        HASHdestroy(b);
-       PROPdestroy(b);
+       if (b->ttype != TYPE_void && ATOMlinear(b->ttype)) {
+               PROPrec *prop;
+
+               if ((prop = BATgetprop(b, GDK_MAX_VALUE)) != NULL) {
+                       if (ATOMcmp(b->ttype, t, ATOMnilptr(b->ttype)) != 0 &&
+                           ATOMcmp(b->ttype, VALptr(&prop->v), t) < 0) {
+                               /* new value is larger than previous
+                                * largest */
+                               BATsetprop(b, GDK_MAX_VALUE, b->ttype, t);
+                       } else if (ATOMcmp(b->ttype, t, val) != 0 &&
+                                  ATOMcmp(b->ttype, VALptr(&prop->v), val) == 
0) {
+                               /* old value is equal to largest and
+                                * new value is smaller (see above),
+                                * so we don't know anymore which is
+                                * the largest */
+                               BATrmprop(b, GDK_MAX_VALUE);
+                       }
+               }
+               if ((prop = BATgetprop(b, GDK_MIN_VALUE)) != NULL) {
+                       if (ATOMcmp(b->ttype, t, ATOMnilptr(b->ttype)) != 0 &&
+                           ATOMcmp(b->ttype, VALptr(&prop->v), t) > 0) {
+                               /* new value is smaller than previous
+                                * smallest */
+                               BATsetprop(b, GDK_MIN_VALUE, b->ttype, t);
+                       } else if (ATOMcmp(b->ttype, t, val) != 0 &&
+                                  ATOMcmp(b->ttype, VALptr(&prop->v), val) <= 
0) {
+                               /* old value is equal to smallest and
+                                * new value is larger (see above), so
+                                * we don't know anymore which is the
+                                * smallest */
+                               BATrmprop(b, GDK_MIN_VALUE);
+                       }
+               }
+#if 0          /* enable if we have more properties than just min/max */
+               do {
+                       for (prop = b->tprops; prop; prop = prop->next)
+                               if (prop->id != GDK_MAX_VALUE &&
+                                   prop->id != GDK_MIN_VALUE) {
+                                       BATrmprop(b, prop->id);
+                                       break;
+                               }
+               } while (prop);
+#endif
+       } else {
+               PROPdestroy(b);
+       }
        OIDXdestroy(b);
        IMPSdestroy(b);
        if (b->tvarsized && b->ttype) {
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -528,6 +528,7 @@ BATappend(BAT *b, BAT *n, BAT *s, bool f
        BUN start, end, cnt;
        BUN r;
        const oid *restrict cand = NULL, *candend = NULL;
+       PROPrec *prop, *nprop;
 
        if (b == NULL || n == NULL || (cnt = BATcount(n)) == 0) {
                return GDK_SUCCEED;
@@ -600,7 +601,40 @@ BATappend(BAT *b, BAT *n, BAT *s, bool f
 
        IMPSdestroy(b);         /* imprints do not support updates yet */
        OIDXdestroy(b);
-       PROPdestroy(b);
+       if ((prop = BATgetprop(b, GDK_MAX_VALUE)) != NULL) {
+               if ((nprop = BATgetprop(n, GDK_MAX_VALUE)) != NULL) {
+                       if (ATOMcmp(b->ttype, VALptr(&prop->v), 
VALptr(&nprop->v)) < 0) {
+                               if (s == NULL)
+                                       BATsetprop(b, GDK_MAX_VALUE, b->ttype, 
VALptr(&nprop->v));
+                               else
+                                       BATrmprop(b, GDK_MAX_VALUE);
+                       }
+               } else {
+                       BATrmprop(b, GDK_MAX_VALUE);
+               }
+       }
+       if ((prop = BATgetprop(b, GDK_MIN_VALUE)) != NULL) {
+               if ((nprop = BATgetprop(n, GDK_MIN_VALUE)) != NULL) {
+                       if (ATOMcmp(b->ttype, VALptr(&prop->v), 
VALptr(&nprop->v)) > 0) {
+                               if (s == NULL)
+                                       BATsetprop(b, GDK_MIN_VALUE, b->ttype, 
VALptr(&nprop->v));
+                               else
+                                       BATrmprop(b, GDK_MIN_VALUE);
+                       }
+               } else {
+                       BATrmprop(b, GDK_MIN_VALUE);
+               }
+       }
+#if 0          /* enable if we have more properties than just min/max */
+       do {
+               for (prop = b->tprops; prop; prop = prop->next)
+                       if (prop->id != GDK_MAX_VALUE &&
+                           prop->id != GDK_MIN_VALUE) {
+                               BATrmprop(b, prop->id);
+                               break;
+                       }
+       } while (prop);
+#endif
        if (b->thash == (Hash *) 1 || BATcount(b) == 0 ||
            (b->thash && ((size_t *) b->thash->heap.base)[0] & (1 << 24))) {
                /* don't bother first loading the hash to then change
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to