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

Reply via email to