Changeset: 58f3a64b1ced for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=58f3a64b1ced
Modified Files:
        monetdb5/modules/kernel/arrays.c
        monetdb5/modules/kernel/arrays.h
        monetdb5/modules/kernel/arrays.mal
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_gencode.c
        sql/backends/monet5/sql_statement.c
        sql/backends/monet5/sql_statement.h
Branch: arrays
Log Message:

materialise oids before projecting the values


diffs (truncated from 441 to 300 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
@@ -169,7 +169,18 @@ static gdk_dimension* updateDimCandIdxs(
        return dimCand;
 }
 
-str ALGdimensionSubselect2(ptr *dimsRes, bat *oidsRes, const ptr *dim, const 
ptr* dims, const ptr *dimsCands, const bat *oidsCands,
+str ALGmaterialise(bat* mbrResult, const ptr *dimsCands, const ptr *dims) {
+       gdk_array *dimCands_in = (gdk_array*)*dimsCands;
+       gdk_array *array = (gdk_array*)*dims;
+
+       BAT *mbrBAT = projectCells(dimCands_in, array);
+
+       BBPkeepref(*mbrResult = mbrBAT->batCacheid);
+
+       return MAL_SUCCEED;
+}
+
+str ALGdimensionSubselect2(ptr *dimsRes, const ptr *dim, const ptr* dims, 
const ptr *dimsCands,
                                                        const void *low, const 
void *high, const bit *li, const bit *hi, const bit *anti) {
        gdk_array *array = (gdk_array*)*dims;
        gdk_analytic_dimension *dimension = (gdk_analytic_dimension*)*dim;
@@ -180,12 +191,6 @@ str ALGdimensionSubselect2(ptr *dimsRes,
        int type;
        const void* nil;
 
-       BAT *oidsResBAT = newempty("subselect"); //nothing returned in the oids
-       BBPkeepref(*oidsRes = oidsResBAT->batCacheid);
-
-       /*ingnore oidsCands. When projecting a dimension only the dimsCands are 
of interest */
-       (void)*oidsCands;
-
        if(dimsCands) 
                dimCands_in = (gdk_array*)*dimsCands;
        else //all dimensions are candidates
@@ -283,9 +288,9 @@ str ALGdimensionSubselect2(ptr *dimsRes,
        return MAL_SUCCEED;
 }
 
-str ALGdimensionSubselect1(ptr *dimsRes, bat *oidsRes, const ptr *dim, const 
ptr* dims, 
+str ALGdimensionSubselect1(ptr *dimsRes, const ptr *dim, const ptr* dims, 
                                                        const void *low, const 
void *high, const bit *li, const bit *hi, const bit *anti) {
-       return ALGdimensionSubselect2(dimsRes, oidsRes, dim, dims, NULL, NULL, 
low, high, li, hi, anti);
+       return ALGdimensionSubselect2(dimsRes, dim, dims, NULL, low, high, li, 
hi, anti);
 }
 
 str ALGdimensionSubselect3(ptr *dimsRes, bat *oidsRes, const ptr *array, const 
bat *vals,
@@ -295,7 +300,7 @@ str ALGdimensionSubselect3(ptr *dimsRes,
 }
 
 
-str ALGdimensionThetasubselect2(ptr *dimsRes, bat *oidsRes, const ptr *dim, 
const ptr* dims, const ptr *dimsCands, const bat *oidsCands, const void *val, 
const char **opp) {
+str ALGdimensionThetasubselect2(ptr *dimsRes, const ptr *dim, const ptr* dims, 
const ptr *dimsCands, const void *val, const char **opp) {
        bit li = 0;
        bit hi = 0;
        bit anti = 0;
@@ -307,53 +312,53 @@ str ALGdimensionThetasubselect2(ptr *dim
         /* "=" or "==" */
                li = hi = 1;
                anti = 0;
-        return ALGdimensionSubselect2(dimsRes, oidsRes, dim, dims, dimsCands, 
oidsCands, val, nil, &li, &hi, &anti);
+        return ALGdimensionSubselect2(dimsRes, dim, dims, dimsCands, val, nil, 
&li, &hi, &anti);
     }
     if (op[0] == '!' && op[1] == '=' && op[2] == 0) {
         /* "!=" (equivalent to "<>") */ 
                li = hi = anti = 1;
-        return ALGdimensionSubselect2(dimsRes, oidsRes, dim, dims, dimsCands, 
oidsCands, val, nil, &li, &hi, &anti);
+        return ALGdimensionSubselect2(dimsRes, dim, dims, dimsCands, val, nil, 
&li, &hi, &anti);
     }
     if (op[0] == '<') { 
         if (op[1] == 0) {
             /* "<" */
                        li = hi = anti = 0;
-            return ALGdimensionSubselect2(dimsRes, oidsRes, dim, dims, 
dimsCands, oidsCands, nil, val, &li, &hi, &anti);
+            return ALGdimensionSubselect2(dimsRes, dim, dims, dimsCands, nil, 
val, &li, &hi, &anti);
         }
         if (op[1] == '=' && op[2] == 0) {
             /* "<=" */
                        li = anti = 0;
                        hi = 1;
-            return ALGdimensionSubselect2(dimsRes, oidsRes, dim, dims, 
dimsCands, oidsCands, nil, val, &li, &hi, &anti);
+            return ALGdimensionSubselect2(dimsRes, dim, dims, dimsCands, nil, 
val, &li, &hi, &anti);
         }
         if (op[1] == '>' && op[2] == 0) {
             /* "<>" (equivalent to "!=") */ 
                        li = hi = anti = 1;
-            return ALGdimensionSubselect2(dimsRes, oidsRes, dim, dims, 
dimsCands, oidsCands, val, nil, &li, &hi, &anti);
+            return ALGdimensionSubselect2(dimsRes, dim, dims, dimsCands, val, 
nil, &li, &hi, &anti);
         }
     }
     if (op[0] == '>') { 
         if (op[1] == 0) {
             /* ">" */
                        li = hi = anti = 0;
-            return ALGdimensionSubselect2(dimsRes, oidsRes, dim, dims, 
dimsCands, oidsCands, val, nil, &li, &hi, &anti);
+            return ALGdimensionSubselect2(dimsRes, dim, dims, dimsCands, val, 
nil, &li, &hi, &anti);
         }
         if (op[1] == '=' && op[2] == 0) {
             /* ">=" */
                        li = 1;
                        hi = anti = 0;
-            return ALGdimensionSubselect2(dimsRes, oidsRes, dim, dims, 
dimsCands, oidsCands, val, nil, &li, &hi, &anti);
+            return ALGdimensionSubselect2(dimsRes, dim, dims, dimsCands, val, 
nil, &li, &hi, &anti);
         }
     }
 
     throw(MAL, "algebra.dimensionThetasubselect", "BATdimensionThetasubselect: 
unknown operator.\n");
 }
 
-str ALGdimensionThetasubselect1(ptr *dimsRes, bat *oidsRes, const ptr *dim, 
const ptr* dims, const void *val, const char **op) {
-       return ALGdimensionThetasubselect2(dimsRes, oidsRes, dim, dims, NULL, 
NULL, val, op);
+str ALGdimensionThetasubselect1(ptr *dimsRes, const ptr *dim, const ptr* dims, 
const void *val, const char **op) {
+       return ALGdimensionThetasubselect2(dimsRes, dim, dims, NULL, val, op);
 }
 
-str ALGdimensionLeftfetchjoin1(bat *result, const ptr *dimsCands, const bat 
*oidsCands, const ptr *dim, const ptr *dims) {
+str ALGdimensionLeftfetchjoin1(bat *result, const ptr *dimsCands, const ptr 
*dim, const ptr *dims) {
        gdk_array *array = (gdk_array*)*dims;
        gdk_analytic_dimension *dimension = (gdk_analytic_dimension*)*dim;
        gdk_array *dimCands_in = (gdk_array*)*dimsCands;
@@ -361,9 +366,6 @@ str ALGdimensionLeftfetchjoin1(bat *resu
        BAT *resBAT = NULL;
        BUN resSize = 0;
 
-       /*when projecting a dimension we ignore the oidsCands*/
-       (void)*oidsCands;
-
        if(!dimCands_in) { //empty
                if(!(resBAT = newempty("dimensionLeftfetchjoin")))
                        throw(MAL, "algebra.leftfetchjoin", "Problem allocating 
new BAT");
@@ -556,12 +558,15 @@ str ALGdimensionLeftfetchjoin2(bat *resu
 }
 
 
-str ALGnonDimensionLeftfetchjoin1(bat* result, const ptr *dimsCands, const bat 
*oidsCands, const bat *vals, const ptr *dims) {
+//str ALGnonDimensionLeftfetchjoin1(bat* result, const ptr *dimsCands, const 
bat *oidsCands, const bat *vals, const ptr *dims) {
+str ALGnonDimensionLeftfetchjoin1(bat* result, const bat *mbrOids, const bat 
*vals, const ptr *dims) {
+
        /* projecting a non-dimensional column does not differ from projecting 
any relational column */
-       BAT *mbrCandsBAT = NULL, *oidsCandsBAT = NULL, *valsBAT = NULL, 
*resBAT= NULL;
-       gdk_array *dimCands_in = (gdk_array*)*dimsCands;
-       gdk_array *array = (gdk_array*)*dims;
+       BAT *mbrCandsBAT = NULL/*, *oidsCandsBAT = NULL*/, *valsBAT = NULL, 
*resBAT= NULL;
+//     gdk_array *dimCands_in = (gdk_array*)*dimsCands;
+//     gdk_array *array = (gdk_array*)*dims;
        
+#if 0
        if(!dimCands_in) { //empty
         if(!(resBAT = newempty("nonDimensionLeftfetchjoin1")))
             throw(MAL, "algebra.leftfetchjoin", "Problem allocating new BAT");
@@ -569,19 +574,28 @@ str ALGnonDimensionLeftfetchjoin1(bat* r
 
        return MAL_SUCCEED;
     }
+#endif
+       (void)*dims;
 
-    if ((oidsCandsBAT = BATdescriptor(*oidsCands)) == NULL) {
+//    if ((oidsCandsBAT = BATdescriptor(*oidsCands)) == NULL) {
+//        throw(MAL, "algebra.leftfetchjoin", RUNTIME_OBJECT_MISSING);
+//    }
+
+       if ((valsBAT = BATdescriptor(*vals)) == NULL) {
+//             BBPunfix(oidsCandsBAT->batCacheid);
         throw(MAL, "algebra.leftfetchjoin", RUNTIME_OBJECT_MISSING);
     }
 
-        if ((valsBAT = BATdescriptor(*vals)) == NULL) {
-               BBPunfix(oidsCandsBAT->batCacheid);
+       if ((mbrCandsBAT = BATdescriptor(*mbrOids)) == NULL) {
+//             BBPunfix(oidsCandsBAT->batCacheid);
+               BBPunfix(valsBAT->batCacheid);
         throw(MAL, "algebra.leftfetchjoin", RUNTIME_OBJECT_MISSING);
     }
 
        //create the oids using the candidates
-       mbrCandsBAT = projectCells(dimCands_in, array); 
+//     mbrCandsBAT = projectCells(dimCands_in, array); 
 
+#if 0
        if(BATcount(oidsCandsBAT)) { /*there is mbr and oids. Some values need 
to be set to null */
                BAT *r1p, *r2p, *r3p;
 
@@ -598,6 +612,7 @@ str ALGnonDimensionLeftfetchjoin1(bat* r
                BBPunfix(r2p->batCacheid);
                BBPunfix(r3p->batCacheid);
        } else
+#endif 
                resBAT = BATproject(mbrCandsBAT, valsBAT);
 
 #if 0
@@ -631,7 +646,7 @@ str ALGnonDimensionLeftfetchjoin1(bat* r
 
     BBPunfix(mbrCandsBAT->batCacheid);
        BBPunfix(valsBAT->batCacheid);
-       BBPunfix(oidsCandsBAT->batCacheid);
+//     BBPunfix(oidsCandsBAT->batCacheid);
 
     if (resBAT == NULL)
         throw(MAL, "algebra.leftfetchjoin", GDK_EXCEPTION);
@@ -986,8 +1001,7 @@ str ALGarrayCount(wrd *res, const ptr *a
 
 str ALGprojectDimension(bat* result, const ptr *dim, const ptr *array) {
        const gdk_array *dimsCands = arrayCopy((gdk_array*)*array); 
//candidates exactly the same to the array
-       bat oidsCands;
-       return ALGdimensionLeftfetchjoin1(result, (void*)&dimsCands, 
&oidsCands, dim, array);
+       return ALGdimensionLeftfetchjoin1(result, (void*)&dimsCands, dim, 
array);
 }
 
 str ALGprojectNonDimension(bat *result, const bat *vals, const ptr *array) {
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
@@ -12,21 +12,24 @@
 #define algebra_export extern
 #endif
 
-algebra_export str ALGdimensionLeftfetchjoin1(bat* result, const ptr 
*dimsCands, const bat* oidsCands, const ptr *dim, const ptr *dims) ;
+algebra_export str ALGmaterialise(bat* mbrResult, const ptr *dimsCands, const 
ptr *dims) ;
+
+algebra_export str ALGdimensionLeftfetchjoin1(bat* result, const ptr 
*dimsCands, const ptr *dim, const ptr *dims) ;
 algebra_export str ALGdimensionLeftfetchjoin2(bat* result, const ptr* 
dimsCands, const bat* oidsCands, const ptr *array);
-algebra_export str ALGnonDimensionLeftfetchjoin1(bat* result, const ptr 
*dimsCands, const bat* oidsCands, const bat *vals, const ptr *dims);
+//algebra_export str ALGnonDimensionLeftfetchjoin1(bat* result, const ptr 
*dimsCands, const bat* oidsCands, const bat *vals, const ptr *dims);
+algebra_export str ALGnonDimensionLeftfetchjoin1(bat* result, const bat* 
mbrOids, const bat *vals, const ptr *dims);
 algebra_export str ALGnonDimensionLeftfetchjoin2(bat* result, ptr* dimsRes, 
const ptr *array, const bat *vals, const ptr *dims);
 
-algebra_export str ALGdimensionSubselect2(ptr *dimsRes, bat *oidsRes, const 
ptr *dim, const ptr* dims, const ptr *dimsCands, const bat* oidsCands,
+algebra_export str ALGdimensionSubselect2(ptr *dimsRes, const ptr *dim, const 
ptr* dims, const ptr *dimsCands,
                             const void *low, const void *high, const bit *li, 
const bit *hi, const bit *anti);
-algebra_export str ALGdimensionSubselect1(ptr *dimsRes, bat *oidsRes, const 
ptr *dim, const ptr* dims, 
+algebra_export str ALGdimensionSubselect1(ptr *dimsRes, const ptr *dim, const 
ptr* dims, 
                             const void *low, const void *high, const bit *li, 
const bit *hi, const bit *anti);
 algebra_export str ALGdimensionSubselect3(ptr *dimsRes, bat *oidsResi, const 
ptr *array, const bat *vals,
                                                        const void *low, const 
void *high, const bit *li, const bit *hi, const bit *anti);
 
-algebra_export str ALGdimensionThetasubselect2(ptr *dimsRes, bat *oidsRes, 
const ptr *dim, const ptr* dims, const ptr *dimsCand, const bat *oidsCands,
+algebra_export str ALGdimensionThetasubselect2(ptr *dimsRes, const ptr *dim, 
const ptr* dims, const ptr *dimsCand,
                                                                                
        const void *val, const char **op);
-algebra_export str ALGdimensionThetasubselect1(ptr *dimsRes, bat *oidsRes, 
const ptr *dim, const ptr* dims, 
+algebra_export str ALGdimensionThetasubselect1(ptr *dimsRes, const ptr *dim, 
const ptr* dims, 
                                                                                
        const void *val, const char **op);
 
 algebra_export str ALGnonDimensionSubselect1(ptr *dimsRes, bat *oidsRes, const 
bat *values, const ptr *dims, 
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,13 +1,21 @@
+#it creates the oids out of the qualifying indices of the dimensions (the mbr)
+command algebra.materialise(dimsCands:ptr, dims:ptr) :bat[:oid,:oid]
+address ALGmaterialise;
+
+
 #It gets the candidates and projects the dimensions
 #With project cells: command algebra.leftfetchjoin(cands:bat[:oid,:oid], 
dim:ptr, dims:ptr ) :bat[:oid,:any]
-command algebra.leftfetchjoin(dimsCands:ptr, oidsCands:bat[:oid,:oid], 
dim:ptr, dims:ptr ) :bat[:oid,:any]
+#command algebra.leftfetchjoin(dimsCands:ptr, oidsCands:bat[:oid,:oid], 
dim:ptr, dims:ptr ) :bat[:oid,:any]
+#address ALGdimensionLeftfetchjoin1;
+command algebra.leftfetchjoin(dimsCands:ptr, dim:ptr, dims:ptr ) 
:bat[:oid,:any]
 address ALGdimensionLeftfetchjoin1;
 #it is called in updates. It projects all cells 
 command algebra.leftfetchjoin(dimsCands:ptr, oidsCands:bat[:oid,:oid], 
array:ptr) :bat[:oid,:oid]
 address ALGdimensionLeftfetchjoin2;
 #it gets the candidates and projects a non-dimensional column
 #with project cells: command algebra.leftfetchjoin(cands:bat[:oid,:oid], 
vals:bat[:oid,:any], dims:ptr ) :bat[:oid,:any]
-command algebra.leftfetchjoin(candDims:ptr, candBAT:bat[:oid,:oid], 
vals:bat[:oid,:any], dims:ptr ) :bat[:oid,:any]
+#command algebra.leftfetchjoin(candDims:ptr, candBAT:bat[:oid,:oid], 
vals:bat[:oid,:any], dims:ptr ) :bat[:oid,:any]
+command algebra.leftfetchjoin(mbrBAT: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(array:ptr,vals:bat[:oid,:any],dims:ptr) 
(:bat[:oid,:any], :ptr)
@@ -17,15 +25,27 @@ address ALGnonDimensionLeftfetchjoin2;
 #the first result is the mbr and the second is the oids that satisfy the 
conditiont
 #it is always null but it is used to avoid having to check whether the 
selection
 #is on a dimension or a non-dimension when creating the MAL plan
-command algebra.subselect(dim:ptr, dims:ptr, low:any, high:any, li:bit, 
hi:bit, anti:bit) (:ptr, :bat[:oid,:oid])
+#command algebra.subselect(dim:ptr, dims:ptr, low:any, high:any, li:bit, 
hi:bit, anti:bit) (:ptr, :bat[:oid,:oid])
+#address ALGdimensionSubselect1;
+#command algebra.thetasubselect(dim:ptr, dims:ptr, val:any, op:str) (:ptr, 
:bat[:oid,:oid])
+#address ALGdimensionThetasubselect1;
+#
+#A selection over a dimension always results in a new array with updated 
dimension
+command algebra.subselect(dim:ptr, dims:ptr, low:any, high:any, li:bit, 
hi:bit, anti:bit) :ptr
 address ALGdimensionSubselect1;
-command algebra.thetasubselect(dim:ptr, dims:ptr, val:any, op:str) (:ptr, 
:bat[:oid,:oid])
+command algebra.thetasubselect(dim:ptr, dims:ptr, val:any, op:str) :ptr
 address ALGdimensionThetasubselect1;
 #the candBAT will be null when the candidates come from selection over 
dimensional column
 #and non-zero when coming from selection over non-dimensional column
-command algebra.subselect(dim:ptr, dims:ptr, candDims:ptr, 
candBAT:bat[:oid,:oid], low:any, high:any, li:bit, hi:bit, anti:bit) (:ptr, 
:bat[:oid,:oid])
+#command algebra.subselect(dim:ptr, dims:ptr, candDims:ptr, 
candBAT:bat[:oid,:oid], low:any, high:any, li:bit, hi:bit, anti:bit) (:ptr, 
:bat[:oid,:oid])
+#address ALGdimensionSubselect2;
+#command algebra.thetasubselect(dim:ptr, dims:ptr, candDims:ptr, 
candBAT:bat[:oid,:oid], val:any, op:str) (:ptr, :bat[:oid,:oid])
+#address ALGdimensionThetasubselect2;
+#
+#The candidates is an array with some other dimension already updated
+command algebra.subselect(dim:ptr, dims:ptr, candDims:ptr, low:any, high:any, 
li:bit, hi:bit, anti:bit) :ptr
 address ALGdimensionSubselect2;
-command algebra.thetasubselect(dim:ptr, dims:ptr, candDims:ptr, 
candBAT:bat[:oid,:oid], val:any, op:str) (:ptr, :bat[:oid,:oid])
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to