Changeset: 0461f4e47b3b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/0461f4e47b3b
Branch: ppbench
Log Message:

merged with pp_hashjoin


diffs (279 lines):

diff --git a/gdk/gdk_sketch.c b/gdk/gdk_sketch.c
--- a/gdk/gdk_sketch.c
+++ b/gdk/gdk_sketch.c
@@ -22,7 +22,8 @@
 static inline double
 sigma(double x)
 {
-       if (x == 1.) return INFINITY;
+       if (x == 1.)
+               return INFINITY;
        double y = 1;
        double z = x;
        double z_prime;
@@ -31,7 +32,7 @@ sigma(double x)
                z_prime = z;
                z += x * y;
                y += y;
-       } while(z_prime != z);
+       } while (z_prime != z);
        return z;
 }
 
@@ -41,7 +42,8 @@ sigma(double x)
 static inline double
 tau(double x)
 {
-       if (x == 0. || x == 1.) return 0.;
+       if (x == 0. || x == 1.)
+               return 0.;
        double y = 1.0;
        double z = 1 - x;
        double z_prime;
@@ -50,7 +52,7 @@ tau(double x)
                z_prime = z;
                y *= 0.5;
                z -= pow(1 - x, 2) * y;
-       } while(z_prime != z);
+       } while (z_prime != z);
        return z / 3;
 }
 
@@ -69,81 +71,141 @@ sketch_estimate(uint8_t cnt_sketch[BUCKE
                                K = clz;
                K == -1 ? C[0]++ : C[K + 1]++;
        }
-       double t = tau(1.0 - ((double)C[CLZ_BUCKETS] / BUCKETS));
-       double z = (double)BUCKETS * t;
+       double t = tau(1.0 - ((double) C[CLZ_BUCKETS] / BUCKETS));
+       double z = (double) BUCKETS * t;
        for (int k = CLZ_BUCKETS; k >= 1; k--)
-               z = 0.5 * (z + (double)C[k]);
-       double s = sigma((double)C[0] / BUCKETS);
-       z += (double)BUCKETS * s;
+               z = 0.5 * (z + (double) C[k]);
+       double s = sigma((double) C[0] / BUCKETS);
+       z += (double) BUCKETS * s;
        const double alpha = 0.7213475204444817;
-       return alpha * (double)BUCKETS * BUCKETS / z;
+       return alpha * (double) BUCKETS * BUCKETS / z;
 }
 
+#define my_is_int_nil(v) ((*(int *) v) == GDK_int_min - 1)
+#define my_is_lng_nil(v) ((*(lng *) v) == GDK_lng_min - 1)
+#define my_is_str_nil(v) strNil(v)
+
+#define my_sizeof_int(v) sizeof(int)
+#define my_sizeof_lng(v) sizeof(lng)
+#define my_sizeof_str(v) strlen(v)
+
+/* #define my_get_val_int(ptr, i) ptr[i] */
+/* #define my_get_val_lng(ptr, i) ptr[i] */
+/* #define my_get_val_str(ptr, i) */
+
+#define SKETCH_UPDATE(CNTING_SKETCH, HASH)                             \
+       do {                                                            \
+               bucket = hash & BITS_MASK;                              \
+               hash |= BITS_MASK;                                      \
+               clz = __builtin_clzll(hash);                            \
+               assert(clz <= 58);                                      \
+               if (CNTING_SKETCH[bucket][clz] <= 128) {                \
+                       CNTING_SKETCH[bucket][clz]++;                   \
+               } else {                                                \
+                       if (rng_i == 0 && getentropy(rng_buf, 256 /* maximum 
*/) != 0) { \
+                               /* TRC_ERROR(ACCELERATOR, "Failed to generate 
sketch seed." */ \
+                               /*        "Aborting count distinct 
estimation."); */ \
+                               rc = GDK_FAIL;                          \
+                               break;                                  \
+                       }                                               \
+                       uint64_t rng = rng_buf[rng_i];                  \
+                       rng_i = rng_i > 31 ? 0 : rng_i + 1;             \
+                       uint8_t k = CNTING_SKETCH[bucket][clz] - 128;   \
+                       if ((rng & ((1ULL << k) - 1)) == 0)             \
+                               CNTING_SKETCH[bucket][clz]++;           \
+               }                                                       \
+       } while (0)
+
+#define SKETCH_POPULATE(TYPE)                                          \
+       do {                                                            \
+               oid hseq = b->hseqbase;                                 \
+               /* uint64_t murmur3_out[2]; */                          \
+               uint64_t hash;                                          \
+               uint8_t bucket;                                         \
+               uint8_t clz;                                            \
+               uint64_t rng_buf[32];                                   \
+               int rng_i = 0;                                          \
+               TIMEOUT_LOOP(n_bci.ncand, qry_ctx) {                    \
+                       oid p = canditer_next(&n_bci) - hseq;           \
+                       const void *ptr = BUNtail(&n_bi, p);            \
+                       if (!my_is_##TYPE##_nil(ptr)) {                 \
+                               hash = XXH64(ptr, my_sizeof_##TYPE(ptr), 
HLLSEED); \
+                               SKETCH_UPDATE(cnting_sketch, hash);     \
+                       }                                               \
+               }                                                       \
+       } while (0)
+
+/* #define SKETCH_POPULATE_DENSE(TYPE)                                 \ */
+/*     do {                                                            \ */
+/*             uint64_t hash;                                          \ */
+/*             uint8_t bucket;                                         \ */
+/*             uint8_t clz;                                            \ */
+/*             uint64_t rng_buf[32];                                   \ */
+/*             int rng_i = 0;                                          \ */
+/*             TYPE *p = Tloc(b, 0);                                   \ */
+/*             TIMEOUT_LOOP_IDX_DECL(i, BATcount(b), qry_ctx) {        \ */
+/*                     const void *ptr = TODO;                         \ */
+/*                     if (!my_is_##TYPE##_nil(ptr)) {                 \ */
+/*                             hash = XXH64(ptr, my_sizeof_##TYPE(ptr), 
HLLSEED); \ */
+/*                             SKETCH_UPDATE(cnting_sketch, hash);     \ */
+/*                     }                                               \ */
+/*             }                                                       \ */
+/*     } while (0) */
+
 int
-sketch_populate(BAT* b, BATiter *bi, struct canditer *bci,
+sketch_populate(BAT *b, BATiter *bi, struct canditer *bci,
                uint8_t cnting_sketch[BUCKETS][CLZ_BUCKETS])
 {
-       oid hseq = b->hseqbase;
-       /* uint64_t murmur3_out[2]; */
-       uint64_t hash;
-       uint8_t bucket;
-
-       uint8_t clz;
-
+       gdk_return rc = GDK_SUCCEED;
        QryCtx *qry_ctx = MT_thread_get_qry_ctx();
-       canditer_reset(bci);
-       TIMEOUT_LOOP(bci->ncand, qry_ctx) {
-               BUN p = canditer_next(bci) - hseq;
-               const void *ptr = BUNtail(bi, p);
-               switch (bi->type) {
-               case TYPE_int:
-                       if (is_int_nil(*(int *)ptr))
-                               continue;
-                       else
-                               /* MurmurHash3_x64_128(ptr, sizeof(int), 
HLLSEED, murmur3_out); */
-                               /* hash = murmur3_out[1]; */
-                               hash = XXH64(ptr, sizeof(int), HLLSEED);
-                       break;
-               case TYPE_lng:
-                       if (is_lng_nil(*(lng *)ptr))
-                               continue;
-                       else
-                               /* MurmurHash3_x64_128(ptr, sizeof(lng), 
HLLSEED, murmur3_out); */
-                               /* hash = murmur3_out[1]; */
-                               hash = XXH64(ptr, sizeof(lng), HLLSEED);
-                       break;
-               case TYPE_str:
-                       if (strNil(ptr))
-                               continue;
-                       else
-                               /* MurmurHash3_x64_128(ptr, strlen(ptr), 
HLLSEED, murmur3_out); */
-                               /* hash = murmur3_out[1]; */
-                               hash = XXH64(ptr, strlen(ptr), HLLSEED);
-                       break;
-               default:
-                       /* TRC_ERROR(ACCELERATOR, "Type not supported for 
counting sketches." */
-                       /*        "Aborting count distinct estimation."); */
-                       return -1;
-               }
-               bucket = hash & BITS_MASK;
-               hash |= BITS_MASK;
-               clz = __builtin_clzll(hash);
-               assert(clz <= 58);
-               if (cnting_sketch[bucket][clz] <= 128) {
-                       cnting_sketch[bucket][clz]++;
-               } else {
-                       uint8_t k = cnting_sketch[bucket][clz] - 128;
-                       uint64_t rng;
-                       if (getentropy(&rng, sizeof(rng)) != 0) {
-                               /* TRC_ERROR(ACCELERATOR, "Failed to generate 
sketch seed." */
-                               /*        "Aborting count distinct 
estimation."); */
-                               return -1;
-                       }
-                       if ((rng & ((1ULL << k) - 1)) == 0)
-                               cnting_sketch[bucket][clz]++;
-               }
+
+       /* if (!bi && !bci) { */
+       /*      switch (b->ttype) { */
+       /*      case TYPE_int: */
+       /*              SKETCH_POPULATE_DENSE(int); */
+       /*              break; */
+       /*      case TYPE_lng: */
+       /*              SKETCH_POPULATE_DENSE(lng); */
+       /*              break; */
+       /*      case TYPE_str: */
+       /*              SKETCH_POPULATE_DENSE(str); */
+       /*              break; */
+       /*      default: */
+       /*              /\* TRC_ERROR(ACCELERATOR, "Type not supported for 
counting sketches." *\/ */
+       /*              /\*       "Aborting count distinct estimation."); *\/ */
+       /*              break; */
+       /*      } */
+       /* } */
+
+       BATiter n_bi = bi ? *bi : bat_iterator(b);
+       struct canditer n_bci;
+       if (bci == NULL) {
+               canditer_init(&n_bci, b, NULL);
+       } else {
+               n_bci = *bci;
+               canditer_reset(&n_bci);
        }
-       return 0;
+
+       switch (n_bi.type) {
+       case TYPE_int:
+               SKETCH_POPULATE(int);
+               break;
+       case TYPE_lng:
+               SKETCH_POPULATE(lng);
+               break;
+       case TYPE_str:
+               SKETCH_POPULATE(str);
+               break;
+       default:
+               /* TRC_ERROR(ACCELERATOR, "Type not supported for counting 
sketches." */
+               /*        "Aborting count distinct estimation."); */
+               break;
+       }
+
+       if (bi == NULL)
+               bat_iterator_end(&n_bi);
+
+       return rc;
 }
 
 /* void */
@@ -164,16 +226,8 @@ bat_guess_uniques(BAT *b, BATiter *bi, s
        uint8_t cnting_sketch[BUCKETS][CLZ_BUCKETS] = {0};
        double unique_guess = 0;
 
-       BATiter nbi = bi ? *bi : bat_iterator(b);
-       struct canditer nbci;
-       if (bci == NULL)
-               canditer_init(&nbci, b, NULL);
-
-       if (sketch_populate(b, &nbi, &nbci, cnting_sketch) == 0)
+       if (sketch_populate(b, bi, bci, cnting_sketch) == GDK_SUCCEED)
                unique_guess = sketch_estimate(cnting_sketch);
 
-       if (bi == NULL)
-               bat_iterator_end(&nbi);
-
        return unique_guess;
 }
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -3980,7 +3980,7 @@ accessing_merge(list *acc, list *nacc)
 static sql_rel *
 rel_smallest(sql_rel *r, list *outer_refs)
 {
-       if (r->op != op_join || !list_empty(r->exps))
+       if (r->op != op_join /*|| !list_empty(r->exps)*/)
                return r;
        sql_rel *rl = r->l;
        sql_rel *rr = r->r;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to