Changeset: 0f94f85f07bf for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/0f94f85f07bf Branch: string_imprints Log Message:
Merge with default diffs (truncated from 889 to 300 lines): diff --git a/documentation/index.rst b/documentation/index.rst --- a/documentation/index.rst +++ b/documentation/index.rst @@ -16,6 +16,9 @@ Welcome to MonetDB's documentation! monetdbe/examples monetdbe/installation monetdbe/monetdbe_api + monetdbe/manual_pages/monetdbe_open + monetdbe/manual_pages/monetdbe_options + monetdbe/manual_pages/monetdbe_remote source/intro source/build source/build-fedora diff --git a/gdk/gdk_cand.h b/gdk/gdk_cand.h --- a/gdk/gdk_cand.h +++ b/gdk/gdk_cand.h @@ -177,6 +177,7 @@ gdk_export oid canditer_last(const struc gdk_export oid canditer_prev(struct canditer *ci); gdk_export oid canditer_peekprev(struct canditer *ci); gdk_export oid canditer_idx(const struct canditer *ci, BUN p); +#define canditer_idx_dense(ci, p) ((p >= (ci)->ncand)?oid_nil:((ci)->seq + p)) gdk_export void canditer_setidx(struct canditer *ci, BUN p); gdk_export void canditer_reset(struct canditer *ci); gdk_export BUN canditer_search(const struct canditer *ci, oid o, bool next); diff --git a/gdk/gdk_project.c b/gdk/gdk_project.c --- a/gdk/gdk_project.c +++ b/gdk/gdk_project.c @@ -20,6 +20,57 @@ * hseqbase + its batCount. */ +#define project1_loop(TYPE) \ +static gdk_return \ +project1_##TYPE(BAT *restrict bn, BAT *restrict l, BAT *restrict r1) \ +{ \ + BUN lo, hi; \ + const TYPE *restrict r1t; \ + TYPE *restrict bt; \ + oid r1seq, r1end; \ + \ + MT_thread_setalgorithm(__func__); \ + r1t = (const TYPE *) Tloc(r1, 0); \ + bt = (TYPE *) Tloc(bn, 0); \ + r1seq = r1->hseqbase; \ + r1end = r1seq + BATcount(r1); \ + if (BATtdense(l)) { \ + if (l->tseqbase < r1seq || \ + (l->tseqbase+BATcount(l)) >= r1end) { \ + GDKerror("does not match always\n"); \ + return GDK_FAIL; \ + } \ + oid off = l->tseqbase - r1seq; \ + r1t += off; \ + for (lo = 0, hi = BATcount(l); lo < hi; lo++) \ + bt[lo] = r1t[lo]; \ + } else { \ + const oid *restrict ot = (const oid *) Tloc(l, 0); \ + for (lo = 0, hi = BATcount(l); lo < hi; lo++) { \ + oid o = ot[lo]; \ + if (o < r1seq || o >= r1end) { \ + GDKerror("does not match always\n"); \ + return GDK_FAIL; \ + } \ + bt[lo] = r1t[o - r1seq]; \ + } \ + } \ + BATsetcount(bn, lo); \ + return GDK_SUCCEED; \ +} + +/* project type switch */ +project1_loop(bte) +project1_loop(sht) +project1_loop(int) +project1_loop(flt) +project1_loop(dbl) +project1_loop(lng) +#ifdef HAVE_HGE +project1_loop(hge) +#endif +project1_loop(uuid) + #define project_loop(TYPE) \ static gdk_return \ project_##TYPE(BAT *restrict bn, BAT *restrict l, \ @@ -34,6 +85,8 @@ project_##TYPE(BAT *restrict bn, BAT *re oid r1seq, r1end; \ oid r2seq, r2end; \ \ + if ((!ci || ci->tpe == cand_dense) && l->tnonil && !r2) \ + return project1_##TYPE(bn, l, r1); \ MT_thread_setalgorithm(__func__); \ r1t = (const TYPE *) Tloc(r1, 0); \ r2t = r2 ? (const TYPE *) Tloc(r2, 0) : NULL; \ @@ -120,6 +173,12 @@ project_oid(BAT *restrict bn, BAT *restr const oid *restrict r2t = NULL; struct canditer r1ci = {0}, r2ci = {0}; + if ((!lci || lci->tpe == cand_dense) && !BATtdense(r1) && !r2) { + if (sizeof(oid) == sizeof(lng)) + return project1_lng(bn, l, r1); + else + return project1_int(bn, l, r1); + } MT_thread_setalgorithm(__func__); if (complex_cand(r1)) canditer_init(&r1ci, NULL, r1); @@ -856,13 +915,12 @@ BATprojectchain(BAT **bats) goto bunins_failed; } o -= ba[i].hlo; - o = ba[i].ci.s ? canditer_idx(&ba[i].ci, o) : ba[i].t[o]; + o = ba[i].ci.s ? + (ba[i].ci.tpe == cand_dense) ? + canditer_idx_dense(&ba[i].ci, o) : + canditer_idx(&ba[i].ci, o) : ba[i].t[o]; } - if (bunfastappTYPE(oid, bn, &o) != GDK_SUCCEED) - goto bunins_failed; - if (ATOMputFIX(bn->ttype, d, &o) != GDK_SUCCEED) - goto bunins_failed; - d++; + *d++ = o; } } else if (!ATOMvarsized(tpe)) { const void *v; @@ -883,7 +941,10 @@ BATprojectchain(BAT **bats) goto bunins_failed; } o -= ba[i].hlo; - o = ba[i].ci.s ? canditer_idx(&ba[i].ci, o) : ba[i].t[o]; + o = ba[i].ci.s ? + (ba[i].ci.tpe == cand_dense) ? + canditer_idx_dense(&ba[i].ci, o) : + canditer_idx(&ba[i].ci, o) : ba[i].t[o]; } if (is_oid_nil(o)) { assert(!stringtrick); @@ -934,7 +995,10 @@ BATprojectchain(BAT **bats) goto bunins_failed; } o -= ba[i].hlo; - o = ba[i].ci.s ? canditer_idx(&ba[i].ci, o) : ba[i].t[o]; + o = ba[i].ci.s ? + (ba[i].ci.tpe == cand_dense) ? + canditer_idx_dense(&ba[i].ci, o) : + canditer_idx(&ba[i].ci, o) : ba[i].t[o]; } if (is_oid_nil(o)) { bn->tnil = true; diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c --- a/gdk/gdk_select.c +++ b/gdk/gdk_select.c @@ -1,7 +1,7 @@ /* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. +* file, You can obtain one at http://mozilla.org/MPL/2.0/. * * Copyright 1997 - July 2008 CWI, August 2008 - 2021 MonetDB B.V. */ @@ -628,14 +628,27 @@ fullscan_str(BAT *b, struct canditer *re case 1: { const unsigned char *ptr = (const unsigned char *) Tloc(b, 0); pos -= GDK_VAROFFSET; - for (p = 0; p < ci->ncand; p++) { - o = canditer_next(ci); - if (ptr[o - hseq] == pos) { - buninsfix(bn, dst, cnt, o, - (BUN) ((dbl) cnt / (dbl) (p == 0 ? 1 : p) - * (dbl) (ci->ncand-p) * 1.1 + 1024), - maximum, BUN_NONE); - cnt++; + if (ci->tpe == cand_dense) { + for (p = 0; p < ci->ncand; p++) { + o = canditer_next_dense(ci); + if (ptr[o - hseq] == pos) { + buninsfix(bn, dst, cnt, o, + (BUN) ((dbl) cnt / (dbl) (p == 0 ? 1 : p) + * (dbl) (ci->ncand-p) * 1.1 + 1024), + maximum, BUN_NONE); + cnt++; + } + } + } else { + for (p = 0; p < ci->ncand; p++) { + o = canditer_next(ci); + if (ptr[o - hseq] == pos) { + buninsfix(bn, dst, cnt, o, + (BUN) ((dbl) cnt / (dbl) (p == 0 ? 1 : p) + * (dbl) (ci->ncand-p) * 1.1 + 1024), + maximum, BUN_NONE); + cnt++; + } } } break; @@ -643,14 +656,27 @@ fullscan_str(BAT *b, struct canditer *re case 2: { const unsigned short *ptr = (const unsigned short *) Tloc(b, 0); pos -= GDK_VAROFFSET; - for (p = 0; p < ci->ncand; p++) { - o = canditer_next(ci); - if (ptr[o - hseq] == pos) { - buninsfix(bn, dst, cnt, o, - (BUN) ((dbl) cnt / (dbl) (p == 0 ? 1 : p) - * (dbl) (ci->ncand-p) * 1.1 + 1024), - maximum, BUN_NONE); - cnt++; + if (ci->tpe == cand_dense) { + for (p = 0; p < ci->ncand; p++) { + o = canditer_next_dense(ci); + if (ptr[o - hseq] == pos) { + buninsfix(bn, dst, cnt, o, + (BUN) ((dbl) cnt / (dbl) (p == 0 ? 1 : p) + * (dbl) (ci->ncand-p) * 1.1 + 1024), + maximum, BUN_NONE); + cnt++; + } + } + } else { + for (p = 0; p < ci->ncand; p++) { + o = canditer_next(ci); + if (ptr[o - hseq] == pos) { + buninsfix(bn, dst, cnt, o, + (BUN) ((dbl) cnt / (dbl) (p == 0 ? 1 : p) + * (dbl) (ci->ncand-p) * 1.1 + 1024), + maximum, BUN_NONE); + cnt++; + } } } break; @@ -658,14 +684,27 @@ fullscan_str(BAT *b, struct canditer *re #if SIZEOF_VAR_T == 8 case 4: { const unsigned int *ptr = (const unsigned int *) Tloc(b, 0); - for (p = 0; p < ci->ncand; p++) { - o = canditer_next(ci); - if (ptr[o - hseq] == pos) { - buninsfix(bn, dst, cnt, o, - (BUN) ((dbl) cnt / (dbl) (p == 0 ? 1 : p) - * (dbl) (ci->ncand-p) * 1.1 + 1024), - maximum, BUN_NONE); - cnt++; + if (ci->tpe == cand_dense) { + for (p = 0; p < ci->ncand; p++) { + o = canditer_next_dense(ci); + if (ptr[o - hseq] == pos) { + buninsfix(bn, dst, cnt, o, + (BUN) ((dbl) cnt / (dbl) (p == 0 ? 1 : p) + * (dbl) (ci->ncand-p) * 1.1 + 1024), + maximum, BUN_NONE); + cnt++; + } + } + } else { + for (p = 0; p < ci->ncand; p++) { + o = canditer_next(ci); + if (ptr[o - hseq] == pos) { + buninsfix(bn, dst, cnt, o, + (BUN) ((dbl) cnt / (dbl) (p == 0 ? 1 : p) + * (dbl) (ci->ncand-p) * 1.1 + 1024), + maximum, BUN_NONE); + cnt++; + } } } break; @@ -673,14 +712,27 @@ fullscan_str(BAT *b, struct canditer *re #endif default: { const var_t *ptr = (const var_t *) Tloc(b, 0); - for (p = 0; p < ci->ncand; p++) { - o = canditer_next(ci); - if (ptr[o - hseq] == pos) { - buninsfix(bn, dst, cnt, o, - (BUN) ((dbl) cnt / (dbl) (p == 0 ? 1 : p) - * (dbl) (ci->ncand-p) * 1.1 + 1024), - maximum, BUN_NONE); - cnt++; + if (ci->tpe == cand_dense) { + for (p = 0; p < ci->ncand; p++) { + o = canditer_next_dense(ci); + if (ptr[o - hseq] == pos) { + buninsfix(bn, dst, cnt, o, + (BUN) ((dbl) cnt / (dbl) (p == 0 ? 1 : p) + * (dbl) (ci->ncand-p) * 1.1 + 1024), + maximum, BUN_NONE); + cnt++; + } + } + } else { + for (p = 0; p < ci->ncand; p++) { + o = canditer_next(ci); + if (ptr[o - hseq] == pos) { + buninsfix(bn, dst, cnt, o, + (BUN) ((dbl) cnt / (dbl) (p == 0 ? 1 : p) + * (dbl) (ci->ncand-p) * 1.1 + 1024), _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list