Changeset: 97d84cdcf49f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/97d84cdcf49f
Modified Files:
        gdk/gdk_batop.c
Branch: Dec2025
Log Message:

Improve efficiency of appending multiple values.
This affects the interfaces BAT{replace,update}{,pos}.


diffs (111 lines):

diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -1275,11 +1275,13 @@ BATdel(BAT *b, BAT *d)
  */
 static gdk_return
 BATappend_or_update(BAT *b, BAT *p, const oid *positions, BAT *n,
-                   bool mayappend, bool autoincr, bool force)
+                   bool mayappend, bool autoincr, bool force,
+                   const char *func)
 {
        lng t0 = GDKusec();
        oid pos = oid_nil;
        BUN nunique = 0;
+       gdk_return rc = GDK_SUCCEED;
 
        if (b == NULL || b->ttype == TYPE_void || n == NULL) {
                return GDK_SUCCEED;
@@ -1395,6 +1397,34 @@ BATappend_or_update(BAT *b, BAT *p, cons
                                        bat_iterator_end(&ni);
                                        return GDK_FAIL;
                                }
+                               if (i < ni.count - 1) {
+                                       BUN j = 1;
+                                       if (positions) {
+                                               if (autoincr) {
+                                                       j = ni.count - i;
+                                               } else {
+                                                       for (j = 1; j < 
ni.count - i; j++)
+                                                               if 
(positions[j] != updid + j)
+                                                                       break;
+                                               }
+                                       } else {
+                                               for (j = 1; j < ni.count - i; 
j++)
+                                                       if (BUNtoid(p, i + j) 
!= updid + j)
+                                                               break;
+                                       }
+                                       if (j > 1) {
+                                               BAT *s = BATdense(0, i + 
n->hseqbase, j);
+                                               rc = BATappend2(b, n, s, force, 
true);
+                                               BBPreclaim(s);
+                                               if (rc != GDK_SUCCEED) {
+                                                       bat_iterator_end(&ni);
+                                                       return rc;
+                                               }
+                                               i += j - 1;
+                                               continue;
+                                       }
+                               }
+
                                if (BUNappend(b, new, force) != GDK_SUCCEED) {
                                        bat_iterator_end(&ni);
                                        return GDK_FAIL;
@@ -1508,7 +1538,6 @@ BATappend_or_update(BAT *b, BAT *p, cons
                                MT_UNREACHABLE();
                        }
                        MT_lock_set(&b->theaplock);
-                       gdk_return rc = GDK_SUCCEED;
                        bool skip = false;
                        if (new == prevnew && !hasdel) {
                                d = prevoff;
@@ -1881,8 +1910,8 @@ BATappend_or_update(BAT *b, BAT *p, cons
        b->theap->dirty = true;
        MT_lock_unset(&b->theaplock);
        TRC_DEBUG(ALGO,
-                 "BATreplace(" ALGOBATFMT "," ALGOOPTBATFMT "," ALGOBATFMT ") 
" LLFMT " usec\n",
-                 ALGOBATPAR(b), ALGOOPTBATPAR(p), ALGOBATPAR(n),
+                 "%s(" ALGOBATFMT "," ALGOOPTBATFMT "," ALGOBATFMT ") " LLFMT 
" usec\n",
+                 func, ALGOBATPAR(b), ALGOOPTBATPAR(p), ALGOBATPAR(n),
                  GDKusec() - t0);
        return GDK_SUCCEED;
 
@@ -1901,14 +1930,16 @@ BATappend_or_update(BAT *b, BAT *p, cons
 gdk_return
 BATreplace(BAT *b, BAT *p, BAT *n, bool force)
 {
-       return BATappend_or_update(b, p, NULL, n, false, false, force);
+       return BATappend_or_update(b, p, NULL, n, false, false,
+                                  force, __func__);
 }
 
 /* like BATreplace, but p may specify locations beyond the end of b */
 gdk_return
 BATupdate(BAT *b, BAT *p, BAT *n, bool force)
 {
-       return BATappend_or_update(b, p, NULL, n, true, false, force);
+       return BATappend_or_update(b, p, NULL, n, true, false,
+                                  force, __func__);
 }
 
 #if 0                          /* not used */
@@ -1916,7 +1947,8 @@ BATupdate(BAT *b, BAT *p, BAT *n, bool f
 gdk_return
 BATreplacepos(BAT *b, const oid *positions, BAT *n, bool autoincr, bool force)
 {
-       return BATappend_or_update(b, NULL, positions, n, false, autoincr, 
force);
+       return BATappend_or_update(b, NULL, positions, n, false, autoincr,
+                                  force, __func__);
 }
 #endif
 
@@ -1925,7 +1957,8 @@ BATreplacepos(BAT *b, const oid *positio
 gdk_return
 BATupdatepos(BAT *b, const oid *positions, BAT *n, bool autoincr, bool force)
 {
-       return BATappend_or_update(b, NULL, positions, n, true, autoincr, 
force);
+       return BATappend_or_update(b, NULL, positions, n, true, autoincr,
+                                  force, __func__);
 }
 
 /*
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to