Changeset: fa0227021fc1 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=fa0227021fc1
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_rank.c
        sql/common/sql_types.c
        sql/server/rel_select.c
Branch: analytics
Log Message:

Cleanup and made min analytical function on integers working.


diffs (251 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -511,7 +511,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
 
                                                }
                                                es = stmt_uselect(be, es, 
stmt_bool(be,1), cmp_equal, NULL, 0);
-                                       } else /* need a condition */
+                                       } else if (f->func->type != 
F_ANALYTIC)/* need a condition */
                                                cond_execution = es;
                                }
                                if (es->nrcols > nrcols)
diff --git a/sql/backends/monet5/sql_rank.c b/sql/backends/monet5/sql_rank.c
--- a/sql/backends/monet5/sql_rank.c
+++ b/sql/backends/monet5/sql_rank.c
@@ -35,11 +35,11 @@ SQLdiff(Client cntxt, MalBlkPtr mb, MalS
                int (*cmp)(const void *, const void *);
                BATiter it;
                ptr v;
-                       
+
                if (!b)
-                       throw(SQL, "sql.rank", SQLSTATE(HY005) "Cannot access 
column descriptor");
+                       throw(SQL, "sql.diff", SQLSTATE(HY005) "Cannot access 
column descriptor");
                cnt = (int)BATcount(b);
-               voidresultBAT(r, TYPE_bit, cnt, b, "Cannot create bat");
+               voidresultBAT(r, TYPE_bit, cnt, b, "sql.diff");
                rp = (bit*)Tloc(r, 0);
                if (pci->argc > 2) {
                        c = b;
@@ -47,7 +47,7 @@ SQLdiff(Client cntxt, MalBlkPtr mb, MalS
                        b = BATdescriptor(*bid);
                        if (!b) {
                                BBPunfix(c->batCacheid);
-                               throw(SQL, "sql.rank", SQLSTATE(HY005) "Cannot 
access column descriptor");
+                               throw(SQL, "sql.diff", SQLSTATE(HY005) "Cannot 
access column descriptor");
                        }
 
                        cmp = ATOMcompare(b->ttype);
@@ -64,8 +64,8 @@ SQLdiff(Client cntxt, MalBlkPtr mb, MalS
                        }
                        BBPunfix(c->batCacheid);
                } else {
-                       cmp = ATOMcompare(b->ttype);
-                       it = bat_iterator(b);
+                       cmp = ATOMcompare(b->ttype);
+                       it = bat_iterator(b);
                        v = BUNtail(it, 0);
 
                        for(i=0; i<cnt; i++, rp++) {
@@ -105,7 +105,7 @@ SQLrow_number(Client cntxt, MalBlkPtr mb
                if (!b)
                        throw(SQL, "sql.row_number", SQLSTATE(HY005) "Cannot 
access column descriptor");
                cnt = (int)BATcount(b);
-               voidresultBAT(r, TYPE_int, cnt, b, "Cannot create bat");
+               voidresultBAT(r, TYPE_int, cnt, b, "sql.row_number");
                rp = (int*)Tloc(r, 0);
                if (isaBatType(getArgType(mb, pci, 2))) { 
                        /* order info not used */
@@ -154,7 +154,7 @@ SQLrank(Client cntxt, MalBlkPtr mb, MalS
                if (!b)
                        throw(SQL, "sql.rank", SQLSTATE(HY005) "Cannot access 
column descriptor");
                cnt = (int)BATcount(b);
-               voidresultBAT(r, TYPE_int, cnt, b, "Cannot create bat");
+               voidresultBAT(r, TYPE_int, cnt, b, "sql.rank");
                rp = (int*)Tloc(r, 0);
                if (isaBatType(getArgType(mb, pci, 2))) { 
                        if (isaBatType(getArgType(mb, pci, 3))) { 
@@ -227,7 +227,7 @@ SQLdense_rank(Client cntxt, MalBlkPtr mb
        if (pci->argc != 4 || 
                (getArgType(mb, pci, 2) != TYPE_bit && 
getBatType(getArgType(mb, pci, 2)) != TYPE_bit) || 
                (getArgType(mb, pci, 3) != TYPE_bit && 
getBatType(getArgType(mb, pci, 3)) != TYPE_bit)){
-               throw(SQL, "sql.rank", SQLSTATE(42000) 
"dense_rank(:any_1,:bit,:bit)");
+               throw(SQL, "sql.dense_rank", SQLSTATE(42000) 
"dense_rank(:any_1,:bit,:bit)");
        }
        (void)cntxt;
        if (isaBatType(getArgType(mb, pci, 1))) {
@@ -239,7 +239,7 @@ SQLdense_rank(Client cntxt, MalBlkPtr mb
                if (!b)
                        throw(SQL, "sql.dense_rank", SQLSTATE(HY005) "Cannot 
access column descriptor");
                cnt = (int)BATcount(b);
-               voidresultBAT(r, TYPE_int, cnt, b, "Cannot create bat");
+               voidresultBAT(r, TYPE_int, cnt, b, "sql.dense_rank");
                rp = (int*)Tloc(r, 0);
                if (isaBatType(getArgType(mb, pci, 2))) { 
                        if (isaBatType(getArgType(mb, pci, 3))) { 
@@ -307,7 +307,7 @@ SQLdense_rank(Client cntxt, MalBlkPtr mb
 }
 
 static str
-SQLanalytics_args(BAT **r, BAT **b, BAT **p, BAT **o,  Client cntxt, MalBlkPtr 
mb, MalStkPtr stk, InstrPtr pci, const str mod, const str err) 
+SQLanalytics_args(BAT **r, BAT **b, BAT **p, BAT **o, Client cntxt, MalBlkPtr 
mb, MalStkPtr stk, InstrPtr pci, const str mod, const str err)
 {
        *r = *b = *p = *o = NULL;
 
@@ -320,11 +320,11 @@ SQLanalytics_args(BAT **r, BAT **b, BAT 
        if (isaBatType(getArgType(mb, pci, 1))) {
                *b = BATdescriptor(*getArgReference_bat(stk, pci, 1));
                if (!*b)
-                       throw(SQL, mod, "Cannot access descriptor");
+                       throw(SQL, mod, SQLSTATE(HY005) "Cannot access column 
descriptor");
        }
        if (b) {
                size_t cnt = BATcount(*b);
-               voidresultBAT((*r), (*b)->ttype, cnt, (*b), "Cannot create 
bat");
+               voidresultBAT((*r), (*b)->ttype, cnt, (*b), mod);
                if (!*r) 
                        if (*b) BBPunfix((*b)->batCacheid);
        }
@@ -333,7 +333,7 @@ SQLanalytics_args(BAT **r, BAT **b, BAT 
                if (!*p) {
                        if (*b) BBPunfix((*b)->batCacheid);
                        if (*r) BBPunfix((*r)->batCacheid);
-                       throw(SQL, mod, "Cannot access descriptor");
+                       throw(SQL, mod, SQLSTATE(HY005) "Cannot access column 
descriptor");
                }
        }
        if (isaBatType(getArgType(mb, pci, 3))) { 
@@ -342,18 +342,18 @@ SQLanalytics_args(BAT **r, BAT **b, BAT 
                        if (*b) BBPunfix((*b)->batCacheid);
                        if (*r) BBPunfix((*r)->batCacheid);
                        if (*p) BBPunfix((*p)->batCacheid);
-                       throw(SQL, mod, "Cannot access descriptor");
+                       throw(SQL, mod, SQLSTATE(HY005) "Cannot access column 
descriptor");
                }
        }
-       return NULL;
+       return MAL_SUCCEED;
 }
 
 str 
 SQLmin(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
        BAT *r, *b, *p, *o;
-       str res = SQLanalytics_args( &r, &b, &p, &o, cntxt, mb, stk, pci, 
"sql.min", "min(:any_1,:bit,:bit)");
-       int tpe = getArgType(mb, pci, 1); 
+       str msg = SQLanalytics_args( &r, &b, &p, &o, cntxt, mb, stk, pci, 
"sql.min", "min(:any_1,:bit,:bit)");
+       int tpe = getArgType(mb, pci, 1);
        int unit = *getArgReference_int(stk, pci, 4);
        int start = *getArgReference_int(stk, pci, 5);
        int end = *getArgReference_int(stk, pci, 6);
@@ -366,8 +366,8 @@ SQLmin(Client cntxt, MalBlkPtr mb, MalSt
 
        if (isaBatType(tpe))
                tpe = getBatType(tpe);
-       if (res)
-               return res;
+       if (msg)
+               return msg;
 
        /*
        switch(ATOMstorage(tpe)) {
@@ -388,34 +388,32 @@ SQLmin(Client cntxt, MalBlkPtr mb, MalSt
        /* FOR NOW only int input type !! */
        if (b) {
                bat *res = getArgReference_bat(stk, pci, 0);
-               int i, j, cnt, *rp, *rb, *bp, curval;
+               int i, j, cnt;
+               int *rp, *rb, *bp, curval;
                bit *np, *no;
-                       
+
                cnt = (int)BATcount(b);
                rb = rp = (int*)Tloc(r, 0);
                bp = (int*)Tloc(b, 0);
                curval = *bp;
                if (p) {
                        if (o) {
-                               np = (bit*)Tloc(p, 0);
-                               no = (bit*)Tloc(o, 0);
-                               for(i=1,j=1; i<=cnt; i++, np++, no++, rp++, 
bp++) {
+                               np = (bit*)Tloc(p, 0);
+                               no = (bit*)Tloc(o, 0);
+                               for(i=1; i<=cnt; i++, np++, no++, rp++, bp++) {
                                        if (*np) {
-                                               j=1;
                                                for (;rb < rp; rb++)
                                                        *rb = curval;
                                                curval = *bp;
-                                       } else if (*no)
-                                               j++;
+                                       }
                                        curval = MIN(*bp,curval);
                                }
                                for (;rb < rp; rb++)
                                        *rb = curval;
                        } else { /* single value, ie no ordering */
-                               np = (bit*)Tloc(p, 0);
-                               for(i=1,j=1; i<=cnt; i++, np++, rp++, bp++) {
+                               np = (bit*)Tloc(p, 0);
+                               for(i=1; i<=cnt; i++, np++, rp++, bp++) {
                                        if (*np) {
-                                               j=1;
                                                for (;rb < rp; rb++)
                                                        *rb = curval;
                                                curval = *bp;
diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c
--- a/sql/common/sql_types.c
+++ b/sql/common/sql_types.c
@@ -1567,8 +1567,7 @@ sqltypeinit( sql_allocator *sa)
        sql_create_analytic(sa, "dense_rank", "sql", "dense_rank", ANY, BIT, 
BIT, INT, SCALE_NONE);
        sql_create_analytic(sa, "row_number", "sql", "row_number", ANY, BIT, 
BIT, INT, SCALE_NONE);
 
-
-       //sql_create_analytic(sa, "percent_rank", "sql", "precent_rank", ANY, 
BIT, BIT, INT, SCALE_NONE);
+       //sql_create_analytic(sa, "percent_rank", "sql", "percent_rank", ANY, 
BIT, BIT, INT, SCALE_NONE);
        //sql_create_analytic(sa, "cume_dist", "sql", "cume_dist", ANY, BIT, 
BIT, ANY, SCALE_NONE);
        //sql_create_analytic(sa, "lag", "sql", "lag", ANY, BIT, BIT, ANY, 
SCALE_NONE);
        //sql_create_analytic(sa, "lead", "sql", "lead", ANY, BIT, BIT, ANY, 
SCALE_NONE);
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -4446,7 +4446,7 @@ rel_frame(mvc *sql, symbol *frame, list 
  * a = project( table ) [ x, y, z, w, v ], [ x, y]
  * b = project( table ) [ x, y, z, w, v ], [ y, x]
  *
- * project with order dependend operators, ie combined prev/current value 
+ * project with order dependent operators, ie combined prev/current value
  * aa = project (a) [ x, y, r = rank_op(diff(x) (marks a new partition), 
rediff(diff(x), y) (marks diff value with in partition)), z, w, v ]
  * project(aa) [ aa.x, aa.y, aa.r ] -- only keep current output list 
  * bb = project (b) [ x, y, a = aggr_op(z, diff(y), rediff(diff(y), x)), z, w, 
v ]
@@ -4467,7 +4467,7 @@ rel_rankop(mvc *sql, sql_rel **rel, symb
        list *gbe = NULL, *obe = NULL, *fbe = NULL, *args, *types;
        sql_schema *s = sql->session->schema;
        int distinct = 0, project_added = 0, aggr = 0;
-       
+
        if (window_function->token == SQL_RANK) {
                aname = qname_fname(window_function->data.lval);
                sname = qname_schema(window_function->data.lval);
@@ -4515,7 +4515,7 @@ rel_rankop(mvc *sql, sql_rel **rel, symb
                obe = rel_order_by(sql, &p, 
window_specification->h->next->data.sym, f);
                if (!obe)
                        return NULL;
-               /* conditionaly? */
+               /* conditionally? */
                g = p->l;
                if (g->op == op_groupby) {
                        list_merge(p->exps, obe, (fdup)NULL);
@@ -4527,6 +4527,11 @@ rel_rankop(mvc *sql, sql_rel **rel, symb
                } else {
                        p->r = obe;
                }
+       } else if(aggr && p->r) { //set ascending order by default for 
aggregations
+               for(node *nn = ((list*)p->r)->h ; nn ; nn = nn->next) {
+                       sql_exp *en = nn->data;
+                       set_direction(en, 1);
+               }
        }
        /* Frame */
        if (window_specification->h->next->next->data.sym) {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to