Changeset: 4219874a3be9 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4219874a3be9
Modified Files:
        sql/server/rel_select.c
Branch: sciql
Log Message:

Some progress again in Part 2 of SciQL GROUP BY

Instead of using ATOMs, build sql_exp-s to dynamically compute the GROUP BY 
offsets


diffs (190 lines):

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
@@ -3868,10 +3868,6 @@ rel_nop(mvc *sql, sql_rel **rel, symbol 
        return sql_error(sql, 02, "SELECT: no such operator '%s'", fname);
 }
 
-#define GET_DIM_SZ(tpe,sta,ste,sto) \
-       ceil((*(tpe *)VALget(&sto->data) * 1.0 - *(tpe *)VALget(&sta->data)) / \
-                       *(tpe *)VALget(&ste->data));
-
 /* E.g.:
  * sql> plan select sum(v) from a group by a[x-1:x+2][y-1:y+2];
  *
@@ -3901,14 +3897,14 @@ static sql_exp *
 _rel_tiling_aggr(mvc *sql, sql_rel **rel, sql_rel *groupby, int distinct, char 
*aggrstr, symbol *sym, int f)
 {
        sql_exp *exp = NULL, **dim = NULL, **oss = NULL;
-       atom **os_sta = NULL, **os_ste = NULL, **os_sto = NULL;
+       sql_exp **os_sta = NULL, **os_ste = NULL, **os_sto = NULL, **nrep = 
NULL, **ngrp = NULL;
        sql_subfunc *sf = NULL;
+       sql_subtype st_int, st_flt;
        list *arrg_args = new_exp_list(sql->sa);
        char *aggrstr2 = SA_NEW_ARRAY(sql->sa, char, strlen("array_t") + 
strlen(aggrstr) + 1);
        node *cn = NULL;
        sql_table *t = (sql_table*)((sql_rel*)groupby->l)->l;
-       int i = 0, j = 0, cnt = 0, *nrep = NULL, *ngrp = NULL;
-       lng *dsize = NULL;
+       int i = 0, j = 0, *dsize = NULL;
        sql_column *sc = NULL;
 
        (void)distinct;
@@ -3931,11 +3927,11 @@ _rel_tiling_aggr(mvc *sql, sql_rel **rel
        }
 
        dim    = SA_NEW_ARRAY(sql->sa, sql_exp*, t->ndims);
-       os_sta = SA_NEW_ARRAY(sql->sa, atom*, t->ndims);
-       os_ste = SA_NEW_ARRAY(sql->sa, atom*, t->ndims);
-       os_sto = SA_NEW_ARRAY(sql->sa, atom*, t->ndims);
+       os_sta = SA_NEW_ARRAY(sql->sa, sql_exp*, t->ndims);
+       os_ste = SA_NEW_ARRAY(sql->sa, sql_exp*, t->ndims);
+       os_sto = SA_NEW_ARRAY(sql->sa, sql_exp*, t->ndims);
        oss    = SA_NEW_ARRAY(sql->sa, sql_exp*, t->ndims);
-       dsize  = SA_NEW_ARRAY(sql->sa, lng, t->ndims);
+       dsize  = SA_NEW_ARRAY(sql->sa, int, t->ndims);
        if (!dim || !os_sta || !os_ste || !os_sto || !oss || !dsize) {
                return sql_error(sql, 02, "SELECT: failed to allocate space");
        }
@@ -3945,10 +3941,9 @@ _rel_tiling_aggr(mvc *sql, sql_rel **rel
                atom *d_sta = NULL, *d_ste = NULL, *d_sto = NULL;
 
                dim[i] = cn->data;
-               /* TODO: check if os_st{a,e,o}[i]->{l,r,f} == NULL */
-               os_sta[i] = sql_bind_arg(sql, 
((sql_exp*)((list*)dim[i]->f)->h->data)->flag);
-               os_ste[i] = sql_bind_arg(sql, 
((sql_exp*)((list*)dim[i]->f)->h->next->data)->flag);
-               os_sto[i] = sql_bind_arg(sql, 
((sql_exp*)((list*)dim[i]->f)->h->next->next->data)->flag);
+               os_sta[i] = (sql_exp*)((list*)dim[i]->f)->h->data;
+               os_ste[i] = (sql_exp*)((list*)dim[i]->f)->h->next->data;
+               os_sto[i] = (sql_exp*)((list*)dim[i]->f)->h->next->next->data;
 
                /* immediately compute the |dim[i]| */
                if (!(sc = get_dimension(sql, t, dim[i]->name))) {
@@ -3960,23 +3955,23 @@ _rel_tiling_aggr(mvc *sql, sql_rel **rel
                d_sto = atom_general(sql->sa, &sc->type, sc->dim->stop);
                switch(d_sto->data.vtype){
                        case TYPE_bte:
-                               dsize[i] = GET_DIM_SZ(bte, d_sta, d_ste, d_sto);
+                               dsize[i] = ceil((*(bte *)VALget(&d_sto->data) * 
1.0 - *(bte *)VALget(&d_sta->data)) / *(bte *)VALget(&d_ste->data));
                                break;
                        case TYPE_sht:
-                               dsize[i] = GET_DIM_SZ(sht, d_sta, d_ste, d_sto);
+                               dsize[i] = ceil((*(sht *)VALget(&d_sto->data) * 
1.0 - *(sht *)VALget(&d_sta->data)) / *(sht *)VALget(&d_ste->data));
                                break;
                        case TYPE_int:
-                               dsize[i] = GET_DIM_SZ(int, d_sta, d_ste, d_sto);
+                               dsize[i] = ceil((*(int *)VALget(&d_sto->data) * 
1.0 - *(int *)VALget(&d_sta->data)) / *(int *)VALget(&d_ste->data));
                                break;
                        case TYPE_lng:
-                               dsize[i] = GET_DIM_SZ(lng, d_sta, d_ste, d_sto);
+                               dsize[i] = ceil((*(lng *)VALget(&d_sto->data) * 
1.0 - *(lng *)VALget(&d_sta->data)) / *(lng *)VALget(&d_ste->data));
                                break;
                        case TYPE_flt:
-                               dsize[i] = GET_DIM_SZ(flt, d_sta, d_ste, d_sto);
+                               dsize[i] = ceil((*(flt *)VALget(&d_sto->data) * 
1.0 - *(flt *)VALget(&d_sta->data)) / *(flt *)VALget(&d_ste->data));
                                return sql_error(sql, 02, "SELECT: unsupported 
data type \"%s\" of tiling dimension", sc->type.type->sqlname);
                                break;
                        case TYPE_dbl:
-                               dsize[i] = GET_DIM_SZ(dbl, d_sta, d_ste, d_sto);
+                               dsize[i] = ceil((*(dbl *)VALget(&d_sto->data) * 
1.0 - *(dbl *)VALget(&d_sta->data)) / *(dbl *)VALget(&d_ste->data));
                                return sql_error(sql, 02, "SELECT: unsupported 
data type \"%s\" of tiling dimension", sc->type.type->sqlname);
                                break;
                        default: /* should not reach here */
@@ -3984,40 +3979,44 @@ _rel_tiling_aggr(mvc *sql, sql_rel **rel
                }
        }
 
-       /* compute the repeatings, see the formula in rel_schema.c */
-       nrep = SA_NEW_ARRAY(sql->sa, int, t->ndims);
-       ngrp = SA_NEW_ARRAY(sql->sa, int, t->ndims);
+       /* Compute the repeatings, see the formula in rel_schema.c.
+        * The parameters of array_series1() are dynamically computed by the 
sql_exp-s.
+        */
+       nrep = SA_NEW_ARRAY(sql->sa, sql_exp*, t->ndims);
+       ngrp = SA_NEW_ARRAY(sql->sa, sql_exp*, t->ndims);
        if(!nrep || !ngrp) {
                return sql_error(sql, 02, "SELECT: failed to allocate space");
        }
-       for(i = 0; i < t->ndims; i++) nrep[i] = ngrp[i] = 1;
+       sql_find_subtype(&st_int, "int", 9, 0);
+       sql_find_subtype(&st_flt, "double", 23, 0);
+       for(i = 0; i < t->ndims; i++) nrep[i] = ngrp[i] = exp_atom_int(sql->sa, 
1);
        for (i = 0; i < t->ndims; i++){
-               switch(os_sta[i]->data.vtype){
-                       case TYPE_bte:
-                               cnt = GET_DIM_SZ(bte, os_sta[i], os_ste[i], 
os_sto[i]);
-                               break;
-                       case TYPE_sht:
-                               cnt = GET_DIM_SZ(sht, os_sta[i], os_ste[i], 
os_sto[i]);
-                               break;
-                       case TYPE_int:
-                               cnt = GET_DIM_SZ(int, os_sta[i], os_ste[i], 
os_sto[i]);
-                               break;
-                       case TYPE_lng:
-                               cnt = GET_DIM_SZ(lng, os_sta[i], os_ste[i], 
os_sto[i]);
-                               break;
-                       case TYPE_flt:
-                               cnt = GET_DIM_SZ(flt, os_sta[i], os_ste[i], 
os_sto[i]);
-                               return sql_error(sql, 02, "SELECT: unsupported 
data type \"%s\" of tiling dimension", sc->type.type->sqlname);
-                               break;
-                       case TYPE_dbl:
-                               cnt = GET_DIM_SZ(dbl, os_sta[i], os_ste[i], 
os_sto[i]);
-                               return sql_error(sql, 02, "SELECT: unsupported 
data type \"%s\" of tiling dimension", sc->type.type->sqlname);
-                               break;
-                       default: /* should not reach here */
-                               return sql_error(sql, 02, "SELECT: unsupported 
data type \"%s\" of tiling dimension", sc->type.type->sqlname);
+               list *ceil_args = new_exp_list(sql->sa);
+
+               exp = rel_check_type(sql, &st_flt, os_sto[i], type_cast);
+               if(!(sf = sql_bind_func(sql->sa, sql->session->schema, 
"sql_sub", exp_subtype(exp), exp_subtype(exp), F_FUNC)))
+                       return sql_error(sql, 02, "failed to bind to the SQL 
function \"-\"");
+               /* FIXME: why do I need this extra rel_check_type? */
+               append(ceil_args, exp_binop(sql->sa, exp, rel_check_type(sql, 
&st_flt, os_sta[i], type_cast), sf));
+
+               if(!(sf = sql_bind_func_(sql->sa, sql->session->schema, "ceil", 
exps_subtype(ceil_args), F_FUNC)))
+                       return sql_error(sql, 02, "failed to bind to the SQL 
function \"ceil\"");
+               exp = rel_check_type(sql, &st_int, exp_op(sql->sa, ceil_args, 
sf), type_cast);
+
+               if(!(sf = sql_bind_func(sql->sa, sql->session->schema, 
"sql_div", exp_subtype(exp), exp_subtype(os_ste[i]), F_FUNC)))
+                       return sql_error(sql, 02, "failed to bind to the SQL 
function \"/\"");
+               exp = exp_binop(sql->sa, exp, os_ste[i], sf);
+
+               for (j = 0; j < i; j++) {
+                       if(!(sf = sql_bind_func(sql->sa, sql->session->schema, 
"sql_mul", exp_subtype(nrep[j]), exp_subtype(exp), F_FUNC)))
+                               return sql_error(sql, 02, "failed to bind to 
the SQL function \"*\"");
+                       nrep[j] = exp_binop(sql->sa, nrep[j], exp, sf);
                }
-               for (j = 0; j < i; j++) nrep[j] = nrep[j] * cnt;
-               for (j = t->ndims; j > i; j--) ngrp[j] = ngrp[j] * cnt;
+               for (j = t->ndims-1; j > i; j--) {
+                       if(!(sf = sql_bind_func(sql->sa, sql->session->schema, 
"sql_mul", exp_subtype(ngrp[j]), exp_subtype(exp), F_FUNC)))
+                               return sql_error(sql, 02, "failed to bind to 
the SQL function \"*\"");
+                       ngrp[j] = exp_binop(sql->sa, ngrp[j], exp, sf);
+               }
        }
        /* finally, we build a list of args 'srs_args' with all parameters to
         * 'array_series1' to compute the materialised offsets 'oss' for each
@@ -4025,17 +4024,17 @@ _rel_tiling_aggr(mvc *sql, sql_rel **rel
         * functions. */
        for (i = 0; i < t->ndims; i++) {
                list *srs_args = new_exp_list(sql->sa);
-               append(srs_args, exp_atom(sql->sa, os_sta[i]));
-               append(srs_args, exp_atom(sql->sa, os_ste[i]));
-               append(srs_args, exp_atom(sql->sa, os_sto[i]));
-               append(srs_args, exp_atom_lng(sql->sa, nrep[i]));
-               append(srs_args, exp_atom_lng(sql->sa, ngrp[i]));
+               append(srs_args, os_sta[i]);
+               append(srs_args, os_ste[i]);
+               append(srs_args, os_sto[i]);
+               append(srs_args, nrep[i]);
+               append(srs_args, ngrp[i]);
                if(!(sf = sql_bind_func_(sql->sa, sql->session->schema, 
"array_series1", exps_subtype(srs_args), F_FUNC)))
                        return sql_error(sql, 02, "failed to bind to the SQL 
function \"array_series1\"");
 
                append(arrg_args, dim[i]);
                append(arrg_args, exp_op(sql->sa, srs_args, sf));
-               append(arrg_args, exp_atom_lng(sql->sa, dsize[i]));
+               append(arrg_args, exp_atom_int(sql->sa, dsize[i]));
        }
        if(!(sf = sql_bind_func_(sql->sa, sql->session->schema, aggrstr2, 
exps_subtype(arrg_args), F_FUNC)))
                return sql_error(sql, 02, "failed to bind to the SQL function 
\"%s\"", aggrstr2);
_______________________________________________
Checkin-list mailing list
Checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to