Changeset: 6ef0cf537677 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/6ef0cf537677
Modified Files:
        monetdb5/modules/mal/heapn.c
Branch: pp_hashjoin
Log Message:

improved heapn code for grouped topn - order


diffs (133 lines):

diff --git a/monetdb5/modules/mal/heapn.c b/monetdb5/modules/mal/heapn.c
--- a/monetdb5/modules/mal/heapn.c
+++ b/monetdb5/modules/mal/heapn.c
@@ -756,10 +756,9 @@ gheap_ins_##T( heapn *hp, size_t pos, in
        subheap *sh = hp->sub;                          \
        if (sh) {                                                       \
                T *ivals = sh->ivals;                   \
-               T val = ivals[pos];                             \
                T *vals = sh->vals;                             \
                                                                                
\
-               vals[vpos] = val;                               \
+               vals[vpos] = ivals[pos];                \
                if (sh->sub)                                    \
                        *err = subheap_ins( sh->sub, pos, vpos);        \
        }                                                                       
\
@@ -833,14 +832,14 @@ topn_##T( size_t n, oid *pos, oid *sl, h
 }                                                      \
                                                        \
 static size_t                          \
-topn_grouped_##T( size_t n, oid *pos, oid *sl, heapn *hp, int *err)            
        \
+topn_grouped_##T( size_t cnt, oid *pos, oid *sl, heapn *hp, int *err)          
        \
 {                                                      \
        size_t i = 0, j = 0;    \
                                                        \
        subheap *sh = hp->sub;  \
        if (!sh) {                              \
                if (hp->used < hp->size) {      \
-                       for(i=0; i<n; i++) {    \
+                       for(i=0; i<cnt; i++) {  \
                                if (hp->useda[hp->gi[i]] < hp->size) { \
                                        pos[i] = gheap_ins_##T(hp, i, err);     
\
                                        sl[i] = i;              \
@@ -855,8 +854,8 @@ topn_grouped_##T( size_t n, oid *pos, oi
        \
        if (sh->nlarge) {               \
                if (sh->min) {          \
-                       for(; i<n; i++) {                                       
        \
-                               if (hp->useda[hp->gi[i]] < hp->size) { \
+                       for(; i<cnt; i++) {                                     
        \
+                               if (!hp->fulla[hp->gi[i]]) { \
                                        pos[j] = gheap_ins_##T(hp, i, err);     
        \
                                        sl[j] = i;      \
                                        j++;    \
@@ -872,8 +871,8 @@ topn_grouped_##T( size_t n, oid *pos, oi
                                }                       \
                        }                               \
                } else {                        \
-                       for(; i<n; i++) {                                       
        \
-                               if (hp->useda[hp->gi[i]] < hp->size) { \
+                       for(; i<cnt; i++) {                                     
        \
+                               if (!hp->fulla[hp->gi[i]]) { \
                                        pos[j] = gheap_ins_##T(hp, i, err);     
        \
                                        sl[j] = i;      \
                                        j++;    \
@@ -890,8 +889,8 @@ topn_grouped_##T( size_t n, oid *pos, oi
                        }                               \
                }                                       \
        } else if (sh->min) {   \
-               for(; i<n; i++) {       \
-                       if (hp->useda[hp->gi[i]] < hp->size) { \
+               for(; i<cnt; i++) {     \
+                       if (!hp->fulla[hp->gi[i]]) { \
                                pos[j] = gheap_ins_##T(hp, i, err);             
\
                                sl[j] = i;      \
                                j++;            \
@@ -907,8 +906,8 @@ topn_grouped_##T( size_t n, oid *pos, oi
                        }                               \
                }                                       \
        } else {                                \
-               for(; i<n; i++) {       \
-                       if (hp->useda[hp->gi[i]] < hp->size) { \
+               for(; i<cnt; i++) {     \
+                       if (!hp->fulla[hp->gi[i]]) { \
                                pos[j] = gheap_ins_##T(hp, i, err);             
\
                                sl[j] = i;      \
                                j++;            \
@@ -1807,13 +1806,11 @@ HEAPtopn(Client cntxt, MalBlkPtr m, MalS
        if (hp->grouped) { \
                for(size_t g = 0; g < hp->gsize; g++) { \
                        oid *pos = hp->pos + g * hp->size;  \
+                       used = hp->useda[g]-1 + j;                              
\
                        if (offset >= hp->useda[g])                     \
                                continue;                                       
        \
-                       for(i = 0; i<offset; i++)                       \
-                               (void) gheap_del_##T(hp, g);    \
-                       j += hp->useda[g];                                      
\
-                       for(i = 0; hp->useda[g]; i++) {                 \
-                               rp[j-(i+1)] = pos[0];                   \
+                       for(i = 0; hp->useda[g]-offset; i++, j++) {             
\
+                               rp[used-offset-i] = pos[0];             \
                                (void) gheap_del_##T(hp, g);    \
                        }                                                       
                \
                }                                                               
                \
@@ -1847,8 +1844,10 @@ HEAPorder(Client ctx, bat *rid, bat *hb,
                BBPreclaim(r);
                throw(MAL, "heapn.order", "offset (%zu) too high\n", offset);
        }
-       size_t used = hp->used-1, i = 0;
+       size_t used = hp-> used-1, i = 0;
        BUN j = 0;
+       if (!hp->shared)
+               offset = 0;
        if (!hp->sub || (!hp->shared && hp->grouped)) {
                for(size_t g = 0; g < hp->gsize; g++) {
                        oid *pos = hp->pos + g * hp->size;
@@ -1856,6 +1855,7 @@ HEAPorder(Client ctx, bat *rid, bat *hb,
                                continue;
                        for (i = 0; i < hp->useda[g]-offset; i++)
                                rp[j++] = pos[offset+i];
+
                }
        } else if (!hp->sub->vb->ttype) {
                order(lng);
@@ -1883,16 +1883,13 @@ HEAPorder(Client ctx, bat *rid, bat *hb,
                order(dbl);
        } else {
                if (hp->grouped) {
-                       BUN j = 0;
                        for(size_t g = 0; g < hp->gsize; g++) {
                                oid *pos = hp->pos + g * hp->size;
                                if (offset >= hp->useda[g])
                                        continue;
-                               for(i = 0; i<offset; i++)
-                                       (void) gheap_del_any(hp, g);
-                               j += hp->useda[g];
-                               for(; hp->useda[g]; i++) {
-                                       rp[j-(i+1)] = pos[0];
+                               used = hp->useda[g]-1 + j;
+                               for(i=0; hp->useda[g]-offset; i++, j++) {
+                                       rp[used-offset-i] = pos[0];
                                        (void) gheap_del_any(hp, g);
                                }
                        }
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to