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

Reply via email to