Changeset: 5c7bc62381c7 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5c7bc62381c7 Modified Files: gdk/gdk_select.c Branch: default Log Message:
Merge with Oct2014 branch. diffs (287 lines): diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c --- a/gdk/gdk_select.c +++ b/gdk/gdk_select.c @@ -426,11 +426,13 @@ do { \ while (p < q) { \ CAND; \ v = src[o-off]; \ - buninsfix(bn, dst, cnt, o, \ - (BUN) ((dbl) cnt / (dbl) (p-r) \ - * (dbl) (q-p) * 1.1 + 1024), \ - BATcapacity(bn) + q - p, BUN_NONE); \ - cnt += (TEST); \ + if (TEST) { \ + buninsfix(bn, dst, cnt, o, \ + (BUN) ((dbl) cnt / (dbl) (p-r) \ + * (dbl) (q-p) * 1.1 + 1024), \ + BATcapacity(bn) + q - p, BUN_NONE); \ + cnt++; \ + } \ p++; \ } \ } else { \ @@ -590,11 +592,13 @@ candscan_any (BAT *b, BAT *s, BAT *bn, c while (p < q) { o = *candlist++; v = BUNtail(bi,(BUN)(o-off)); - buninsfix(bn, dst, cnt, o, - (BUN) ((dbl) cnt / (dbl) (p-r) - * (dbl) (q-p) * 1.1 + 1024), - BATcapacity(bn) + q - p, BUN_NONE); - cnt += ((*cmp)(tl, v) == 0); + if ((*cmp)(tl, v) == 0) { + buninsfix(bn, dst, cnt, o, + (BUN) ((dbl) cnt / (dbl) (p-r) + * (dbl) (q-p) * 1.1 + 1024), + BATcapacity(bn) + q - p, BUN_NONE); + cnt++; + } p++; } } else if (anti) { @@ -606,17 +610,19 @@ candscan_any (BAT *b, BAT *s, BAT *bn, c while (p < q) { o = *candlist++; v = BUNtail(bi,(BUN)(o-off)); - buninsfix(bn, dst, cnt, o, - (BUN) ((dbl) cnt / (dbl) (p-r) - * (dbl) (q-p) * 1.1 + 1024), - BATcapacity(bn) + q - p, BUN_NONE); - cnt += ((nil == NULL || (*cmp)(v, nil) != 0) && - ((lval && - ((c = (*cmp)(tl, v)) > 0 || - (!li && c == 0))) || - (hval && - ((c = (*cmp)(th, v)) < 0 || - (!hi && c == 0))))); + if ((nil == NULL || (*cmp)(v, nil) != 0) && + ((lval && + ((c = (*cmp)(tl, v)) > 0 || + (!li && c == 0))) || + (hval && + ((c = (*cmp)(th, v)) < 0 || + (!hi && c == 0))))) { + buninsfix(bn, dst, cnt, o, + (BUN) ((dbl) cnt / (dbl) (p-r) + * (dbl) (q-p) * 1.1 + 1024), + BATcapacity(bn) + q - p, BUN_NONE); + cnt++; + } p++; } } else { @@ -628,17 +634,19 @@ candscan_any (BAT *b, BAT *s, BAT *bn, c while (p < q) { o = *candlist++; v = BUNtail(bi,(BUN)(o-off)); - buninsfix(bn, dst, cnt, o, - (BUN) ((dbl) cnt / (dbl) (p-r) - * (dbl) (q-p) * 1.1 + 1024), - BATcapacity(bn) + q - p, BUN_NONE); - cnt += ((nil == NULL || (*cmp)(v, nil) != 0) && - ((!lval || - (c = cmp(tl, v)) < 0 || - (li && c == 0)) && - (!hval || - (c = cmp(th, v)) > 0 || - (hi && c == 0)))); + if ((nil == NULL || (*cmp)(v, nil) != 0) && + ((!lval || + (c = cmp(tl, v)) < 0 || + (li && c == 0)) && + (!hval || + (c = cmp(th, v)) > 0 || + (hi && c == 0)))) { + buninsfix(bn, dst, cnt, o, + (BUN) ((dbl) cnt / (dbl) (p-r) + * (dbl) (q-p) * 1.1 + 1024), + BATcapacity(bn) + q - p, BUN_NONE); + cnt++; + } p++; } } @@ -672,11 +680,13 @@ fullscan_any(BAT *b, BAT *s, BAT *bn, co while (p < q) { o = (oid)(p + off); v = BUNtail(bi,(BUN)(o-off)); - buninsfix(bn, dst, cnt, o, - (BUN) ((dbl) cnt / (dbl) (p-r) - * (dbl) (q-p) * 1.1 + 1024), - BATcapacity(bn) + q - p, BUN_NONE); - cnt += ((*cmp)(tl, v) == 0); + if ((*cmp)(tl, v) == 0) { + buninsfix(bn, dst, cnt, o, + (BUN) ((dbl) cnt / (dbl) (p-r) + * (dbl) (q-p) * 1.1 + 1024), + BATcapacity(bn) + q - p, BUN_NONE); + cnt++; + } p++; } } else if (anti) { @@ -688,17 +698,19 @@ fullscan_any(BAT *b, BAT *s, BAT *bn, co while (p < q) { o = (oid)(p + off); v = BUNtail(bi,(BUN)(o-off)); - buninsfix(bn, dst, cnt, o, - (BUN) ((dbl) cnt / (dbl) (p-r) - * (dbl) (q-p) * 1.1 + 1024), - BATcapacity(bn) + q - p, BUN_NONE); - cnt += ((nil == NULL || (*cmp)(v, nil) != 0) && - ((lval && - ((c = (*cmp)(tl, v)) > 0 || - (!li && c == 0))) || - (hval && - ((c = (*cmp)(th, v)) < 0 || - (!hi && c == 0))))); + if ((nil == NULL || (*cmp)(v, nil) != 0) && + ((lval && + ((c = (*cmp)(tl, v)) > 0 || + (!li && c == 0))) || + (hval && + ((c = (*cmp)(th, v)) < 0 || + (!hi && c == 0))))) { + buninsfix(bn, dst, cnt, o, + (BUN) ((dbl) cnt / (dbl) (p-r) + * (dbl) (q-p) * 1.1 + 1024), + BATcapacity(bn) + q - p, BUN_NONE); + cnt++; + } p++; } } else { @@ -710,23 +722,112 @@ fullscan_any(BAT *b, BAT *s, BAT *bn, co while (p < q) { o = (oid)(p + off); v = BUNtail(bi,(BUN)(o-off)); - buninsfix(bn, dst, cnt, o, - (BUN) ((dbl) cnt / (dbl) (p-r) - * (dbl) (q-p) * 1.1 + 1024), - BATcapacity(bn) + q - p, BUN_NONE); - cnt += ((nil == NULL || (*cmp)(v, nil) != 0) && - ((!lval || - (c = cmp(tl, v)) < 0 || - (li && c == 0)) && - (!hval || - (c = cmp(th, v)) > 0 || - (hi && c == 0)))); + if ((nil == NULL || (*cmp)(v, nil) != 0) && + ((!lval || + (c = cmp(tl, v)) < 0 || + (li && c == 0)) && + (!hval || + (c = cmp(th, v)) > 0 || + (hi && c == 0)))) { + buninsfix(bn, dst, cnt, o, + (BUN) ((dbl) cnt / (dbl) (p-r) + * (dbl) (q-p) * 1.1 + 1024), + BATcapacity(bn) + q - p, BUN_NONE); + cnt++; + } p++; } } return cnt; } +static BUN +fullscan_str(BAT *b, BAT *s, BAT *bn, const void *tl, const void *th, + int li, int hi, int equi, int anti, int lval, int hval, + BUN r, BUN q, BUN cnt, wrd off, oid *restrict dst, + const oid *candlist, BUN maximum, int use_imprints) +{ + var_t pos; + BUN p = r; + oid o = (oid) (p + off); + + if (!equi || !GDK_ELIMDOUBLES(b->T->vheap)) + return fullscan_any(b, s, bn, tl, th, li, hi, equi, anti, + lval, hval, r, q, cnt, off, dst, + candlist, maximum, use_imprints); + ALGODEBUG fprintf(stderr, + "#BATsubselect(b=%s#"BUNFMT",s=%s%s,anti=%d): " + "fullscan equi strelim\n", BATgetId(b), BATcount(b), + s ? BATgetId(s) : "NULL", + s && BATtdense(s) ? "(dense)" : "", anti); + if ((pos = strLocate(b->T->vheap, tl)) == 0) + return 0; + assert(pos >= GDK_VAROFFSET); + switch (b->T->width) { + case 1: { + const unsigned char *ptr = (const unsigned char *) Tloc(b, 0); + pos -= GDK_VAROFFSET; + while (p < q) { + if (ptr[p++] == pos) { + buninsfix(bn, dst, cnt, o, + (BUN) ((dbl) cnt / (dbl) (p-r) + * (dbl) (q-p) * 1.1 + 1024), + BATcapacity(bn) + q - p, BUN_NONE); + cnt++; + } + o++; + } + break; + } + case 2: { + const unsigned short *ptr = (const unsigned short *) Tloc(b, 0); + pos -= GDK_VAROFFSET; + while (p < q) { + if (ptr[p++] == pos) { + buninsfix(bn, dst, cnt, o, + (BUN) ((dbl) cnt / (dbl) (p-r) + * (dbl) (q-p) * 1.1 + 1024), + BATcapacity(bn) + q - p, BUN_NONE); + cnt++; + } + o++; + } + break; + } +#if SIZEOF_VAR_T == 8 + case 4: { + const unsigned int *ptr = (const unsigned int *) Tloc(b, 0); + while (p < q) { + if (ptr[p++] == pos) { + buninsfix(bn, dst, cnt, o, + (BUN) ((dbl) cnt / (dbl) (p-r) + * (dbl) (q-p) * 1.1 + 1024), + BATcapacity(bn) + q - p, BUN_NONE); + cnt++; + } + o++; + } + break; + } +#endif + default: { + const var_t *ptr = (const var_t *) Tloc(b, 0); + while (p < q) { + if (ptr[p++] == pos) { + buninsfix(bn, dst, cnt, o, + (BUN) ((dbl) cnt / (dbl) (p-r) + * (dbl) (q-p) * 1.1 + 1024), + BATcapacity(bn) + q - p, BUN_NONE); + cnt++; + } + o++; + } + break; + } + } + return cnt; +} + /* scan select type switch */ #ifdef HAVE_HGE #define scanfunc_hge(NAME, CAND, END) \ @@ -880,6 +981,9 @@ BAT_scanselect(BAT *b, BAT *s, BAT *bn, cnt = fullscan_hge(scanargs); break; #endif + case TYPE_str: + cnt = fullscan_str(scanargs); + break; default: cnt = fullscan_any(scanargs); break; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list