Changeset: e1ad93dcc00b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e1ad93dcc00b
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
        sql/server/rel_select.c
        sql/test/analytics/Tests/analytics06.stable.err
        sql/test/analytics/Tests/analytics06.stable.out
Branch: window-tunning
Log Message:

For first, last and nth-value functions fallback to the previous path. It will 
scale in o(n) - o(nlogn) with my future changes. Now the first batch of 
analytics tests are passing


diffs (truncated from 1256 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
@@ -25,9 +25,9 @@ gdk_export gdk_return GDKanalyticalwindo
                                                int tp1, int tp2, int unit,
                                                bool preceding, lng first_half);
 
-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 *o, 
BAT *s, BAT *e, BAT *l, lng *nth, int tp1, int frame_type);
+gdk_export gdk_return GDKanalyticalfirst(BAT *r, BAT *b, BAT *s, BAT *e, int 
tpe);
+gdk_export gdk_return GDKanalyticallast(BAT *r, BAT *b, BAT *s, BAT *e, int 
tpe);
+gdk_export gdk_return GDKanalyticalnthvalue(BAT *r, BAT *b, BAT *s, BAT *e, 
BAT *l, lng *nth, int tp1);
 
 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
@@ -152,99 +152,10 @@ nosupport:
        return GDK_FAIL;
 }
 
-#define ANALYTICAL_FIRST_LAST_PARTITIONS(TPE, IMP)             \
-       do {                                    \
-               TPE *bp = (TPE*)Tloc(b, 0), *restrict rb = (TPE*)Tloc(r, 0); \
-               if (p) {                                        \
-                       for (; i < cnt; i++) {          \
-                               if (np[i])                      \
-                                       ANALYTICAL_FIRST_LAST_FIXED_##IMP(TPE); 
\
-                       }                                               \
-               }               \
-               i = cnt;                                        \
-               ANALYTICAL_FIRST_LAST_FIXED_##IMP(TPE); \
-       } while (0)
-
-#ifdef HAVE_HGE
-#define ANALYTICAL_FIRST_LAST_LIMIT(IMP)                       \
-       case TYPE_hge:                                  \
-               ANALYTICAL_FIRST_LAST_PARTITIONS(hge, IMP);     \
-       break;
-#else
-#define ANALYTICAL_FIRST_LAST_LIMIT(IMP)
-#endif
-
-#define ANALYTICAL_FIRST_LAST_BRANCHES(IMP)            \
-       do { \
-               switch (ATOMbasetype(tpe)) {                            \
-               case TYPE_bte:                                                  
\
-                       ANALYTICAL_FIRST_LAST_PARTITIONS(bte, IMP);             
        \
-                       break;                                                  
\
-               case TYPE_sht:                                                  
\
-                       ANALYTICAL_FIRST_LAST_PARTITIONS(sht, IMP);             
        \
-                       break;                                                  
\
-               case TYPE_int:                                                  
\
-                       ANALYTICAL_FIRST_LAST_PARTITIONS(int, IMP);             
        \
-                       break;                                                  
\
-               case TYPE_lng:                                                  
\
-                       ANALYTICAL_FIRST_LAST_PARTITIONS(lng, IMP);             
        \
-                       break;                                                  
\
-                       ANALYTICAL_FIRST_LAST_LIMIT(IMP)                        
        \
-               case TYPE_flt:                                                  
\
-                       ANALYTICAL_FIRST_LAST_PARTITIONS(flt, IMP);             
        \
-                       break;                                                  
\
-               case TYPE_dbl:                                                  
\
-                       ANALYTICAL_FIRST_LAST_PARTITIONS(dbl, IMP);             
        \
-                       break;                                                  
\
-               default: {                                                      
\
-                       if (p) {                                                
\
-                               for (; i < cnt; i++) {                  \
-                                       if (np[i])                      \
-                                               
ANALYTICAL_FIRST_LAST_VARSIZED_##IMP; \
-                               }                                               
\
-                       }                                       \
-                       i = cnt;                                        \
-                       ANALYTICAL_FIRST_LAST_VARSIZED_##IMP;   \
-               }                                                               
\
-               }                                                               
\
-       } while (0)
-
-#define ANALYTICAL_FIRST_LAST_FIXED_F_CURRENT_ROW_TILL_UNBOUNDED(TPE)  \
-       do { \
-               for (j = l; ; j--) { \
-                       if (op[j] || j == k) {  \
-                               TPE curval = bp[j];     \
-                               for (; l >= j; l--) \
-                                       rb[l] = curval; \
-                               has_nils |= is_##TPE##_nil(curval); \
-                               if (j == k)     \
-                                       break;  \
-                               l = j - 1;      \
-                       }       \
-               }       \
-               k = i; \
-       } while (0)
-
-#define ANALYTICAL_FIRST_LAST_FIXED_F_ALL_ROWS(TPE)    \
-       do { \
-               TPE v = bp[k]; \
-               for (; k < i; k++) \
-                       rb[k] = v; \
-               has_nils |= is_##TPE##_nil(v); \
-       } while (0)
-
-#define ANALYTICAL_FIRST_LAST_FIXED_F_CURRENT_ROW(TPE) \
-       do { \
-               for (; k < i; k++) { \
-                       TPE v = bp[k]; \
-                       rb[k] = v; \
-                       has_nils |= is_##TPE##_nil(v); \
-               } \
-       } while (0)
-
-#define ANALYTICAL_FIRST_LAST_FIXED_F_OTHERS(TPE)                              
\
+#define ANALYTICAL_FIRST_FIXED(TPE)                            \
        do {                                                    \
-               for (; k < i; k++) { \
+               TPE *bp = (TPE*)Tloc(b, 0), *restrict rb = (TPE*)Tloc(r, 0);    
\
+               for (; k < cnt; k++) { \
                        TPE *bs = bp + start[k], *be = bp + end[k];             
        \
                        TPE curval = (be > bs) ? *bs : TPE##_nil;       \
                        rb[k] = curval;                         \
@@ -252,179 +163,47 @@ nosupport:
                }                                               \
        } while (0)
 
-#define ANALYTICAL_FIRST_LAST_VARSIZED_F_CURRENT_ROW_TILL_UNBOUNDED    \
-       do { \
-               for (j = l; ; j--) { \
-                       if (op[j] || j == k) {  \
-                               const void *curval = BUNtail(bpi, j);   \
-                               for (; l >= j; l--) \
-                                       if (tfastins_nocheckVAR(r, l, curval, 
Tsize(r)) != GDK_SUCCEED) \
-                                               return GDK_FAIL; \
-                               has_nils |= atomcmp(curval, nil) == 0;  \
-                               if (j == k)     \
-                                       break;  \
-                               l = j - 1;      \
-                       }       \
-               }       \
-               k = i; \
-       } while (0)
-
-#define ANALYTICAL_FIRST_LAST_VARSIZED_F_ALL_ROWS      \
-       do { \
-               const void *curval = BUNtail(bpi, k);   \
-               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_FIRST_LAST_VARSIZED_F_CURRENT_ROW   \
-       do { \
-               for (; k < i; k++) { \
-                       const void *curval = BUNtail(bpi, k);   \
-                       if (tfastins_nocheckVAR(r, k, curval, Tsize(r)) != 
GDK_SUCCEED) \
-                               return GDK_FAIL; \
-                       has_nils |= atomcmp(curval, nil) == 0;  \
-               } \
-       } while (0)
-
-#define ANALYTICAL_FIRST_LAST_VARSIZED_F_OTHERS                                
\
-       do {                                                    \
-               for (; k < i; k++) { \
-                       const void *curval = (end[k] > start[k]) ? BUNtail(bpi, 
start[k]) : nil;        \
-                       if (tfastins_nocheckVAR(r, k, curval, Tsize(r)) != 
GDK_SUCCEED) \
-                               return GDK_FAIL;        \
-                       has_nils |= atomcmp(curval, nil) == 0;  \
-               }       \
-       } while (0)
-
 gdk_return
-GDKanalyticalfirst(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int tpe, 
int frame_type)
+GDKanalyticalfirst(BAT *r, BAT *b, BAT *s, BAT *e, int tpe)
 {
        bool has_nils = false;
-       lng i = 0, j = 0, k = 0, l = 0, cnt = (lng) BATcount(b);
-       lng *restrict start = s ? (lng*)Tloc(s, 0) : NULL, *restrict end = e ? 
(lng*)Tloc(e, 0) : NULL;
-       bit *np = p ? Tloc(p, 0) : NULL, *op = o ? Tloc(o, 0) : NULL;
+       lng k = 0, cnt = (lng) BATcount(b);
+       lng *restrict start = (lng*)Tloc(s, 0), *restrict end = (lng*)Tloc(e, 
0);
        BATiter bpi = bat_iterator(b);
        const void *nil = ATOMnilptr(tpe);
        int (*atomcmp)(const void *, const void *) = ATOMcompare(tpe);
 
-       switch (frame_type) {
-       case 4: /* current row until unbounded */       {
-               ANALYTICAL_FIRST_LAST_BRANCHES(F_CURRENT_ROW_TILL_UNBOUNDED);
-       } break;
-       case 3: /* unbounded until current row */
-       case 5: /* all rows */  {
-               ANALYTICAL_FIRST_LAST_BRANCHES(F_ALL_ROWS);
-       } break;
-       case 6: /* current row */ {
-               ANALYTICAL_FIRST_LAST_BRANCHES(F_CURRENT_ROW);
-       } break;
-       default: {
-               ANALYTICAL_FIRST_LAST_BRANCHES(F_OTHERS);
-       }
-       }
-
-       BATsetcount(r, (BUN) cnt);
-       r->tnonil = !has_nils;
-       r->tnil = has_nils;
-       return GDK_SUCCEED;
-}
-
-#define ANALYTICAL_FIRST_LAST_FIXED_L_UNBOUNDED_TILL_CURRENT_ROW(TPE)  \
-       do { \
-               for (; k < i;) { \
-                       j = k; \
-                       do {    \
-                               k++; \
-                       } while (k < i && !op[k]);      \
-                       TPE curval = bp[k - 1]; \
-                       for (; j < k; j++) \
-                               rb[j] = curval; \
-                       has_nils |= is_##TPE##_nil(curval); \
-               } \
-       } while (0)
-
-#define ANALYTICAL_FIRST_LAST_FIXED_L_ALL_ROWS(TPE)    \
-       do { \
-               TPE v = bp[i - 1]; \
-               for (; k < i; k++) \
-                       rb[k] = v; \
-               has_nils |= is_##TPE##_nil(v); \
-       } while (0)
-
-#define ANALYTICAL_FIRST_LAST_FIXED_L_CURRENT_ROW(TPE) 
ANALYTICAL_FIRST_LAST_FIXED_F_CURRENT_ROW(TPE)
-
-#define ANALYTICAL_FIRST_LAST_FIXED_L_OTHERS(TPE)                              
\
-       do {                                                    \
-               for (; k < i; k++) { \
-                       TPE *bs = bp + start[k], *be = bp + end[k];             
        \
-                       TPE curval = (be > bs) ? *(be - 1) : TPE##_nil; \
-                       rb[k] = curval;                         \
-                       has_nils |= is_##TPE##_nil(curval);             \
-               }                                               \
-       } while (0)
-
-#define ANALYTICAL_FIRST_LAST_VARSIZED_L_UNBOUNDED_TILL_CURRENT_ROW    \
-       do { \
-               for (; k < i;) { \
-                       j = k; \
-                       do {    \
-                               k++; \
-                       } while (k < i && !op[k]);      \
-                       const void *curval = BUNtail(bpi, k - 1);       \
-                       for (; j < k; j++) \
-                               if (tfastins_nocheckVAR(r, j, curval, Tsize(r)) 
!= GDK_SUCCEED) \
-                                       return GDK_FAIL; \
-                       has_nils |= atomcmp(curval, nil) == 0;  \
-               } \
-       } while (0)
-
-#define ANALYTICAL_FIRST_LAST_VARSIZED_L_ALL_ROWS      \
-       do { \
-               const void *curval = BUNtail(bpi, i - 1);       \
-               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_FIRST_LAST_VARSIZED_L_CURRENT_ROW   
ANALYTICAL_FIRST_LAST_VARSIZED_F_CURRENT_ROW
-
-#define ANALYTICAL_FIRST_LAST_VARSIZED_L_OTHERS                \
-       do {                                                    \
-               for (; k < i; k++) { \
-                       const void *curval = (end[k] > start[k]) ? BUNtail(bpi, 
(BUN) (end[k] - 1)) : nil;      \
-                       if (tfastins_nocheckVAR(r, k, curval, Tsize(r)) != 
GDK_SUCCEED) \
-                               return GDK_FAIL;        \
-                       has_nils |= atomcmp(curval, nil) == 0;  \
-               }       \
-       } while (0)
-
-gdk_return
-GDKanalyticallast(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, int tpe, int 
frame_type)
-{
-       bool has_nils = false;
-       lng i = 0, j = 0, k = 0, cnt = (lng) BATcount(b);
-       lng *restrict start = s ? (lng*)Tloc(s, 0) : NULL, *restrict end = e ? 
(lng*)Tloc(e, 0) : NULL;
-       bit *np = p ? Tloc(p, 0) : NULL, *op = o ? Tloc(o, 0) : NULL;
-       BATiter bpi = bat_iterator(b);
-       const void *nil = ATOMnilptr(tpe);
-       int (*atomcmp)(const void *, const void *) = ATOMcompare(tpe);
-
-       switch (frame_type) {
-       case 3: /* unbounded until current row */       {
-               ANALYTICAL_FIRST_LAST_BRANCHES(L_UNBOUNDED_TILL_CURRENT_ROW);
-       } break;
-       case 4: /* current row until unbounded */
-       case 5: /* all rows */  {
-               ANALYTICAL_FIRST_LAST_BRANCHES(L_ALL_ROWS);
-       } break;
-       case 6: /* current row */ {
-               ANALYTICAL_FIRST_LAST_BRANCHES(L_CURRENT_ROW);
-       } break;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to