Changeset: a51992797972 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a51992797972 Modified Files: monetdb5/modules/kernel/arrays.c monetdb5/modules/kernel/arrays.h monetdb5/modules/kernel/arrays.mal sql/backends/monet5/sql_gencode.c Branch: arrays Log Message:
make sure that leftfetch join gets the second variable of its imputs if it exists + create the missing values of a non-dimension BAT before projecting it diffs (137 lines): diff --git a/monetdb5/modules/kernel/arrays.c b/monetdb5/modules/kernel/arrays.c --- a/monetdb5/modules/kernel/arrays.c +++ b/monetdb5/modules/kernel/arrays.c @@ -19,6 +19,10 @@ static int jumpSize(gdk_array *array, in return skip; } +static int arrayCellsNum(gdk_array *array) { + return jumpSize(array, array->dimsNum); +} + static bool overlapingRanges(gdk_dimension *dim1, gdk_dimension *dim2) { if(*(oid*)dim1->max < *(oid*)dim2->min || *(oid*)dim2->max < *(oid*)dim1->min) { //disjoint ranges. empty result @@ -181,7 +185,7 @@ str ALGdimensionLeftfetchjoin2(bat *resu return MAL_SUCCEED; } -str ALGnonDimensionLeftfetchjoin(bat* result, const ptr* dimsCand, const bat *candBat, const bat *valsBat) { +str ALGnonDimensionLeftfetchjoin1(bat* result, const ptr* dimsCand, const bat *candBat, const bat *valsBat) { (void)*result; (void)*dimsCand; (void)*candBat; @@ -190,6 +194,33 @@ str ALGnonDimensionLeftfetchjoin(bat* re return MAL_SUCCEED; } +str ALGnonDimensionLeftfetchjoin2(bat* result, const bat *tids, const bat *vals, const ptr *dims) { + BAT *materialisedBAT = NULL; + BAT *nonDimensionalBAT = NULL; + BUN neededCellsNum; + + gdk_array *array = (gdk_array*)*dims; + + if ((nonDimensionalBAT = BATdescriptor(*vals)) == NULL) { + throw(MAL, "algebra.leftfecthjoin", RUNTIME_OBJECT_MISSING); + } + (void)*tids; //ignore the tids + + neededCellsNum = arrayCellsNum(array) - BATcount(nonDimensionalBAT); + + /*TODO: fix this so that I can have the real default value of the column */ + materialisedBAT = materialise_nonDimensional_column(ATOMtype(BATttype(nonDimensionalBAT)), neededCellsNum, NULL); + + BBPunfix(nonDimensionalBAT->batCacheid); + + if(materialisedBAT) { + BBPkeepref(*result = materialisedBAT->batCacheid); + return MAL_SUCCEED; + } + + throw(MAL, "algebra.leftfetchjoin", "Problem materialising non-dimensional column"); +} + static str emptyCandidateResults(ptr *candsRes_dims, bat* candsRes_bid) { BAT *candidatesBAT = NULL; diff --git a/monetdb5/modules/kernel/arrays.h b/monetdb5/modules/kernel/arrays.h --- a/monetdb5/modules/kernel/arrays.h +++ b/monetdb5/modules/kernel/arrays.h @@ -14,7 +14,8 @@ algebra_export str ALGdimensionLeftfetchjoin1(bat* result, const bat* cands, const ptr *dims, const ptr *dim) ; algebra_export str ALGdimensionLeftfetchjoin2(bat* result, const ptr* dimsCand, const ptr *dims, const ptr *dim) ; -algebra_export str ALGnonDimensionLeftfetchjoin(bat* result, const ptr* dimsCand, const bat *candBat, const bat *valsBat); +algebra_export str ALGnonDimensionLeftfetchjoin1(bat* result, const ptr* dimsCand, const bat *candBat, const bat *valsBat); +algebra_export str ALGnonDimensionLeftfetchjoin2(bat* result, const bat *tids, const bat *vals, const ptr *dims); //algebra_export str ALGnonDimensionLeftfetchjoin(bat *result, const bat *lid, const bat *rid); //algebra_export str ALGdimensionLeftfetchjoin(bat *result, const bat *lid, const bat *rid); diff --git a/monetdb5/modules/kernel/arrays.mal b/monetdb5/modules/kernel/arrays.mal --- a/monetdb5/modules/kernel/arrays.mal +++ b/monetdb5/modules/kernel/arrays.mal @@ -7,7 +7,11 @@ command algebra.leftfetchjoin(dimsCand:p address ALGdimensionLeftfetchjoin2; #it is called after a selection on a non-dimensional column when projecting a non-dimensional column and is the mbr of the qualifying cells command algebra.leftfetchjoin(dimsCand:ptr, candBat:bat[:oid,:oid], valsBat:bat[:oid,:any] ) :bat[:oid,:any] -address ALGnonDimensionLeftfetchjoin; +address ALGnonDimensionLeftfetchjoin1; +#it is called when projecting a non-dimensional column of an array +command algebra.leftfetchjoin(tids:bat[:oid,:oid],vals:bat[:oid,:any],dims:ptr) :bat[:oid,:any] +address ALGnonDimensionLeftfetchjoin2; + command algebra.mbrsubselect(dims:ptr, dim:ptr, s:bat[:oid, :oid], c:bat[:oid, :oid]) :bat[:oid,:oid] address ALGmbrsubselect; diff --git a/sql/backends/monet5/sql_gencode.c b/sql/backends/monet5/sql_gencode.c --- a/sql/backends/monet5/sql_gencode.c +++ b/sql/backends/monet5/sql_gencode.c @@ -1848,9 +1848,13 @@ static int else q = newStmt2(mb, algebraRef, leftjoinRef); q = pushArgument(mb, q, l); - /*if the second argument is a BAT and the first has two variables then - * it is a subselect on a non-dimensional column that produces an MBR */ - if(getVarType(mb, r) == TYPE_bat || getVarType(mb, r) == TYPE_any) { + { + /* if the first argument has two variables then it is a sub-select + * on a non-dimensional column that produces an MBR */ + ///*if the second argument is a BAT and the first has two variables then + //* it is a subselect on a non-dimensional column that produces an MBR */ + +// if(getVarType(mb, r) == TYPE_bat || getVarType(mb, r) >= TYPE_any) { char nme[SMALLBUFSIZ]; int uval = -1; @@ -1858,19 +1862,22 @@ static int uval = findVariable(mb, nme); if(uval >= 0) q = pushArgument(mb, q, uval); - } +// } q = pushArgument(mb, q, r); - if(s->op2->type == st_dimension) { - char nme[SMALLBUFSIZ]; - int uval = -1; - + /* if the second argument has two variables then it is either a dimensional + * or a non-dimensional column of an array along with the dimensional of the array */ +// if(s->op2->type == st_dimension) { +// char nme[SMALLBUFSIZ]; +// int uval = -1; +// snprintf(nme, SMALLBUFSIZ, "Y_%d", r); uval = findVariable(mb, nme); - assert(uval >= 0); - q = pushArgument(mb, q, uval); +// assert(uval >= 0); + if(uval >= 0) + q = pushArgument(mb, q, uval); +// } } - if (q == NULL) return -1; s->nr = getDestVar(q); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list