Changeset: 047b232bf1ee for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=047b232bf1ee
Modified Files:
        gdk/gdk_analytic.h
        gdk/gdk_analytic_func.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_rank.c
        sql/common/sql_types.c
Branch: window-tunning
Log Message:

Nth_value is getting hard, I have to go through the old way, it still scales 
well


diffs (truncated from 860 to 300 lines):

diff --git a/gdk/gdk_analytic.h b/gdk/gdk_analytic.h
--- a/gdk/gdk_analytic.h
+++ b/gdk/gdk_analytic.h
@@ -27,7 +27,7 @@ gdk_export gdk_return GDKanalyticalwindo
 
 gdk_export gdk_return GDKanalyticalfirst(BAT *r, BAT *p, BAT *o, BAT *b, BAT 
*s, BAT *e, int tpe, int frame_type);
 gdk_export gdk_return GDKanalyticallast(BAT *r, BAT *p, BAT *o, BAT *b, BAT 
*s, BAT *e, int tpe, int frame_type);
-gdk_export gdk_return GDKanalyticalnthvalue(BAT *r, BAT *b, BAT *p, BAT *s, 
BAT *e, BAT *l, const void *restrict bound, int tp1, int tp2, int frame_type);
+gdk_export gdk_return GDKanalyticalnthvalue(BAT *r, BAT *b, BAT *p, BAT *o, 
BAT *s, BAT *e, BAT *l, lng *nth, int tp1, int frame_type);
 
 gdk_export gdk_return GDKanalyticalmin(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, 
BAT *e, int tpe, int frame_type);
 gdk_export gdk_return GDKanalyticalmax(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, 
BAT *e, int tpe, int frame_type);
diff --git a/gdk/gdk_analytic_func.c b/gdk/gdk_analytic_func.c
--- a/gdk/gdk_analytic_func.c
+++ b/gdk/gdk_analytic_func.c
@@ -434,351 +434,337 @@ GDKanalyticallast(BAT *r, BAT *p, BAT *o
        return GDK_SUCCEED;
 }
 
-#define ANALYTICAL_NTHVALUE_IMP_SINGLE_FIXED_TRIVIAL(TPE1)                     
\
-       do {                                                            \
-               TPE1 *bp = (TPE1*)Tloc(b, 0), *restrict rb = (TPE1*)Tloc(r, 0); 
\
-               TPE1 curval = !is_lng_nil(nth) && nth <= i - k ? bp[nth - 1 + 
k] : TPE1##_nil; \
-               for (; k < i; k++)                      \
-                       rb[k] = curval;                         \
-               has_nils |= is_##TPE1##_nil(curval);    \
+//lnth - 1 > end[k] - start[k]
+
+#define ANALYTICAL_NTHVALUE_IMP_FIXED_UNBOUNDED_TILL_CURRENT_ROW(TPE) \
+       do { \
+               if (t) { \
+                       for (; k < i; k++) { \
+                               if (!is_lng_nil(tp[k]) && tp[k] <= 0) goto 
invalidnth;  \
+                               TPE curval = !is_lng_nil(tp[k]) && i - l >= 
tp[k] ? bp[l + tp[k] - 1] : TPE##_nil; \
+                               rb[k] = curval; \
+                               has_nils |= is_##TPE##_nil(curval);     \
+                       } \
+               } else { \
+                       for (; k < i; k++) { \
+                               TPE curval = !is_lng_nil(nth) && i - l >= nth ? 
bp[l + nth - 1] : TPE##_nil; \
+                               rb[k] = curval; \
+                               has_nils |= is_##TPE##_nil(curval);     \
+                       } \
+               }       \
+               l = k;  \
        } while (0)
 
-#define ANALYTICAL_NTHVALUE_IMP_SINGLE_FIXED_CURRENT_ROW(TPE1)                 
\
-       do {                                                            \
-               TPE1 *bp = (TPE1*)Tloc(b, 0), *restrict rb = (TPE1*)Tloc(r, 0); 
\
-               for (; k < i; k++) { \
-                       rb[k] = nth == 1 ? bp[k] : TPE1##_nil; \
-                       has_nils |= is_##TPE1##_nil(rb[k]); \
+#define ANALYTICAL_NTHVALUE_IMP_FIXED_CURRENT_ROW_TILL_UNBOUNDED(TPE) \
+       do { \
+               if (t) { \
+                       for (; k < i; k++) { \
+                               if (!is_lng_nil(tp[k]) && tp[k] <= 0) goto 
invalidnth;  \
+                               TPE curval = !is_lng_nil(tp[k]) && i - k >= 
tp[k] ? bp[k + tp[k] - 1] : TPE##_nil; \
+                               rb[k] = curval; \
+                               has_nils |= is_##TPE##_nil(curval);     \
+                       }       \
+               } else { \
+                       for (; k < i; k++) { \
+                               TPE curval = !is_lng_nil(nth) && i - k >= nth ? 
bp[k + nth - 1] : TPE##_nil; \
+                               rb[k] = curval; \
+                               has_nils |= is_##TPE##_nil(curval);     \
+                       }       \
                } \
+               l = k;  \
+       } while (0)
+
+#define ANALYTICAL_NTHVALUE_IMP_FIXED_ALL_ROWS(TPE) \
+       do { \
+               if (t) {        \
+                       for (; k < i; k++) { \
+                               if (!is_lng_nil(tp[k]) && tp[k] <= 0) goto 
invalidnth;  \
+                               rb[k] = !is_lng_nil(tp[k]) && tp[k] <= i - l ? 
bp[l + tp[k] - 1] : TPE##_nil; \
+                               has_nils |= is_##TPE##_nil(rb[k]); \
+                       }       \
+               } else {        \
+                       TPE curval = !is_lng_nil(nth) && nth <= i - l ? bp[l + 
nth - 1] : TPE##_nil; \
+                       for (; k < i; k++) \
+                               rb[k] = curval; \
+                       has_nils |= is_##TPE##_nil(curval); \
+               }       \
+               l = k; \
        } while (0)
 
-#define ANALYTICAL_NTHVALUE_IMP_SINGLE_FIXED_OTHERS(TPE1)                      
\
+#define ANALYTICAL_NTHVALUE_IMP_FIXED_CURRENT_ROW(TPE)                 \
        do {                                                            \
-               TPE1 *bp = (TPE1*)Tloc(b, 0), *restrict rb = (TPE1*)Tloc(r, 0); 
\
-               if (is_lng_nil(nth)) {                                  \
-                       has_nils = true;                                \
-                       for (; k < i; k++)                      \
-                               rb[k] = TPE1##_nil;                     \
-               } else {                                                \
-                       nth--;                                          \
-                       for (; k < i; k++) {                    \
-                               TPE1 *bs = bp + start[k];                       
\
-                               TPE1 *be = bp + end[k];                 \
-                               TPE1 curval = (be > bs && nth < (end[k] - 
start[k])) ? *(bs + nth) : TPE1##_nil; \
-                               rb[k] = curval;                         \
-                               has_nils |= is_##TPE1##_nil(curval);    \
-                       }                                               \
-               }                                                       \
+               if (t) {        \
+                       for (; k < i; k++) { \
+                               if (!is_lng_nil(tp[k]) && tp[k] <= 0) goto 
invalidnth;  \
+                               rb[k] = tp[k] == 1 ? bp[k] : TPE##_nil; \
+                               has_nils |= is_##TPE##_nil(rb[k]); \
+                       }       \
+               } else {        \
+                       for (; k < i; k++) { \
+                               rb[k] = nth == 1 ? bp[k] : TPE##_nil; \
+                               has_nils |= is_##TPE##_nil(rb[k]); \
+                       } \
+               }       \
        } while (0)
 
-#define ANALYTICAL_NTHVALUE_IMP_SINGLE_VARSIZED_TRIVIAL                \
+#define ANALYTICAL_NTHVALUE_IMP_FIXED_OTHERS(TPE)                      \
        do {                                                            \
-               const void *curval = !is_lng_nil(nth) && nth <= i - k ? 
BUNtail(bpi, (BUN) (nth - 1 + k)) : nil; \
-               for (; k < i; k++)                      \
-                       if (tfastins_nocheckVAR(r, k, curval, Tsize(r)) != 
GDK_SUCCEED) \
-                               return GDK_FAIL; \
-               has_nils |= atomcmp(curval, nil) == 0;  \
+               TPE curval;     \
+               if (t) {        \
+                       for (; k < i; k++) {                            \
+                               lng lnth = tp[k];                               
\
+                               TPE *bs = bp + start[k];                        
        \
+                               TPE *be = bp + end[k];                          
\
+                               if (!is_lng_nil(nth) && nth <= 0) goto 
invalidnth;      \
+                               if (is_lng_nil(lnth) || be <= bs || lnth - 1 > 
end[k] - start[k]) { \
+                                       curval = TPE##_nil;     \
+                                       has_nils = true;        \
+                               } else {                                        
        \
+                                       curval = *(bs + lnth - 1);              
\
+                                       has_nils |= is_##TPE##_nil(curval);     
\
+                               }       \
+                               rb[k] = curval; \
+                       }                                                       
\
+               } else {        \
+                       if (is_lng_nil(nth)) {                                  
\
+                               has_nils = true;                                
\
+                               for (; k < i; k++)                      \
+                                       rb[k] = TPE##_nil;                      
\
+                       } else {                                                
\
+                               nth--;                                          
\
+                               for (; k < i; k++) {                    \
+                                       TPE *bs = bp + start[k];                
        \
+                                       TPE *be = bp + end[k];                  
\
+                                       TPE curval = (be > bs && nth < (end[k] 
- start[k])) ? *(bs + nth) : TPE##_nil; \
+                                       rb[k] = curval;                         
\
+                                       has_nils |= is_##TPE##_nil(curval);     
\
+                               }                                               
\
+                       }                                                       
\
+               }       \
        } while (0)
 
-#define ANALYTICAL_NTHVALUE_IMP_SINGLE_VARSIZED_CURRENT_ROW                    
\
-       do {                                                            \
-               for (; k < i; k++) { \
-                       const void *curval = nth == 1 ? BUNtail(bpi, (BUN) k) : 
nil; \
-                       if (tfastins_nocheckVAR(r, k, curval, Tsize(r)) != 
GDK_SUCCEED) \
-                               return GDK_FAIL; \
-                       has_nils |= atomcmp(curval, nil) == 0;  \
-               } \
+#define ANALYTICAL_NTHVALUE_IMP_VARSIZED_UNBOUNDED_TILL_CURRENT_ROW \
+       do { \
+               if (t) { \
+                       for (; k < i; k++) { \
+                               if (!is_lng_nil(tp[k]) && tp[k] <= 0) goto 
invalidnth;  \
+                               const void *curval = !is_lng_nil(tp[k]) && i - 
l >= tp[k] ? BUNtail(bpi, (BUN) (l + tp[k] - 1)) : nil; \
+                               if (tfastins_nocheckVAR(r, k, curval, Tsize(r)) 
!= GDK_SUCCEED) \
+                                       return GDK_FAIL; \
+                               has_nils |= atomcmp(curval, nil) == 0;  \
+                       } \
+               } else { \
+                       for (; k < i; k++) { \
+                               const void *curval = !is_lng_nil(nth) && i - l 
>= nth ? BUNtail(bpi, (BUN) (l + nth - 1)) : nil; \
+                               if (tfastins_nocheckVAR(r, k, curval, Tsize(r)) 
!= GDK_SUCCEED) \
+                                       return GDK_FAIL; \
+                               has_nils |= atomcmp(curval, nil) == 0;  \
+                       } \
+               }       \
+               l = k;  \
        } while (0)
 
-#define ANALYTICAL_NTHVALUE_IMP_SINGLE_VARSIZED_OTHERS                 \
-       do {                                                            \
-               if (is_lng_nil(nth)) {  \
-                       has_nils = true;        \
-                       for (; k < i; k++)      \
-                               if (tfastins_nocheckVAR(r, k, nil, Tsize(r)) != 
GDK_SUCCEED) \
-                                       return GDK_FAIL; \
-               } else {        \
-                       nth--;  \
-                       for (; k < i; k++) {    \
-                               const void *curval = (end[k] > start[k] && nth 
< (end[k] - start[k])) ? BUNtail(bpi, (BUN) (start[k] + nth)) : nil;     \
+#define ANALYTICAL_NTHVALUE_IMP_VARSIZED_CURRENT_ROW_TILL_UNBOUNDED \
+       do { \
+               if (t) { \
+                       for (; k < i; k++) { \
+                               if (!is_lng_nil(tp[k]) && tp[k] <= 0) goto 
invalidnth;  \
+                               const void *curval = !is_lng_nil(tp[k]) && i - 
k >= tp[k] ? BUNtail(bpi, (BUN) (k + tp[k] - 1)) : nil; \
                                if (tfastins_nocheckVAR(r, k, curval, Tsize(r)) 
!= GDK_SUCCEED) \
                                        return GDK_FAIL; \
                                has_nils |= atomcmp(curval, nil) == 0;  \
                        }       \
-               }       \
+               } else { \
+                       for (; k < i; k++) { \
+                               const void *curval = !is_lng_nil(nth) && i - k 
>= nth ? BUNtail(bpi, (BUN) (k + nth - 1)) : nil; \
+                               if (tfastins_nocheckVAR(r, k, curval, Tsize(r)) 
!= GDK_SUCCEED) \
+                                       return GDK_FAIL; \
+                               has_nils |= atomcmp(curval, nil) == 0;  \
+                       }       \
+               } \
+               l = k;  \
        } while (0)
 
-#define ANALYTICAL_NTHVALUE_IMP_MULTI_FIXED_TRIVIAL(TPE1, TPE2, TPE3)          
        \
+#define ANALYTICAL_NTHVALUE_IMP_VARSIZED_ALL_ROWS \
+       do { \
+               if (t) {        \
+                       for (; k < i; k++) { \
+                               if (!is_lng_nil(tp[k]) && tp[k] <= 0) goto 
invalidnth;  \
+                               const void *curval = !is_lng_nil(tp[k]) && 
tp[k] <= i - l ? BUNtail(bpi, (BUN) (l + tp[k] - 1)) : nil; \
+                               if (tfastins_nocheckVAR(r, k, curval, Tsize(r)) 
!= GDK_SUCCEED) \
+                                       return GDK_FAIL; \
+                               has_nils |= atomcmp(curval, nil) == 0;  \
+                       }       \
+               } else {        \
+                       const void *curval = !is_lng_nil(nth) && nth <= i - l ? 
BUNtail(bpi, (BUN) (l + nth - 1)) : nil; \
+                       for (; k < i; k++) { \
+                               if (tfastins_nocheckVAR(r, k, curval, Tsize(r)) 
!= GDK_SUCCEED) \
+                                       return GDK_FAIL; \
+                       } \
+                       has_nils |= atomcmp(curval, nil) == 0;  \
+               }       \
+               l = k; \
+       } while (0)
+
+#define ANALYTICAL_NTHVALUE_IMP_VARSIZED_CURRENT_ROW                   \
        do {                                                            \
-               TPE2 *restrict lp = (TPE2*)Tloc(l, 0);                  \
-               for (; k < i; k++)      {               \
-                       if (!is_##TPE2##_nil(lp[k]) && lp[k] <= 0) goto 
invalidnth;     \
-                       rb[k] = !is_##TPE2##_nil(lp[k]) && lp[k] <= i - k ? 
bp[lp[k] - 1 + k] : TPE1##_nil; \
-                       has_nils |= is_##TPE1##_nil(rb[k]);     \
+               if (t) {        \
+                       const void *curval = nil;       \
+                       for (; k < i; k++) { \
+                               if (!is_lng_nil(tp[k]) && tp[k] <= 0) goto 
invalidnth;  \
+                               curval = tp[k] == 1 ? BUNtail(bpi, (BUN) tp[k]) 
: nil; \
+                               if (tfastins_nocheckVAR(r, k, curval, Tsize(r)) 
!= GDK_SUCCEED) \
+                                       return GDK_FAIL; \
+                               has_nils |= atomcmp(curval, nil) == 0;  \
+                       } \
+               } else {        \
+                       for (; k < i; k++) { \
+                               const void *curval = nth == 1 ? BUNtail(bpi, 
(BUN) k) : nil; \
+                               if (tfastins_nocheckVAR(r, k, curval, Tsize(r)) 
!= GDK_SUCCEED) \
+                                       return GDK_FAIL; \
+                               has_nils |= atomcmp(curval, nil) == 0;  \
+                       } \
                }       \
        } while (0)
 
-#define ANALYTICAL_NTHVALUE_IMP_MULTI_FIXED_CURRENT_ROW(TPE1, TPE2, TPE3)      
                \
+#define ANALYTICAL_NTHVALUE_IMP_VARSIZED_OTHERS                        \
        do {                                                            \
-               TPE2 *restrict lp = (TPE2*)Tloc(l, 0);                  \
-               for (; k < i; k++) { \
-                       if (!is_##TPE2##_nil(lp[k]) && lp[k] <= 0) goto 
invalidnth;     \
-                       rb[k] = lp[k] == 1 ? bp[k] : TPE1##_nil; \
-                       has_nils |= is_##TPE1##_nil(rb[k]); \
-               } \
+               if (t) {        \
+                       const void *curval = nil;       \
+                       for (; k < i; k++) {                                    
\
+                               lng lnth = tp[k];                               
\
+                               if (!is_lng_nil(nth) && nth <= 0) goto 
invalidnth;      \
+                               if (is_lng_nil(lnth) || end[k] <= start[k] || 
(lng)(lnth - 1) > (lng)(end[k] - start[k])) {     \
+                                       curval = (void *) nil;                  
\
+                                       has_nils = true; \
+                               } else {        \
+                                       curval = BUNtail(bpi, (BUN) (start[k] + 
lnth - 1)); \
+                                       has_nils |= atomcmp(curval, nil) == 0;  
\
+                               }       \
+                               if (tfastins_nocheckVAR(r, k, curval, Tsize(r)) 
!= GDK_SUCCEED) \
+                                       return GDK_FAIL; \
+                       }                                                       
\
+               } else {        \
+                       if (is_lng_nil(nth)) {  \
+                               has_nils = true;        \
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to