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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list