Changeset: 9b805eee7a0d for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9b805eee7a0d
Modified Files:
        gdk/gdk_group.c
        gdk/gdk_heap.c
        gdk/gdk_system.c
        gdk/gdk_system.h
        monetdb5/mal/mal_recycle.c
        sql/backends/monet5/sql.mx
        sql/backends/monet5/sql_user.c
        sql/include/sql_relation.h
Branch: default
Log Message:

merge with local clone


diffs (truncated from 976 to 300 lines):

diff --git a/gdk/gdk_group.c b/gdk/gdk_group.c
--- a/gdk/gdk_group.c
+++ b/gdk/gdk_group.c
@@ -70,6 +70,7 @@
  * At the MAL level, the multigroup function would perform the dynamic
  * optimization.
  */
+
 #define GRPnotfound()                                                  \
        do {                                                            \
                /* no equal found: start new group */                   \
@@ -96,11 +97,184 @@
                ngrp++;                                                 \
        } while (0)
 
-#define GRPhashloop(TYPE)                                              \
+
+#define GRP_compare_consecutive_values(INIT_0,INIT_1,COMP,KEEP)                
\
        do {                                                            \
-               TYPE *w = (TYPE *) Tloc(b, 0);                          \
-               for (r = BUNfirst(b), p = r, q = r + BATcount(b); p < q; p++) { 
\
-                       prb = hash_##TYPE(hs, &w[p]);                   \
+               INIT_0;                                                 \
+               for (r = BUNfirst(b), p = r + 1, q = r + BATcount(b);   \
+                    p < q;                                             \
+                    p++) {                                             \
+                       INIT_1;                                         \
+                       if ((grps && *grps != prev) || COMP) {          \
+                               GRPnotfound();                          \
+                       } else {                                        \
+                               ngrps[p - r] = ngrp - 1;                \
+                               if (histo)                              \
+                                       cnts[ngrp - 1]++;               \
+                       }                                               \
+                       KEEP;                                           \
+                       if (grps)                                       \
+                               prev = *grps++;                         \
+               }                                                       \
+       } while(0)
+
+#define GRP_compare_consecutive_values_tpe(TYPE)               \
+       GRP_compare_consecutive_values(                         \
+       /* INIT_0 */    TYPE *w = (TYPE *) Tloc(b, 0);          \
+                       TYPE pw = w[BUNfirst(b)]        ,       \
+       /* INIT_1 */                                    ,       \
+       /* COMP   */    w[p] != pw                      ,       \
+       /* KEEP   */    pw = w[p]                               \
+       )
+
+#define GRP_compare_consecutive_values_any()                   \
+       GRP_compare_consecutive_values(                         \
+       /* INIT_0 */    pv = BUNtail(bi, BUNfirst(b))   ,       \
+       /* INIT_1 */    v = BUNtail(bi, p)              ,       \
+       /* COMP   */    cmp(v, pv) != 0                 ,       \
+       /* KEEP   */    pv = v                                  \
+       )
+
+
+#define GRP_subscan_old_groups(INIT_0,INIT_1,COMP,KEEP)                        
\
+       do {                                                            \
+               INIT_0;                                                 \
+               pgrp[grps[0]] = BUNfirst(b);                            \
+               for (j = r = BUNfirst(b), p = r + 1, q = r + BATcount(b); \
+                    p < q;                                             \
+                    p++) {                                             \
+                       INIT_1;                                         \
+                       if (COMP) {                                     \
+                               /* range [j, p) is all same value */    \
+                               /* i is position where we saw p's old   \
+                                * group last */                        \
+                               i = pgrp[grps[p - r]];                  \
+                               /* p is new position where we saw this  \
+                                * group */                             \
+                               pgrp[grps[p - r]] = p;                  \
+                               if (j <= i && i < p)    {               \
+                                       /* i is position of equal       \
+                                        * value in same old group as   \
+                                        * p, so p gets same new group  \
+                                        * as i */                      \
+                                       oid grp = ngrps[i - r];         \
+                                       ngrps[p - r] = grp;             \
+                                       if (histo)                      \
+                                               cnts[grp]++;            \
+                                       if (gn->tsorted &&              \
+                                           grp != ngrp - 1)            \
+                                               gn->tsorted = 0;        \
+                                       /* we found the value/group     \
+                                        * combination, go to next      \
+                                        * value */                     \
+                                       continue;                       \
+                               }                                       \
+                       } else {                                        \
+                               /* value differs from previous value */ \
+                               j = p;                                  \
+                               KEEP;                                   \
+                               pgrp[grps[p - r]] = p;                  \
+                       }                                               \
+                       /* start a new group */                         \
+                       GRPnotfound();                                  \
+               }                                                       \
+       } while(0)
+
+#define GRP_subscan_old_groups_tpe(TYPE)                       \
+       GRP_subscan_old_groups(                                 \
+       /* INIT_0 */    TYPE *w = (TYPE *) Tloc(b, 0);          \
+                       TYPE pw = w[BUNfirst(b)]        ,       \
+       /* INIT_1 */                                    ,       \
+       /* COMP   */    w[p] == pw                      ,       \
+       /* KEEP   */    pw = w[p]                               \
+       )
+
+#define GRP_subscan_old_groups_any()                           \
+       GRP_subscan_old_groups(                                 \
+       /* INIT_0 */    pv = BUNtail(bi, BUNfirst(b))   ,       \
+       /* INIT_1 */    v = BUNtail(bi, p)              ,       \
+       /* COMP   */    cmp(v, pv) == 0                 ,       \
+       /* KEEP   */    pv = v                                  \
+       )
+
+
+#define GRP_use_existing_hash_table(INIT_0,INIT_1,HASH,COMP)           \
+       do {                                                            \
+               INIT_0;                                                 \
+               for (r = BUNfirst(b), p = r, q = r + BATcount(b);       \
+                    p < q;                                             \
+                    p++) {                                             \
+                       INIT_1;                                         \
+                       /* this loop is similar, but not equal, to      \
+                        * HASHloop: the difference is that we only     \
+                        * consider BUNs smaller than the one we're     \
+                        * looking up (p), and that we also consider    \
+                        * the input groups */                          \
+                       if (grps) {                                     \
+                               for (hb = HASHget(hs, HASH);            \
+                                    hb != HASHnil(hs);                 \
+                                    hb = HASHgetlink(hs, hb)) {        \
+                                       if (hb < p &&                   \
+                                           grps[hb - r] == grps[p - r] && \
+                                           COMP) {                     \
+                                               oid grp = ngrps[hb - r]; \
+                                               ngrps[p - r] = grp;     \
+                                               if (histo)              \
+                                                       cnts[grp]++;    \
+                                               if (gn->tsorted &&      \
+                                                   grp != ngrp - 1)    \
+                                                       gn->tsorted = 0; \
+                                               break;                  \
+                                       }                               \
+                               }                                       \
+                       } else {                                        \
+                               for (hb = HASHget(hs, HASH);            \
+                                    hb != HASHnil(hs);                 \
+                                    hb = HASHgetlink(hs, hb)) {        \
+                                       if (hb < p &&                   \
+                                           COMP) {                     \
+                                               oid grp = ngrps[hb - r]; \
+                                               ngrps[p - r] = grp;     \
+                                               if (histo)              \
+                                                       cnts[grp]++;    \
+                                               if (gn->tsorted &&      \
+                                                   grp != ngrp - 1)    \
+                                                       gn->tsorted = 0; \
+                                               break;                  \
+                                       }                               \
+                               }                                       \
+                       }                                               \
+                       if (hb == HASHnil(hs)) {                        \
+                               GRPnotfound();                          \
+                       }                                               \
+               }                                                       \
+       } while(0)
+
+#define GRP_use_existing_hash_table_tpe(TYPE)                  \
+       GRP_use_existing_hash_table(                            \
+       /* INIT_0 */    TYPE *w = (TYPE *) Tloc(b, 0)   ,       \
+       /* INIT_1 */                                    ,       \
+       /* HASH   */    hash_##TYPE(hs, &w[p])          ,       \
+       /* COMP   */    w[p] == w[hb]                           \
+       )
+
+#define GRP_use_existing_hash_table_any()                      \
+       GRP_use_existing_hash_table(                            \
+       /* INIT_0 */                                    ,       \
+       /* INIT_1 */    v = BUNtail(bi, p)              ,       \
+       /* HASH   */    HASHprobe(hs, v)                ,       \
+       /* COMP   */    cmp(v, BUNtail(bi, hb)) == 0            \
+       )
+
+
+#define GRP_create_partial_hash_table(INIT_0,INIT_1,HASH,COMP)         \
+       do {                                                            \
+               INIT_0;                                                 \
+               for (r = BUNfirst(b), p = r, q = r + BATcount(b);       \
+                    p < q;                                             \
+                    p++) {                                             \
+                       INIT_1;                                         \
+                       prb = HASH;                                     \
                        if (gc) {                                       \
                                for (hb = HASHget(hs,prb);              \
                                     hb != HASHnil(hs) &&               \
@@ -108,7 +282,7 @@
                                     hb = HASHgetlink(hs,hb)) {         \
                                        assert( HASHgetlink(hs,hb) == 
HASHnil(hs) \
                                               || HASHgetlink(hs,hb) < hb); \
-                                       if (w[p] == w[hb]) {            \
+                                       if (COMP) {             \
                                                oid grp = ngrps[hb - r]; \
                                                ngrps[p - r] = grp;     \
                                                if (histo)              \
@@ -121,8 +295,7 @@
                                }                                       \
                                if (hb != HASHnil(hs) &&                \
                                    grps[hb - r] != grps[p - r]) {      \
-                                       /* we didn't assign a group */  \
-                                       /* yet */                       \
+                                       /* no group assigned yet */     \
                                        hb = HASHnil(hs);               \
                                }                                       \
                        } else if (grps) {                              \
@@ -131,7 +304,7 @@
                                     hb != HASHnil(hs);                 \
                                     hb = HASHgetlink(hs,hb)) {         \
                                        if (grps[hb - r] == grps[p - r] && \
-                                           w[p] == w[hb]) {            \
+                                           COMP) {                     \
                                                oid grp = ngrps[hb - r]; \
                                                ngrps[p - r] = grp;     \
                                                if (histo)              \
@@ -146,7 +319,7 @@
                                for (hb = HASHget(hs,prb);              \
                                     hb != HASHnil(hs);                 \
                                     hb = HASHgetlink(hs,hb)) {         \
-                                       if (w[p] == w[hb]) {            \
+                                       if (COMP) {             \
                                                oid grp = ngrps[hb - r]; \
                                                ngrps[p - r] = grp;     \
                                                if (histo)              \
@@ -167,6 +340,23 @@
                }                                                       \
        } while (0)
 
+#define GRP_create_partial_hash_table_tpe(TYPE)                        \
+       GRP_create_partial_hash_table(                          \
+       /* INIT_0 */    TYPE *w = (TYPE *) Tloc(b, 0)   ,       \
+       /* INIT_1 */                                    ,       \
+       /* HASH   */    hash_##TYPE(hs, &w[p])          ,       \
+       /* COMP   */    w[p] == w[hb]                           \
+       )
+
+#define GRP_create_partial_hash_table_any()                    \
+       GRP_create_partial_hash_table(                          \
+       /* INIT_0 */                                    ,       \
+       /* INIT_1 */    v = BUNtail(bi, p)              ,       \
+       /* HASH   */    hash_any(hs, v)                 ,       \
+       /* COMP   */    cmp(v, BUNtail(bi, hb)) == 0            \
+       )
+
+
 gdk_return
 BATgroup_internal(BAT **groups, BAT **extents, BAT **histo,
                  BAT *b, BAT *g, BAT *e, BAT *h, int subsorted)
@@ -369,36 +559,50 @@ BATgroup_internal(BAT **groups, BAT **ex
                                  subsorted);
                if (grps)
                        prev = *grps++;
-               pv = BUNtail(bi, BUNfirst(b));
                ngrps[0] = ngrp;
                ngrp++;
                if (extents)
                        exts[0] = b->hseqbase;
                if (histo)
                        cnts[0] = 1;
-               for (r = BUNfirst(b), p = r + 1, q = r + BATcount(b);
-                    p < q;
-                    p++) {
-                       v = BUNtail(bi, p);
-                       if ((grps && *grps != prev) || cmp(pv, v) != 0) {
-                               GRPnotfound();
-                       } else {
-                               ngrps[p - r] = ngrp - 1;
-                               if (histo)
-                                       cnts[ngrp - 1]++;
-                       }
-                       pv = v;
-                       if (grps)
-                               prev = *grps++;
+
+               switch (ATOMstorage(b->ttype)) {
+               case TYPE_bte:
+                       GRP_compare_consecutive_values_tpe(bte);
+                       break;
+               case TYPE_sht:
+                       GRP_compare_consecutive_values_tpe(sht);
+                       break;
+               case TYPE_int:
+                       GRP_compare_consecutive_values_tpe(int);
+                       break;
+               case TYPE_lng:
+                       GRP_compare_consecutive_values_tpe(lng);
+                       break;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to