Changeset: 5001ef433a19 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5001ef433a19
Modified Files:
        gdk/gdk_join.c
        monetdb5/modules/mal/batcalc.c
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql.c
        sql/server/rel_select.c
        sql/server/rel_updates.c
Branch: arrays
Log Message:

1. materialising dimensions before adding/subtracting etc
2. if oids do not create a dimension proceed as having a relational bat


diffs (225 lines):

diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -3228,8 +3228,13 @@ BATproject(BAT *l, BAT *r)
        assert(BAThdense(r));
        assert(ATOMtype(l->ttype) == TYPE_oid);
 
-       if(isBATarray(r))
-               return BATdimensionProject(l, r);
+       if(isBATarray(r)) {
+               bn = BATdimensionProject(l, r);
+               if(bn)
+                       return bn;
+               //otherwise it is cannot be expressed as an array and we 
proceed as if it is any other BAT
+               r = materialiseDimensionBAT(r);
+       }
 
        if (BATtdense(l) && BATcount(l) > 0) {
                lo = l->tseqbase;
@@ -3449,7 +3454,7 @@ BAT* BATdimensionProject(BAT* oidsBAT, B
                                        foundMax=0; \
 \
                                        if(elementsInGroup >= 0 && 
elementsInGroup != (cnt-1)) { \
-                                               GDKerror("BATdimensionProject: 
dimension not regular (different number of elements among groups %ld vs 
%ld)\n", elementsInGroup, cnt); \
+                       /*                      GDKerror("BATdimensionProject: 
dimension not regular (different number of elements among groups %ld vs 
%ld)\n", elementsInGroup, cnt); */\
                                                return NULL; \
                                        } \
                                        elementsInGroup = cnt-1; /*the current 
element does not belong in the group*/\
@@ -3464,15 +3469,15 @@ BAT* BATdimensionProject(BAT* oidsBAT, B
                        } \
                } \
                if(flg>0) { \
-                       GDKerror("BATdimensionProject: dimension not regular 
(max %ld more times than min)\n", flg); \
+/*                     GDKerror("BATdimensionProject: dimension not regular 
(max %ld more times than min)\n", flg); */\
                        return NULL; \
                } else if(flg<0) { \
-                       GDKerror("BATdimensionProject: dimension not regular 
(min %ld more times than max)\n", flg); \
+/*                     GDKerror("BATdimensionProject: dimension not regular 
(min %ld more times than max)\n", flg); */\
                        return NULL; \
                } \
                /*check the last group*/ \
                if(elementsInGroup >= 0 && elementsInGroup != cnt) { \
-                       GDKerror("BATdimensionProject: dimension not regular 
(different number of elements among groups %ld vs %ld)\n", elementsInGroup, 
cnt); \
+/*                     GDKerror("BATdimensionProject: dimension not regular 
(different number of elements among groups %ld vs %ld)\n", elementsInGroup, 
cnt); */\
                        return NULL; \
                } \
                elementsInGroup = cnt; \
@@ -3501,14 +3506,14 @@ fprintf(stderr, "dimensionise: Group:[%l
                                        } \
                                        else { \
                                                if(resElementRepeats >=0 && 
resElementRepeats != r) { \
-                                                       
GDKerror("BATdimensionProject: dimension not regular (different number of 
repetitions %ld vs %ld)\n", resElementRepeats, r); \
+/*                                                     
GDKerror("BATdimensionProject: dimension not regular (different number of 
repetitions %ld vs %ld)\n", resElementRepeats, r); */\
                                                        return NULL; \
                                                } else if(resElementRepeats <0) 
{ \
                                                        resElementRepeats = r; \
                                                        resStep = el_cur - 
el_prev; \
                                                } \
                                                if(resStep != (el_cur - 
el_prev)) { \
-                                                       
GDKerror("BATdimensionProject: dimension not regular (not equal steps)\n"); \
+/*                                                     
GDKerror("BATdimensionProject: dimension not regular (not equal steps)\n"); */\
                                                        return NULL; \
                                                } \
                                                el_prev=el_cur; \
@@ -3517,7 +3522,7 @@ fprintf(stderr, "dimensionise: Group:[%l
                                } \
                                /*check the last element in the group*/ \
                                if(resElementRepeats >=0 && resElementRepeats 
!= r) { \
-                                       GDKerror("BATdimensionProject: 
dimension not regular (different number of repetitions %ld vs %ld)\n", 
resElementRepeats, r); \
+/*                                     GDKerror("BATdimensionProject: 
dimension not regular (different number of repetitions %ld vs %ld)\n", 
resElementRepeats, r); */\
                                        return NULL; \
                                } else if(resElementRepeats <0) { \
                                        /*It should never reach this*/ \
@@ -3540,14 +3545,14 @@ fprintf(stderr, "dimensionise: Group:[%l
                        } \
                        else { \
                                if(resElementRepeats >=0 && resElementRepeats 
!= r) { \
-                                       GDKerror("BATdimensionProject: 
dimension not regular (different number of repetitionsi %ld vs %ld)\n", 
resElementRepeats, r); \
+/*                                     GDKerror("BATdimensionProject: 
dimension not regular (different number of repetitionsi %ld vs %ld)\n", 
resElementRepeats, r); */\
                                        return NULL; \
                                } else if(resElementRepeats <0) { \
                                        resElementRepeats = r; \
                                        resStep = el_cur - el_prev; \
                                } \
                                if(resStep != (el_cur - el_prev)) { \
-                                       GDKerror("BATdimensionProject: 
dimension not regular (not equal steps)\n"); \
+/*                                     GDKerror("BATdimensionProject: 
dimension not regular (not equal steps)\n"); */\
                                        return NULL; \
                                } \
                                el_prev=el_cur; \
@@ -3556,7 +3561,7 @@ fprintf(stderr, "dimensionise: Group:[%l
                } \
                /*check the last element in the group*/ \
                if(resElementRepeats >=0 && resElementRepeats != r) { \
-                       GDKerror("BATdimensionProject: dimension not regular 
(different number of repetitions %ld vs %ld)\n", resElementRepeats, r); \
+/*                     GDKerror("BATdimensionProject: dimension not regular 
(different number of repetitions %ld vs %ld)\n", resElementRepeats, r); */\
                        return NULL; \
                } else if(resElementRepeats <0) { \
                        resElementRepeats = r; \
diff --git a/monetdb5/modules/mal/batcalc.c b/monetdb5/modules/mal/batcalc.c
--- a/monetdb5/modules/mal/batcalc.c
+++ b/monetdb5/modules/mal/batcalc.c
@@ -416,6 +416,8 @@ CMDbatBINARY1(MalStkPtr stk, InstrPtr pc
                                BBPunfix(s->batCacheid);
                        throw(MAL, malfunc, RUNTIME_OBJECT_MISSING);
                }
+               if(isBATarray(b))
+                       b = materialiseDimensionBAT(b);
                assert(BAThdense(b));
                if (tp2 == TYPE_bat || isaBatType(tp2)) {
                        bid = getArgReference_bat(stk, pci, 2);
@@ -426,7 +428,9 @@ CMDbatBINARY1(MalStkPtr stk, InstrPtr pc
                                        BBPunfix(s->batCacheid);
                                throw(MAL, malfunc, RUNTIME_OBJECT_MISSING);
                        }
-                       assert(BAThdense(b));
+                       if(isBATarray(b2))
+                               b2 = materialiseDimensionBAT(b2);
+                       assert(BAThdense(b2));
                }
                if (b2) {
                        bn = (*batfunc)(b, b2, s, abort_on_error);
@@ -444,6 +448,8 @@ CMDbatBINARY1(MalStkPtr stk, InstrPtr pc
                                BBPunfix(s->batCacheid);
                        throw(MAL, malfunc, RUNTIME_OBJECT_MISSING);
                }
+               if(isBATarray(b))
+                       b = materialiseDimensionBAT(b);
                assert(BAThdense(b));
                bn = (*batfunc2)(&stk->stk[getArg(pci, 1)], b, s, 
abort_on_error);
        }
@@ -486,6 +492,8 @@ CMDbatBINARY0(MalStkPtr stk, InstrPtr pc
                                BBPunfix(s->batCacheid);
                        throw(MAL, malfunc, RUNTIME_OBJECT_MISSING);
                }
+               if(isBATarray(b))
+                       b = materialiseDimensionBAT(b);
                assert(BAThdense(b));
                if (tp2 == TYPE_bat || isaBatType(tp2)) {
                        bid = getArgReference_bat(stk, pci, 2);
@@ -496,7 +504,9 @@ CMDbatBINARY0(MalStkPtr stk, InstrPtr pc
                                        BBPunfix(s->batCacheid);
                                throw(MAL, malfunc, RUNTIME_OBJECT_MISSING);
                        }
-                       assert(BAThdense(b));
+                       if(isBATarray(b2))
+                               b2 = materialiseDimensionBAT(b2);
+                       assert(BAThdense(b2));
                }
                if (b2) {
                        bn = (*batfunc)(b, b2, s);
@@ -521,6 +531,8 @@ CMDbatBINARY0(MalStkPtr stk, InstrPtr pc
                                BBPunfix(s->batCacheid);
                        throw(MAL, malfunc, RUNTIME_OBJECT_MISSING);
                }
+               if(isBATarray(b))
+                       b = materialiseDimensionBAT(b);
                assert(BAThdense(b));
                bn = (*batfunc2)(&stk->stk[getArg(pci, 1)], b, s);
        }
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
@@ -4107,7 +4107,6 @@ rel2bin_update( mvc *sql, sql_rel *rel, 
 
        updates = table_update_stmts(sql, t, &nr_cols);
        tids = update->op4.lval->h->data;
-
        for (m = rel->exps->h; m; m = m->next) {
                sql_exp *ce = m->data;
                sql_column *c = find_sql_column(t, ce->name);
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -2329,6 +2329,13 @@ str materialiseDimension(bat* res, bat* 
                throw(MAL, "sql.materialise_dimension", RUNTIME_OBJECT_MISSING);
        }
 
+       if(!isBATarray(dimensionBAT)) {
+               //ti was planned to be a dimension but somewhere the rules were 
not
+               //suttisfied and it was treated as a normal BAT
+               resBAT = dimensionBAT;
+               BBPkeepref(*res = resBAT->batCacheid);
+       return MAL_SUCCEED;
+       }
        if(BATcount(dimensionBAT)) {
                        resBAT=materialiseDimensionBAT(dimensionBAT);
        } else {
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
@@ -5385,10 +5385,7 @@ rel_select_exp(mvc *sql, sql_rel *rel, S
                                for(whereExpNode=r->exps->h; whereExpNode; 
whereExpNode=whereExpNode->next) {
                                        sql_exp *whereExp = whereExpNode->data;
                                        if(isColumn(whereExp)) {
-//                                             sql_exp *innerExp = whereExp->l;
-//                                             if(innerExp->type == e_column) {
                                                        if(!newFilters->cnt) {
-                                                               //found a 
filter on a non-dimensinal column     
                                                                /*Assuming a 
single array add all dimensions of it to the filtering condition*/
                                                                node 
*basetableExps;
                                                                
for(basetableExps = rel->exps->h ; basetableExps; basetableExps = 
basetableExps->next) {
@@ -5398,7 +5395,6 @@ rel_select_exp(mvc *sql, sql_rel *rel, S
                                                                        }
                                                                }
                                                        }
-//                                             }
                                        }
                                        if(newFilters->cnt)
                                                break;
diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c
--- a/sql/server/rel_updates.c
+++ b/sql/server/rel_updates.c
@@ -863,9 +863,10 @@ update_table(mvc *sql, dlist *qname, dli
                }
        
                /* first create the project */
+               exps = new_exp_list(sql->sa);
                e = exp_column(sql->sa, rname = rel_name(r), TID, 
sql_bind_localtype("oid"), CARD_MULTI, 0, 1);
-               exps = new_exp_list(sql->sa);
                append(exps, e);
+       
                updates = table_update_array(sql, t);
                for (n = assignmentlist->h; n; n = n->next) {
                        symbol *a = NULL;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to