Changeset: 52f916f09b83 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=52f916f09b83 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:
generalised and unified functions diffs (183 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 @@ -129,6 +129,8 @@ str ALGdimensionLeftfetchjoin1(bat *resu BAT *candsBAT = NULL, *resBAT = NULL; BUN resSize = 0; +//TODO: Make sure that the cabdidates form an MBR + if ((candsBAT = BATdescriptor(*cands)) == NULL) { throw(MAL, "algebra.dimensionLeftfetchjoin", RUNTIME_OBJECT_MISSING); } @@ -176,25 +178,17 @@ str ALGdimensionLeftfetchjoin1(bat *resu } -str ALGdimensionLeftfetchjoin2(bat *result, const ptr *candDims, const ptr *dims, const ptr *dim) { +//str ALGnonDimensionLeftfetchjoin1(bat* result, const ptr* dimsCand, const bat *candBat, const bat *valsBat) { +str ALGnonDimensionLeftfetchjoin1(bat* result, const bat* cands, const bat *vals, const ptr *dims) { (void)*result; - (void)*candDims; + (void)*cands; + (void)*vals; (void)*dims; - (void)*dim; - - return MAL_SUCCEED; -} - -str ALGnonDimensionLeftfetchjoin1(bat* result, const ptr* dimsCand, const bat *candBat, const bat *valsBat) { - (void)*result; - (void)*dimsCand; - (void)*candBat; - (void)*valsBat; return MAL_SUCCEED; } -str ALGnonDimensionLeftfetchjoin2(bat* result, const bat *tids, const bat *vals, const ptr *dims) { +str ALGnonDimensionLeftfetchjoin2(bat* result, ptr *dimsRes, const bat *tids, const bat *vals, const ptr *dims) { BAT *materialisedBAT = NULL; BAT *nonDimensionalBAT = NULL; BUN totalCellsNum, neededCellsNum; @@ -223,7 +217,10 @@ str ALGnonDimensionLeftfetchjoin2(bat* r BBPunfix(materialisedBAT->batCacheid); BBPkeepref(*result = nonDimensionalBAT->batCacheid); - + + //sent this to the output so that we do not lose it afterwards + *dimsRes = *dims; + return MAL_SUCCEED; } 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 @@ -13,9 +13,16 @@ #endif algebra_export str ALGdimensionLeftfetchjoin1(bat* result, const bat* cands, const ptr *dims, const ptr *dim) ; +#if 0 algebra_export str ALGdimensionLeftfetchjoin2(bat* result, const ptr* dimsCand, const ptr *dims, const ptr *dim) ; +/* project a non-dimensional column based on oids selected over dimensions */ 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); +#endif +/* project a non-dimensional column based on oids selected over dimensions */ +/*make sure that the BAT with the oids is an MBR and put NULL to values that are not in the oids but are needed to create the MBR*/ +algebra_export str ALGnonDimensionLeftfetchjoin1(bat* result, const bat* cands, const bat *vals, const ptr *dims); +/* project a non-dimensional column based on tid (actually materialise it) */ +algebra_export str ALGnonDimensionLeftfetchjoin2(bat* result, ptr* dimsRes, 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 @@ -1,15 +1,17 @@ #leftfetch join when having a dimension from an array #It gets the candidates and projects the dimensions +#it should make sure that the candidates form an MBR (this might not be true of the selection was done on a nonDimensional column) command algebra.leftfetchjoin(candsBAT:bat[:oid,:oid], dims:ptr, dim:ptr ) :bat[:oid,:any] address ALGdimensionLeftfetchjoin1; -#it is called after a selection on a non-dimensional column when projecting a dimensional column and is the mbr of the qualifying cells -command algebra.leftfetchjoin(dimsCand:ptr, dims:ptr, dim:ptr ) :bat[:oid,:any] -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] +##it is called after a selection on a non-dimensional column when projecting a dimensional column and is the mbr of the qualifying cells +#command algebra.leftfetchjoin(dimsCand:ptr, dims:ptr, dim:ptr ) :bat[:oid,:any] +#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] +command algebra.leftfetchjoin(cands:bat[:oid,:oid], vals:bat[:oid,:any], dims:ptr ) :bat[:oid,:any] 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] +command algebra.leftfetchjoin(tids:bat[:oid,:oid],vals:bat[:oid,:any],dims:ptr) (:bat[:oid,:any], :ptr) address ALGnonDimensionLeftfetchjoin2; 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 @@ -1457,11 +1457,12 @@ static int q = pushReturn(mb, q, newTmpVariable(mb, newBatType(TYPE_oid, TYPE_oid))); q = pushArgument(mb, q, l); //all the dimensions q = pushArgument(mb, q, uval); //the current dimension - } else if(s->op1->type == st_join && s->op1->op2->type == st_bat && isArray(s->op1->op2->op4.cval->t)) { //seelctio over non-dimensional column of an array +/*NOT NEEDED } else if(s->op1->type == st_join && s->op1->op2->type == st_bat && isArray(s->op1->op2->op4.cval->t)) { //seelctio over non-dimensional column of an array setVarType(mb, getArg(q, 0), TYPE_ptr); setVarUDFtype(mb, getArg(q, 0)); q = pushReturn(mb, q, newTmpVariable(mb, newBatType(TYPE_oid, TYPE_oid))); q = pushArgument(mb, q, l); +*/ } else q = pushArgument(mb, q, l); @@ -1495,12 +1496,12 @@ static int q = pushReturn(mb, q, newTmpVariable(mb, newBatType(TYPE_oid, TYPE_oid))); q = pushArgument(mb, q, l); //all the dimensions q = pushArgument(mb, q, uval); //the current dimension - } else if(s->op1->type == st_join && s->op1->op2->type == st_bat && isArray(s->op1->op2->op4.cval->t)) { //seelctio over non-dimensional column of an array +/*NOT NEEDED } else if(s->op1->type == st_join && s->op1->op2->type == st_bat && isArray(s->op1->op2->op4.cval->t)) { //seelctio over non-dimensional column of an array setVarType(mb, getArg(q, 0), TYPE_ptr); setVarUDFtype(mb, getArg(q, 0)); q = pushReturn(mb, q, newTmpVariable(mb, newBatType(TYPE_oid, TYPE_oid))); q = pushArgument(mb, q, l); - } else +*/ } else q = pushArgument(mb, q, l); if(sub > 0) { //candidates @@ -1545,7 +1546,7 @@ static int } if (q) { s->nr = getDestVar(q); - if(s->op1->type == st_dimension || (s->op1->type == st_join && s->op1->op2->type == st_bat && isArray(s->op1->op2->op4.cval->t))) { + if(s->op1->type == st_dimension /*NOT NEEDED || (s->op1->type == st_join && s->op1->op2->type == st_bat && isArray(s->op1->op2->op4.cval->t))*/) { /* rename second result */ renameVariable(mb, getArg(q, 1), "Y_%d", s->nr); } @@ -1847,6 +1848,10 @@ static int q = newStmt1(mb, algebraRef, "leftfetchjoin"); else q = newStmt2(mb, algebraRef, leftjoinRef); + + if(s->op1->type == st_tid && s->op2->type == st_bat && isArray(s->op2->op4.cval->t)) + q = pushReturn(mb, q, newTmpVariable(mb, TYPE_ptr)); + q = pushArgument(mb, q, l); { /* if the first argument has two variables then it is a sub-select @@ -1873,14 +1878,25 @@ static int snprintf(nme, SMALLBUFSIZ, "Y_%d", r); uval = findVariable(mb, nme); // assert(uval >= 0); - if(uval >= 0) + if(uval >= 0) //{ q = pushArgument(mb, q, uval); + // if(s->op1->type == st_tid) + // q = pushReturn(mb, q, newTmpVariable(mb, TYPE_ptr)); + // } // } } - if (q == NULL) return -1; s->nr = getDestVar(q); + + if(s->op1->type == st_tid && s->op2->type == st_bat && isArray(s->op2->op4.cval->t)) { + /* left fetch join on a non-dimensional column and the tid + * I need to return also the pointer to dims or it will be lost afterwards */ + + /* rename second result */ + renameVariable(mb, getArg(q, 1), "Y_%d", s->nr); + } + return s->nr; } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list