Changeset: 822b8d536c94 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=822b8d536c94
Modified Files:
        gdk/gdk_analytic.c
        gdk/gdk_analytic.h
        sql/backends/monet5/sql_rank.c
        sql/test/analytics/Tests/analytics02.sql
        sql/test/analytics/Tests/analytics02.stable.out
Branch: analytics
Log Message:

Overlapped average aggregate on a window.


diffs (truncated from 861 to 300 lines):

diff --git a/gdk/gdk_analytic.c b/gdk/gdk_analytic.c
--- a/gdk/gdk_analytic.c
+++ b/gdk/gdk_analytic.c
@@ -2537,245 +2537,233 @@ finish:
 #undef ANALYTICAL_PROD_IMP_FP
 #undef ANALYTICAL_PROD_IMP_FP_REAL
 
-#define ANALYTICAL_AVERAGE_TYPE_LNG_HGE(TPE,lng_hge)                \
-       do {                                                            \
-               TPE *pbp, *bp, a, v;                                        \
-               dbl *rp, *rb;                                               \
-               pbp = bp = (TPE*)Tloc(b, 0);                                \
-               rb = rp = (dbl*)Tloc(r, 0);                                 \
-               if (p) {                                                    \
-                       pnp = np = (bit*)Tloc(p, 0);                            
\
-                       end = np + cnt;                                         
\
-                       for(; np<end; np++) {                                   
\
-                               if (*np) {                                      
    \
-                                       ncnt = np - pnp;                        
        \
-                                       bp += ncnt;                             
        \
-                                       rp += ncnt;                             
        \
-                                       for(; pbp<bp; pbp++) {                  
        \
-                                               v = *pbp;                       
            \
-                                               if (!is_##TPE##_nil(v)) {       
            \
-                                                       ADD_WITH_CHECK(TPE, v, 
lng_hge, sum,    \
-                                                                               
   lng_hge, sum,            \
-                                                                               
   GDK_##lng_hge##_max,     \
-                                                                               
   goto avg_overflow##TPE); \
-                                                       /* count only when no 
overflow occurs */\
-                                                       n++;                    
                \
-                                               }                               
            \
-                                       }                                       
        \
-                                       if(0) {                                 
        \
-avg_overflow##TPE:                                                  \
-                                               assert(n > 0);                  
            \
-                                               if (sum >= 0) {                 
            \
-                                                       a = (TPE) (sum / 
(lng_hge) n);          \
-                                                       rr = (BUN) (sum % 
(SBUN) n);            \
-                                               } else {                        
            \
-                                                       sum = -sum;             
                \
-                                                       a = - (TPE) (sum / 
(lng_hge) n);        \
-                                                       rr = (BUN) (sum % 
(SBUN) n);            \
-                                                       if (r) {                
                \
-                                                               a--;            
                    \
-                                                               rr = n - rr;    
                    \
-                                                       }                       
                \
-                                               }                               
            \
-                                               for(; pbp<bp; pbp++) {          
            \
-                                                       v = *pbp;               
                \
-                                                       if (is_##TPE##_nil(v))  
                \
-                                                               continue;       
                    \
-                                                       AVERAGE_ITER(TPE, v, a, 
rr, n);         \
-                                               }                               
            \
-                                               curval = a + (dbl) rr / n;      
            \
-                                               goto calc_done##TPE;            
            \
-                                       }                                       
        \
-                                       curval = n > 0 ? (dbl) sum / n : 
dbl_nil;       \
-calc_done##TPE:                                                     \
-                                       has_nils = has_nils || (n == 0);        
        \
-                                       for (;rb < rp; rb++)                    
        \
-                                               *rb = curval;                   
            \
-                                       n = 0;                                  
        \
-                                       sum = 0;                                
        \
-                                       pnp = np;                               
        \
-                                       pbp = bp;                               
        \
-                               }                                               
    \
-                       }                                                       
\
-                       ncnt = np - pnp;                                        
\
-                       bp += ncnt;                                             
\
-                       rp += ncnt;                                             
\
-                       for(; pbp<bp; pbp++) {                                  
\
-                               v = *pbp;                                       
    \
-                               if (!is_##TPE##_nil(v)) {                       
    \
-                                       ADD_WITH_CHECK(TPE, v, lng_hge, sum,    
        \
-                                                                  lng_hge, 
sum,                    \
-                                                                  
GDK_##lng_hge##_max,             \
-                                                                  goto 
last_avg_overflow##TPE);    \
-                                       /* count only when no overflow occurs 
*/        \
-                                       n++;                                    
        \
-                               }                                               
    \
-                       }                                                       
\
-                       if(0) {                                                 
\
-last_avg_overflow##TPE:                                             \
-                               assert(n > 0);                                  
    \
-                               if (sum >= 0) {                                 
    \
-                                       a = (TPE) (sum / (lng_hge) n);          
        \
-                                       rr = (BUN) (sum % (SBUN) n);            
        \
-                               } else {                                        
    \
-                                       sum = -sum;                             
        \
-                                       a = - (TPE) (sum / (lng_hge) n);        
        \
-                                       rr = (BUN) (sum % (SBUN) n);            
        \
-                                       if (r) {                                
        \
-                                               a--;                            
            \
-                                               rr = n - rr;                    
            \
-                                       }                                       
        \
-                               }                                               
    \
-                               for(; pbp<bp; pbp++) {                          
    \
-                                       v = *pbp;                               
        \
-                                       if (is_##TPE##_nil(v))                  
        \
-                                               continue;                       
            \
-                                       AVERAGE_ITER(TPE, v, a, rr, n);         
        \
-                               }                                               
    \
-                               curval = a + (dbl) rr / n;                      
    \
-                               goto last_calc_done##TPE;                       
    \
-                       }                                                       
\
-                       curval = n > 0 ? (dbl) sum / n : dbl_nil;               
\
-last_calc_done##TPE:                                                \
-                       has_nils = has_nils || (n == 0);                        
\
-                       for (;rb < rp; rb++)                                    
\
-                               *rb = curval;                                   
    \
-               } else if (o || force_order) {                              \
-                   TPE *bend = bp + cnt;                                   \
-                       for(; bp<bend; bp++) {                                  
\
-                               v = *bp;                                        
    \
-                               if (!is_##TPE##_nil(v)) {                       
    \
-                                       ADD_WITH_CHECK(TPE, v, lng_hge, sum, 
lng_hge,   \
-                                                                  sum, 
GDK_##lng_hge##_max,        \
-                                                                  goto 
single_overflow##TPE);      \
-                                       /* count only when no overflow occurs 
*/        \
-                                       n++;                                    
        \
-                               }                                               
    \
-                       }                                                       
\
-                       if(0) {                                                 
\
-single_overflow##TPE:                                               \
-                               assert(n > 0);                                  
    \
-                               if (sum >= 0) {                                 
    \
-                                       a = (TPE) (sum / (lng_hge) n);          
        \
-                                       rr = (BUN) (sum % (SBUN) n);            
        \
-                               } else {                                        
    \
-                                       sum = -sum;                             
        \
-                                       a = - (TPE) (sum / (lng_hge) n);        
        \
-                                       rr = (BUN) (sum % (SBUN) n);            
        \
-                                       if (r) {                                
        \
-                                               a--;                            
            \
-                                               rr = n - rr;                    
            \
-                                       }                                       
        \
-                               }                                               
    \
-                               for(; bp<bend; bp++) {                          
    \
-                                       v = *bp;                                
        \
-                                       if (is_##TPE##_nil(v))                  
        \
-                                               continue;                       
            \
-                                       AVERAGE_ITER(TPE, v, a, rr, n);         
        \
-                               }                                               
    \
-                               curval = a + (dbl) rr / n;                      
    \
-                               goto single_calc_done##TPE;                     
    \
-                       }                                                       
\
-                       curval = n > 0 ? (dbl) sum / n : dbl_nil;               
\
-                       has_nils = (n == 0);                                    
\
-single_calc_done##TPE:                                              \
-                       rp += cnt;                                              
\
-                       for (;rb < rp; rb++)                                    
\
-                               *rb = curval;                                   
    \
-               } else { /* single value, ie no ordering */                 \
-                       dbl* rend = rp + cnt;                                   
\
-                       for(; rp<rend; rp++, bp++) {                            
\
-                               v = *bp;                                        
    \
-                               if(is_##TPE##_nil(v)) {                         
    \
-                                       *rp = dbl_nil;                          
        \
-                                       has_nils = true;                        
        \
-                               } else {                                        
    \
-                                       *rp = (dbl) v;                          
        \
-                               }                                               
    \
-                       }                                                       
\
-               }                                                           \
-               goto finish;                                                \
+#define ANALYTICAL_AVERAGE_NO_OVERLAP(TPE,lng_hge,LABEL)      \
+       do {                                                      \
+               for(; pbp<bp; pbp++) {                                \
+                       v = *pbp;                                         \
+                       if (!is_##TPE##_nil(v)) {                         \
+                               ADD_WITH_CHECK(TPE, v, lng_hge, sum, lng_hge, \
+                                                          sum, 
GDK_##lng_hge##_max,      \
+                                                          goto 
avg_overflow##TPE##LABEL##no_overlap); \
+                               /* count only when no overflow occurs */      \
+                               n++;                                          \
+                       }                                                 \
+               }                                                     \
+               if(0) {                                               \
+avg_overflow##TPE##LABEL##no_overlap:                         \
+                       assert(n > 0);                                    \
+                       if (sum >= 0) {                                   \
+                               a = (TPE) (sum / (lng_hge) n);                \
+                               rr = (BUN) (sum % (SBUN) n);                  \
+                       } else {                                          \
+                               sum = -sum;                                   \
+                               a = - (TPE) (sum / (lng_hge) n);              \
+                               rr = (BUN) (sum % (SBUN) n);                  \
+                               if (r) {                                      \
+                                       a--;                                    
  \
+                                       rr = n - rr;                            
  \
+                               }                                             \
+                       }                                                 \
+                       for(; pbp<bp; pbp++) {                            \
+                               v = *pbp;                                     \
+                               if (is_##TPE##_nil(v))                        \
+                                       continue;                               
  \
+                               AVERAGE_ITER(TPE, v, a, rr, n);               \
+                       }                                                 \
+                       curval = a + (dbl) rr / n;                        \
+                       goto calc_done##TPE##LABEL##no_overlap;           \
+               }                                                     \
+               curval = n > 0 ? (dbl) sum / n : dbl_nil;             \
+calc_done##TPE##LABEL##no_overlap:                            \
+               has_nils = has_nils || (n == 0);                      \
+               for (;rb < rp; rb++)                                  \
+                       *rb = curval;                                     \
+               n = 0;                                                \
+               sum = 0;                                              \
+       } while(0);
+
+#define ANALYTICAL_AVERAGE_OVERLAP(TPE,lng_hge,LABEL)             \
+       do {                                                          \
+               TPE *bs, *bl, *be;                                        \
+               bl = pbp;                                                 \
+               for(; pbp<bp;pbp++) {                                     \
+                       bs = (pbp > bl+start) ? pbp - start : bl;             \
+                       be = (pbp+end < bp) ? pbp + end + 1 : bp;             \
+                       for(; bs<be; bs++) {                                  \
+                               v = *bs;                                        
  \
+                               if (!is_##TPE##_nil(v)) {                       
  \
+                                       ADD_WITH_CHECK(TPE, v, lng_hge, sum, 
lng_hge, \
+                                                                  sum, 
GDK_##lng_hge##_max,      \
+                                                                  goto 
avg_overflow##TPE##LABEL##overlap); \
+                                       /* count only when no overflow occurs 
*/      \
+                                       n++;                                    
      \
+                               }                                               
  \
+                       }                                                     \
+                       if(0) {                                               \
+avg_overflow##TPE##LABEL##overlap:                                \
+                               assert(n > 0);                                  
  \
+                               if (sum >= 0) {                                 
  \
+                                       a = (TPE) (sum / (lng_hge) n);          
      \
+                                       rr = (BUN) (sum % (SBUN) n);            
      \
+                               } else {                                        
  \
+                                       sum = -sum;                             
      \
+                                       a = - (TPE) (sum / (lng_hge) n);        
      \
+                                       rr = (BUN) (sum % (SBUN) n);            
      \
+                                       if (r) {                                
      \
+                                               a--;                            
          \
+                                               rr = n - rr;                    
          \
+                                       }                                       
      \
+                               }                                               
  \
+                               for(; bs<be; bs++) {                            
  \
+                                       v = *bs;                                
      \
+                                       if (is_##TPE##_nil(v))                  
      \
+                                               continue;                       
          \
+                                       AVERAGE_ITER(TPE, v, a, rr, n);         
      \
+                               }                                               
  \
+                               curval = a + (dbl) rr / n;                      
  \
+                               goto calc_done##TPE##LABEL##overlap;            
  \
+                       }                                                     \
+                       curval = n > 0 ? (dbl) sum / n : dbl_nil;             \
+calc_done##TPE##LABEL##overlap:                                   \
+                       has_nils = has_nils || (n == 0);                      \
+                       *rb = curval;                                         \
+                       rb++;                                                 \
+                       n = 0;                                                \
+                       sum = 0;                                              \
+               }                                                         \
+       } while(0);
+
+#define ANALYTICAL_AVERAGE_LNG_HGE(TPE,lng_hge,IMP)   \
+       do {                                              \
+               TPE *pbp, *bp, a, v;                          \
+               dbl *rp, *rb;                                 \
+               pbp = bp = (TPE*)Tloc(b, 0);                  \
+               rb = rp = (dbl*)Tloc(r, 0);                   \
+               if (p) {                                      \
+                       pnp = np = (bit*)Tloc(p, 0);              \
+                       nend = np + cnt;                          \
+                       for(; np<nend; np++) {                    \
+                               if (*np) {                            \
+                                       ncnt = np - pnp;                  \
+                                       bp += ncnt;                       \
+                                       rp += ncnt;                       \
+                                       IMP(TPE,lng_hge,middle_partition) \
+                                       pnp = np;                         \
+                                       pbp = bp;                         \
+                               }                                     \
+                       }                                         \
+                       ncnt = np - pnp;                          \
+                       bp += ncnt;                               \
+                       rp += ncnt;                               \
+                       IMP(TPE,lng_hge,final_partition)          \
+               } else if (o || force_order) {                \
+                       bp += cnt;                                \
+                       rp += cnt;                                \
+                       IMP(TPE,lng_hge,single_partition)         \
+               } else {                                      \
+                       dbl* rend = rp + cnt;                     \
+                       for(; rp<rend; rp++, bp++) {              \
+                               v = *bp;                              \
+                               if(is_##TPE##_nil(v)) {               \
+                                       *rp = dbl_nil;                    \
+                                       has_nils = true;                  \
+                               } else {                              \
+                                       *rp = (dbl) v;                    \
+                               }                                     \
+                       }                                         \
+               }                                             \
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to