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

Updating nth_value, but still fixes to be made


diffs (truncated from 843 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 *s, BAT *e, 
BAT *l, const void *restrict bound, int tp1, int tp2);
+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 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
@@ -148,7 +148,7 @@ GDKanalyticalntile(BAT *r, BAT *b, BAT *
        r->tnil = has_nils;
        return GDK_SUCCEED;
 nosupport:
-       GDKerror("type %s not supported for the ntile type.\n", ATOMname(tpe));
+       GDKerror("42000!type %s not supported for the ntile type.\n", 
ATOMname(tpe));
        return GDK_FAIL;
 }
 
@@ -370,104 +370,308 @@ GDKanalyticallast(BAT *r, BAT *p, BAT *o
        return GDK_SUCCEED;
 }
 
-#define ANALYTICAL_NTHVALUE_IMP_SINGLE_FIXED(TPE1)                     \
+#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);    \
+       } while (0)
+
+#define ANALYTICAL_NTHVALUE_IMP_SINGLE_FIXED_CURRENT_ROW(TPE1)                 
\
        do {                                                            \
-               TPE1 *bp = (TPE1*)Tloc(b, 0), *bs, *be, curval, *restrict rb = 
(TPE1*)Tloc(r, 0); \
+               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]); \
+               } \
+       } while (0)
+
+#define ANALYTICAL_NTHVALUE_IMP_SINGLE_FIXED_OTHERS(TPE1)                      
\
+       do {                                                            \
+               TPE1 *bp = (TPE1*)Tloc(b, 0), *restrict rb = (TPE1*)Tloc(r, 0); 
\
                if (is_lng_nil(nth)) {                                  \
                        has_nils = true;                                \
-                       for (; i < cnt; i++, rb++)                      \
-                               *rb = TPE1##_nil;                       \
+                       for (; k < i; k++)                      \
+                               rb[k] = TPE1##_nil;                     \
                } else {                                                \
                        nth--;                                          \
-                       for (; i < cnt; i++, rb++) {                    \
-                               bs = bp + start[i];                     \
-                               be = bp + end[i];                       \
-                               curval = (be > bs && nth < (end[i] - start[i])) 
? *(bs + nth) : TPE1##_nil; \
-                               *rb = curval;                           \
+                       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);    \
                        }                                               \
                }                                                       \
        } while (0)
 
-#define ANALYTICAL_NTHVALUE_IMP_MULTI_FIXED(TPE1, TPE2, TPE3)          \
+#define ANALYTICAL_NTHVALUE_IMP_SINGLE_VARSIZED_TRIVIAL                \
+       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;  \
+       } 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;  \
+               } \
+       } 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;     \
+                               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_TRIVIAL(TPE1, TPE2, TPE3)          
        \
        do {                                                            \
                TPE2 *restrict lp = (TPE2*)Tloc(l, 0);                  \
-               for (; i < cnt; i++, rb++) {                            \
-                       TPE2 lnth = lp[i];                              \
-                       bs = bp + start[i];                             \
-                       be = bp + end[i];                               \
-                       if (is_##TPE2##_nil(lnth) || be <= bs || (TPE3)(lnth - 
1) > (TPE3)(end[i] - start[i])) { \
+               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]);     \
+               }       \
+       } while (0)
+
+#define ANALYTICAL_NTHVALUE_IMP_MULTI_FIXED_CURRENT_ROW(TPE1, TPE2, TPE3)      
                \
+       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]); \
+               } \
+       } while (0)
+
+#define ANALYTICAL_NTHVALUE_IMP_MULTI_FIXED_OTHERS(TPE1, TPE2, TPE3)           
\
+       do {                                                            \
+               TPE1 curval;    \
+               TPE2 *restrict lp = (TPE2*)Tloc(l, 0);                  \
+               for (; k < i; k++) {                            \
+                       TPE2 lnth = lp[k];                              \
+                       TPE1 *bs = bp + start[k];                               
\
+                       TPE1 *be = bp + end[k];                         \
+                       if (!is_##TPE2##_nil(nth) && nth <= 0) goto invalidnth; 
\
+                       if (is_##TPE2##_nil(lnth) || be <= bs || (TPE3)(lnth - 
1) > (TPE3)(end[k] - start[k])) { \
                                curval = TPE1##_nil;    \
                                has_nils = true;        \
                        } else {                                                
\
                                curval = *(bs + lnth - 1);              \
                                has_nils |= is_##TPE1##_nil(curval);    \
                        }       \
-                       *rb = curval;   \
+                       rb[k] = curval; \
+               }                                                       \
+       } while (0)
+
+#define ANALYTICAL_NTHVALUE_IMP_MULTI_VARSIZED_TRIVIAL(TPE1, TPE2)             
        \
+       do {                                                            \
+               const void *curval = nil;       \
+               TPE2 *restrict lp = (TPE2*)Tloc(l, 0);                  \
+               for (; k < i; k++)      {               \
+                       if (!is_##TPE2##_nil(lp[k]) && lp[k] <= 0) goto 
invalidnth;     \
+                       curval = !is_##TPE2##_nil(lp[k]) && lp[k] <= i - k ? 
BUNtail(bpi, (BUN) (lp[k] - 1 + 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_VARSIZED_CURRENT_ROW(TPE1, TPE2)         
        \
+       do {                                                            \
+               const void *curval = nil;       \
+               TPE2 *restrict lp = (TPE2*)Tloc(l, 0);                  \
+               for (; k < i; k++) { \
+                       if (!is_##TPE2##_nil(lp[k]) && lp[k] <= 0) goto 
invalidnth;     \
+                       curval = lp[k] == 1 ? BUNtail(bpi, (BUN) lp[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_VARSIZED_OTHERS(TPE1, TPE2)              
\
+       do {                                                            \
+               const void *curval = nil;       \
+               TPE1 *restrict lp = (TPE1*)Tloc(l, 0);                  \
+               for (; k < i; k++) {                                    \
+                       TPE1 lnth = lp[k];                              \
+                       if (!is_##TPE1##_nil(nth) && nth <= 0) goto invalidnth; 
\
+                       if (is_##TPE1##_nil(lnth) || end[k] <= start[k] || 
(TPE2)(lnth - 1) > (TPE2)(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; \
                }                                                       \
        } while (0)
 
 #ifdef HAVE_HGE
-#define ANALYTICAL_NTHVALUE_CALC_FIXED_HGE(TPE1)                       \
+#define ANALYTICAL_NTHVALUE_CALC_FIXED_HGE(TPE1, IMP)                  \
        case TYPE_hge:                                                  \
-               ANALYTICAL_NTHVALUE_IMP_MULTI_FIXED(TPE1, hge, hge);    \
+               ANALYTICAL_NTHVALUE_IMP_MULTI_FIXED_##IMP(TPE1, hge, hge);      
\
                break;
 #else
-#define ANALYTICAL_NTHVALUE_CALC_FIXED_HGE(TPE1)
+#define ANALYTICAL_NTHVALUE_CALC_FIXED_HGE(TPE1, IMP)
 #endif
 
-#define ANALYTICAL_NTHVALUE_CALC_FIXED(TPE1)                           \
+#define ANALYTICAL_NTHVALUE_MULTI_FIXED(TPE1, IMP)                             
\
        do {                                                            \
-               TPE1 *bp = (TPE1*)Tloc(b, 0), *bs, *be, curval, *restrict rb = 
(TPE1*)Tloc(r, 0);       \
+               TPE1 *bp = (TPE1*)Tloc(b, 0), *restrict rb = (TPE1*)Tloc(r, 0); 
\
                switch (tp2) {                                          \
                case TYPE_bte:                                          \
-                       ANALYTICAL_NTHVALUE_IMP_MULTI_FIXED(TPE1, bte, lng); \
+                       ANALYTICAL_NTHVALUE_IMP_MULTI_FIXED_##IMP(TPE1, bte, 
lng); \
                        break;                                          \
                case TYPE_sht:                                          \
-                       ANALYTICAL_NTHVALUE_IMP_MULTI_FIXED(TPE1, sht, lng); \
+                       ANALYTICAL_NTHVALUE_IMP_MULTI_FIXED_##IMP(TPE1, sht, 
lng); \
                        break;                                          \
                case TYPE_int:                                          \
-                       ANALYTICAL_NTHVALUE_IMP_MULTI_FIXED(TPE1, int, lng); \
+                       ANALYTICAL_NTHVALUE_IMP_MULTI_FIXED_##IMP(TPE1, int, 
lng); \
                        break;                                          \
                case TYPE_lng:                                          \
-                       ANALYTICAL_NTHVALUE_IMP_MULTI_FIXED(TPE1, lng, lng); \
+                       ANALYTICAL_NTHVALUE_IMP_MULTI_FIXED_##IMP(TPE1, lng, 
lng); \
                        break;                                          \
-               ANALYTICAL_NTHVALUE_CALC_FIXED_HGE(TPE1)                \
+               ANALYTICAL_NTHVALUE_CALC_FIXED_HGE(TPE1, IMP)           \
                default:                                                \
                        goto nosupport;                                 \
                }                                                       \
        } while (0)
 
-#define ANALYTICAL_NTHVALUE_IMP_MULTI_VARSIZED(TPE1, TPE2)             \
-       do {                                                            \
-               TPE1 *restrict lp = (TPE1*)Tloc(l, 0);                  \
-               for (; i < cnt; i++) {                                  \
-                       TPE1 lnth = lp[i];                              \
-                       if (is_##TPE1##_nil(lnth) || end[i] <= start[i] || 
(TPE2)(lnth - 1) > (TPE2)(end[i] - start[i])) {      \
-                               curval = (void *) nil;                  \
-                               has_nils = true; \
-                       } else {        \
-                               curval = BUNtail(bpi, (BUN) (start[i] + lnth - 
1)); \
-                               has_nils |= atomcmp(curval, nil) == 0;  \
+#ifdef HAVE_HGE
+#define ANALYTICAL_NTH_VALUE_SINGLE_LIMIT(IMP)                 \
+       case TYPE_hge:                                  \
+               ANALYTICAL_NTHVALUE_IMP_SINGLE_FIXED_##IMP(hge);        \
+       break;
+#define ANALYTICAL_NTHVALUE_MULTI_FIXED_LIMIT(IMP)                     \
+       case TYPE_hge:                                  \
+               ANALYTICAL_NTHVALUE_MULTI_FIXED(hge, IMP);      \
+       break;
+#define ANALYTICAL_NTHVALUE_MULTI_VARSIZED_LIMIT(IMP)                  \
+       case TYPE_hge:                                  \
+               ANALYTICAL_NTHVALUE_IMP_MULTI_VARSIZED_##IMP(hge, hge); \
+       break;
+#else
+#define ANALYTICAL_NTH_VALUE_SINGLE_LIMIT(IMP)
+#define ANALYTICAL_NTHVALUE_MULTI_FIXED_LIMIT(IMP)
+#define ANALYTICAL_NTHVALUE_MULTI_FIXED_VARSIZED(IMP)
+#endif
+
+#define ANALYTICAL_NTH_VALUE_BRANCHES(IMP)             \
+       do { \
+               if (bound) {            \
+                       switch (ATOMbasetype(tp1)) {            \
+                       case TYPE_bte:          \
+                               
ANALYTICAL_NTHVALUE_IMP_SINGLE_FIXED_##IMP(bte);                \
+                               break;          \
+                       case TYPE_sht:          \
+                               
ANALYTICAL_NTHVALUE_IMP_SINGLE_FIXED_##IMP(sht);                \
+                               break;          \
+                       case TYPE_int:          \
+                               
ANALYTICAL_NTHVALUE_IMP_SINGLE_FIXED_##IMP(int);                \
+                               break;          \
+                       case TYPE_lng:          \
+                               
ANALYTICAL_NTHVALUE_IMP_SINGLE_FIXED_##IMP(lng);                \
+                               break;          \
+                       ANALYTICAL_NTH_VALUE_SINGLE_LIMIT(IMP)  \
+                       case TYPE_flt:          \
+                               
ANALYTICAL_NTHVALUE_IMP_SINGLE_FIXED_##IMP(flt);                \
+                               break;          \
+                       case TYPE_dbl:          \
+                               
ANALYTICAL_NTHVALUE_IMP_SINGLE_FIXED_##IMP(dbl);                \
+                               break;          \
+                       default: {                                              
        \
+                               ANALYTICAL_NTHVALUE_IMP_SINGLE_VARSIZED_##IMP;  
\
+                       }                                                       
        \
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to