Changeset: 006f6023d430 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=006f6023d430
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 min and max functions on a window.


diffs (truncated from 958 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
@@ -961,186 +961,246 @@ finish:
 
 #undef ANALYTICAL_LEAD_IMP
 
-#define ANALYTICAL_LIMIT_IMP(TPE, OP)                        \
-       do {                                                     \
-               TPE *rp, *rb, *pbp, *bp, *rend, curval, v;           \
-               rb = rp = (TPE*)Tloc(r, 0);                          \
-               pbp = bp = (TPE*)Tloc(b, 0);                         \
-               curval = *bp;                                        \
-               rend = rp + cnt;                                     \
-               if (p) {                                             \
-                       pnp = np = (bit*)Tloc(p, 0);                     \
-                       end = np + cnt;                                  \
-                       for(; np<end; np++) {                            \
-                               if (*np) {                                   \
-                                       ncnt = (np - pnp);                      
 \
-                                       rp += ncnt;                             
 \
-                                       bp += ncnt;                             
 \
-                                       for(; pbp<bp; pbp++) {                  
 \
-                                               v = *pbp;                       
     \
-                                               if(!is_##TPE##_nil(v)) {        
     \
-                                                       
if(is_##TPE##_nil(curval))       \
-                                                               curval = v;     
             \
-                                                       else                    
         \
-                                                               curval = OP(v, 
curval);      \
-                                               }                               
     \
-                                       }                                       
 \
-                                       if(is_##TPE##_nil(curval))              
 \
-                                               has_nils = true;                
     \
-                                       for (;rb < rp; rb++)                    
 \
-                                               *rb = curval;                   
     \
-                                       curval = *bp;                           
 \
-                                       pnp = np;                               
 \
-                                       pbp = bp;                               
 \
-                               }                                            \
-                       }                                                \
-                       ncnt = (np - pnp);                               \
-                       rp += ncnt;                                      \
-                       bp += ncnt;                                      \
-                       for(; pbp<bp; pbp++) {                           \
-                               v = *pbp;                                    \
-                               if(!is_##TPE##_nil(v)) {                     \
-                                       if(is_##TPE##_nil(curval))              
 \
-                                               curval = v;                     
     \
-                                       else                                    
 \
-                                               curval = OP(v, curval);         
     \
-                               }                                            \
-                       }                                                \
-                       if(is_##TPE##_nil(curval))                       \
-                               has_nils = true;                             \
-                       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)) {                     \
-                                       if(is_##TPE##_nil(curval))              
 \
-                                               curval = v;                     
     \
-                                       else                                    
 \
-                                               curval = OP(v, curval);         
     \
-                               }                                            \
-                       }                                                \
-                       if(is_##TPE##_nil(curval))                       \
-                               has_nils = true;                             \
-                       for(;rb<rend; rb++)                              \
-                               *rb = curval;                                \
-               } else { /* single value, ie no ordering */          \
-                       for(; rp<rend; rp++, bp++) {                     \
-                               v = *bp;                                     \
-                               if(is_##TPE##_nil(v))                        \
-                                       has_nils = true;                        
 \
-                               *rp = v;                                     \
-                       }                                                \
-               }                                                    \
+#define ANALYTICAL_LIMIT_IMP_NO_OVERLAP(TPE, IMP) \
+       do {                                          \
+               curval = *pbp;                            \
+               pbp++;                                    \
+               for(; pbp<bp; pbp++) {                    \
+                       v = *pbp;                             \
+                       if(!is_##TPE##_nil(v)) {              \
+                               if(is_##TPE##_nil(curval))        \
+                                       curval = v;                   \
+                               else                              \
+                                       curval = IMP(v, curval);      \
+                       }                                     \
+               }                                         \
+               for (;rb < rp; rb++)                      \
+                       *rb = curval;                         \
+               if(is_##TPE##_nil(curval))                \
+                       has_nils = true;                      \
+       } while(0);
+
+#define ANALYTICAL_LIMIT_IMP_OVERLAP(TPE, IMP)        \
+       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; \
+                       curval = *bs;                             \
+                       bs++;                                     \
+                       for(; bs<be; bs++) {                      \
+                               v = *bs;                              \
+                               if(!is_##TPE##_nil(v)) {              \
+                                       if(is_##TPE##_nil(curval))        \
+                                               curval = v;                   \
+                                       else                              \
+                                               curval = IMP(v, curval);      \
+                               }                                     \
+                       }                                         \
+                       *rb = curval;                             \
+                       rb++;                                     \
+                       if(is_##TPE##_nil(curval))                \
+                               has_nils = true;                      \
+               }                                             \
+       } while(0);
+
+#define ANALYTICAL_LIMIT_IMP(TPE, IMP, REAL)       \
+       do {                                           \
+               TPE *rp, *rb, *pbp, *bp, *rend, curval, v; \
+               rb = rp = (TPE*)Tloc(r, 0);                \
+               pbp = bp = (TPE*)Tloc(b, 0);               \
+               rend = rp + cnt;                           \
+               if (p) {                                   \
+                       pnp = np = (bit*)Tloc(p, 0);           \
+                       nend = np + cnt;                       \
+                       for(; np<nend; np++) {                 \
+                               if (*np) {                         \
+                                       ncnt = (np - pnp);             \
+                                       rp += ncnt;                    \
+                                       bp += ncnt;                    \
+                                       REAL(TPE, IMP)                 \
+                                       pnp = np;                      \
+                                       pbp = bp;                      \
+                               }                                  \
+                       }                                      \
+                       ncnt = (np - pnp);                     \
+                       rp += ncnt;                            \
+                       bp += ncnt;                            \
+                       REAL(TPE, IMP)                         \
+               } else if (o || force_order) {             \
+                       rp += cnt;                             \
+                       bp += cnt;                             \
+                       REAL(TPE, IMP)                         \
+               } else {                                   \
+                       for(; rp<rend; rp++, bp++) {           \
+                               v = *bp;                           \
+                               if(is_##TPE##_nil(v))              \
+                                       has_nils = true;               \
+                               *rp = v;                           \
+                       }                                      \
+               }                                          \
        } while(0);
 
 #ifdef HAVE_HUGE
-#define ANALYTICAL_LIMIT_IMP_HUGE(IMP) \
-       case TYPE_hge:                     \
-               ANALYTICAL_LIMIT_IMP(hge, IMP) \
+#define ANALYTICAL_LIMIT_IMP_HUGE(IMP, REAL) \
+       case TYPE_hge:                           \
+               ANALYTICAL_LIMIT_IMP(hge, IMP, REAL) \
        break;
 #else
-#define ANALYTICAL_LIMIT_IMP_HUGE(IMP)
+#define ANALYTICAL_LIMIT_IMP_HUGE(IMP, REAL)
 #endif
 
-#define ANALYTICAL_LIMIT(OP, IMP, SIGN_OP)                                     
           \
-gdk_return                                                                     
           \
-GDKanalytical##OP(BAT *r, BAT *b, BAT *p, BAT *o, bit force_order, int tpe)    
           \
-{                                                                              
           \
-       int (*atomcmp)(const void *, const void *);                             
              \
-       const void* restrict nil;                                               
              \
-       bool has_nils = false;                                                  
              \
-       BUN i, j, ncnt, cnt = BATcount(b);                                      
              \
-       bit *np, *pnp, *end;                                                    
              \
-       gdk_return gdk_res = GDK_SUCCEED;                                       
              \
-                                                                               
           \
-       switch(ATOMstorage(tpe)) {                                              
              \
-               case TYPE_bit:                                                  
                  \
-                       ANALYTICAL_LIMIT_IMP(bit, IMP)                          
                      \
-                       break;                                                  
                      \
-               case TYPE_bte:                                                  
                  \
-                       ANALYTICAL_LIMIT_IMP(bte, IMP)                          
                      \
-                       break;                                                  
                      \
-               case TYPE_sht:                                                  
                  \
-                       ANALYTICAL_LIMIT_IMP(sht, IMP)                          
                      \
-                       break;                                                  
                      \
-               case TYPE_int:                                                  
                  \
-                       ANALYTICAL_LIMIT_IMP(int, IMP)                          
                      \
-                       break;                                                  
                      \
-               case TYPE_lng:                                                  
                  \
-                       ANALYTICAL_LIMIT_IMP(lng, IMP)                          
                      \
-                       break;                                                  
                      \
-               ANALYTICAL_LIMIT_IMP_HUGE(IMP)                                  
                  \
-               case TYPE_flt:                                                  
                  \
-                       ANALYTICAL_LIMIT_IMP(flt, IMP)                          
                      \
-                       break;                                                  
                      \
-               case TYPE_dbl:                                                  
                  \
-                       ANALYTICAL_LIMIT_IMP(dbl, IMP)                          
                      \
-                       break;                                                  
                      \
-               default: {                                                      
                  \
-                       BATiter bpi = bat_iterator(b);                          
                      \
-                       void *restrict curval = BUNtail(bpi, 0);                
                      \
-                       nil = ATOMnilptr(tpe);                                  
                      \
-                       atomcmp = ATOMcompare(tpe);                             
                      \
-                       if (p) {                                                
                      \
-                               np = (bit*)Tloc(p, 0);                          
                          \
-                               for(i=0,j=0; i<cnt; i++, np++) {                
                          \
-                                       if (*np) {                              
                              \
-                                               if((*atomcmp)(curval, nil) == 
0)                                  \
-                                                       has_nils = true;        
                                      \
-                                               for (;j < i; j++) {             
                                  \
-                                                       if ((gdk_res = 
BUNappend(r, curval, false)) != GDK_SUCCEED)   \
-                                                               goto finish;    
                                          \
-                                               }                               
                                  \
-                                               curval = BUNtail(bpi, i);       
                                  \
-                                       }                                       
                              \
-                                       void *next = BUNtail(bpi, i);           
                              \
-                                       if((*atomcmp)(next, nil) != 0) {        
                              \
-                                               if((*atomcmp)(curval, nil) == 
0)                                  \
-                                                       curval = next;          
                                      \
-                                               else                            
                                  \
-                                                       curval = atomcmp(next, 
curval) SIGN_OP 0 ? curval : next;     \
-                                       }                                       
                              \
-                               }                                               
                          \
-                               if((*atomcmp)(curval, nil) == 0)                
                          \
-                                       has_nils = true;                        
                              \
-                               for (;j < i; j++) {                             
                          \
-                                       if ((gdk_res = BUNappend(r, curval, 
false)) != GDK_SUCCEED)           \
-                                          goto finish;                         
                              \
-                               }                                               
                          \
-                       } else if (o || force_order) {                          
                      \
-                               for(i=0; i<cnt; i++) {                          
                          \
-                                       void *next = BUNtail(bpi, i);           
                              \
-                                               if((*atomcmp)(next, nil) != 0) 
{                                  \
-                                                       if((*atomcmp)(curval, 
nil) == 0)                              \
-                                                               curval = next;  
                                          \
-                                                       else                    
                                      \
-                                                               curval = 
atomcmp(next, curval) SIGN_OP 0 ? curval : next; \
-                                               }                               
                                  \
-                               }                                               
                          \
-                               if((*atomcmp)(curval, nil) == 0)                
                          \
-                                       has_nils = true;                        
                              \
-                               for (j=0; j < i; j++) {                         
                          \
-                                       if ((gdk_res = BUNappend(r, curval, 
false)) != GDK_SUCCEED)           \
-                                               goto finish;                    
                                  \
-                               }                                               
                          \
-                       } else { /* single value, ie no ordering */             
                      \
-                               for(i=0; i<cnt; i++) {                          
                          \
-                                       void *next = BUNtail(bpi, i);           
                              \
-                                       if((*atomcmp)(next, nil) == 0)          
                              \
-                                               has_nils = true;                
                                  \
-                                       if ((gdk_res = BUNappend(r, next, 
false)) != GDK_SUCCEED)             \
-                                               goto finish;                    
                                  \
-                               }                                               
                          \
-                       }                                                       
                      \
-               }                                                               
                  \
-       }                                                                       
              \
-finish:                                                                        
           \
-       BATsetcount(r, cnt);                                                    
              \
-       r->tnonil = !has_nils;                                                  
              \
-       r->tnil = has_nils;                                                     
              \
-       return gdk_res;                                                         
              \
+#define ANALYTICAL_LIMIT_IMP_OTHERS_NO_OVERLAP(SIGN_OP)                       \
+       do {                                                                    
  \
+               l = j;                                                          
      \
+               curval = BUNtail(bpi, j);                                       
      \
+               j++;                                                            
      \
+               for (;j < i; j++) {                                             
      \
+                       void *next = BUNtail(bpi, j);                           
          \
+                       if((*atomcmp)(next, nil) != 0) {                        
          \
+                               if((*atomcmp)(curval, nil) == 0)                
              \
+                                       curval = next;                          
                  \
+                               else                                            
              \
+                                       curval = atomcmp(next, curval) SIGN_OP 
0 ? curval : next; \
+                       }                                                       
          \
+               }                                                               
      \
+               j = l;                                                          
      \
+               for (;j < i; j++) {                                             
      \
+                       if ((gdk_res = BUNappend(r, curval, false)) != 
GDK_SUCCEED)       \
+                               goto finish;                                    
              \
+               }                                                               
      \
+               if((*atomcmp)(curval, nil) == 0)                                
      \
+                       has_nils = true;                                        
          \
+       } while(0);
+
+#define ANALYTICAL_LIMIT_IMP_OTHERS_OVERLAP(SIGN_OP)                           
   \
+       do {                                                                    
      \
+               m = k;                                                          
          \
+               for(;k<i;k++) {                                                 
          \
+                       j = (k > m+start) ? k - start : m;                      
              \
+                       l = (k+end < i) ? k + end + 1 : i;                      
              \
+                       curval = BUNtail(bpi, j);                               
              \
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to