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

Reply via email to