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]