Changeset: 57df81288f30 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=57df81288f30
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
Branch: arrays
Log Message:

fixed the plans for arrays subrangejoin, the actual implementation of the 
subrangejoins is missing


diffs (143 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
@@ -1252,6 +1252,29 @@ str ALGsubjoin2(ptr *dimsResL, ptr *dims
        return ALGsubjoin1(dimsResL, dimsResR, dimL, dimsCandsL, dimR, 
dimsCandsR);
 }
 
+str ALGsubrangejoin2(ptr *dimsResL, ptr *dimsResR, const ptr *dimL, const ptr 
*dimsL, const ptr *dimR1, const ptr *dimR2, const ptr* dimsR, const ptr 
*dimsCandL, const ptr *dimsCandR, const bit *li, const bit *hi, const lng 
*estimate) {
+       (void) *dimsResL;
+       (void) *dimsResR;
+       (void) *dimL;
+       (void) *dimsL;
+       (void) *dimR1;
+       (void) *dimR2;
+       (void) *dimsR;
+       (void) *dimsCandL;
+       (void) *dimsCandR;
+       (void) *li;
+       (void) *hi;
+       (void) *estimate;
+
+       return MAL_SUCCEED;
+}
+
+str ALGsubrangejoin1(ptr *dimsResL, ptr *dimsResR, const ptr *dimL, const ptr 
*dimsL, const ptr *dimR1, const ptr *dimR2, const ptr* dimsR, const bat *sl, 
const bat *sr, const bit *li, const bit *hi, const lng *estimate) {
+       (void) *sl;
+       (void) *sr;
+
+       return ALGsubrangejoin2(dimsResL, dimsResR, dimL, dimsL, dimR1, dimR2, 
dimsR, NULL, NULL, li, hi, estimate);
+}
 
 str ALGnonDimensionQRDecomposition(bat *oidsRes, ptr *dimsRes,  const bat* 
vals, const ptr *dims)
 {
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
@@ -55,6 +55,9 @@ algebra_export str ALGnonDimensionThetas
 algebra_export str ALGsubjoin1(ptr *dimsResL, ptr *dimsResR, const ptr *dimL, 
const ptr *dimsL, const ptr *dimR, const ptr *dimsR);
 algebra_export str ALGsubjoin2(ptr *dimsResL, ptr *dimsResR, const ptr 
*dimsCandsL, const ptr *dimL, const ptr *dimsL, const ptr *dimsCandsR, const 
ptr *dimR, const ptr *dimsR);
 
+algebra_export str ALGsubrangejoin1(ptr *dimsResL, ptr *dimsResR, const ptr 
*dimL, const ptr *dimsL, const ptr *dimR1, const ptr *dimR2, const ptr *dimsR, 
const bat *sl, const bat *sr, const bit *li, const bit *hi, const lng 
*estimate);
+algebra_export str ALGsubrangejoin2(ptr *dimsResL, ptr *dimsResR, const ptr 
*dimL, const ptr *dimsL, const ptr *dimR1, const ptr *dimR2, const ptr *dimsR, 
const ptr *dimsCandL, const ptr *dimsCandR, const bit *li, const bit *hi, const 
lng *estimate);
+
 algebra_export str ALGprojectDimension(bat* result, const ptr *dim, const ptr 
*array);
 algebra_export str ALGprojectNonDimension(bat *result, const bat *vals, const 
ptr *array);
 
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
@@ -90,7 +90,13 @@ address ALGsubjoin1;
 command algebra.subjoin(candDimsl:ptr, diml:ptr, dimsl:ptr, candDimsr:ptr, 
dimr:ptr, dimsr:ptr) (:ptr,:ptr)
 address ALGsubjoin2;
 
+command algebra.subrangejoin(diml:ptr, dimsl:ptr, dimr1:ptr, dimr2:ptr, 
dimsr:ptr, sl:bat[:oid,:oid],sr:bat[:oid,:oid],li:bit,hi:bit,estimate:lng) 
(:ptr,:ptr)
+address ALGsubrangejoin1
+comment "Range join: values in l and r1/r2 match if r1 <[=] l <[=] r2";
 
+command algebra.subrangejoin(diml:ptr, dimsl:ptr, dimr1:ptr, dimr2:ptr, 
dimsr:ptr, candDimsl:ptr, candDimsr:ptr,li:bit,hi:bit,estimate:lng) (:ptr,:ptr)
+address ALGsubrangejoin2
+comment "Range join: values in l and r1/r2 match if r1 <[=] l <[=] r2";
 
 #projects a dimension
 command algebra.projectArray(dim:ptr, dims:ptr) :bat[:oid,:any]
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -1765,8 +1765,11 @@ static stmt *rel2bin_array_join(mvc *sql
                
                        if (!join) 
                                join = s;
-                       else 
+                       else if(join->type == st_join)
                                join->op3 = s;
+                       else if(join->type == st_join2)
+                               join->op4.stval = s;
+                       else return NULL; /* error */
                }
 
        } else {
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
@@ -1781,27 +1781,39 @@ static int
                                setVarUDFtype(mb, getArg(q, 0));
 //                             if(s->type == st_join2)
 //                                     q = pushReturn(mb, q, 
newTmpVariable(mb, newBatType(TYPE_oid, TYPE_oid)));
-                               q = pushArgument(mb, q, l); //all the dimensions
-                               q = pushArgument(mb, q, arraySecondVar); //the 
current dimension
+                               q = pushArgument(mb, q, l); //the dimension
+                               q = pushArgument(mb, q, arraySecondVar); //the 
array
                        } else 
                                q = pushArgument(mb, q, l);
                                        
-                       if(sub > 0) { //candidates
+                       if(s->type != st_join2 && sub > 0) { //candidates
                                q = pushArgument(mb, q, sub);
-
-                               snprintf(nme, SMALLBUFSIZ, "Y_%d", sub);
-                       if((arraySecondVar = findVariable(mb, nme)) >= 0)
-                                       q = pushArgument(mb, q, arraySecondVar);
                        }
                        if (rs) {
                                q = pushArgument(mb, q, rs);
                        } else {
                                q = pushArgument(mb, q, r1);
+                               /* I assume that both are from the same array 
and give only the second one as an argument
+                               snprintf(nme, SMALLBUFSIZ, "Y_%d", r1);
+                       if((arraySecondVar = findVariable(mb, nme)) >= 0)
+                                       q = pushArgument(mb, q, arraySecondVar);
+                               */
                                q = pushArgument(mb, q, r2);
+                               snprintf(nme, SMALLBUFSIZ, "Y_%d", r2);
+                       if((arraySecondVar = findVariable(mb, nme)) >= 0)
+                                       q = pushArgument(mb, q, arraySecondVar);
                        }
                        if (s->type == st_join2) {
-                               q = pushNil(mb, q, TYPE_bat);
-                               q = pushNil(mb, q, TYPE_bat);
+                               if(sub>0) { /* add candidates */
+                                       q = pushArgument(mb, q, sub);
+
+                                       snprintf(nme, SMALLBUFSIZ, "r1_%d", 
sub);
+                               if((arraySecondVar = findVariable(mb, nme)) >= 
0)
+                                               q = pushArgument(mb, q, 
arraySecondVar);
+                               } else {
+                                       q = pushNil(mb, q, TYPE_bat);
+                                       q = pushNil(mb, q, TYPE_bat);
+                               }
                        }
 
                        switch (s->flag & 3) {
diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -1740,7 +1740,7 @@ stack_push_children(sql_stack *stk, stmt
                stack_push_list(stk, s->op4.lval);
                break;
        default:
-               if ((s->type == st_uselect2 || s->type == st_group) && 
s->op4.stval)
+               if ((s->type == st_uselect2 || s->type == st_group || s->type 
== st_join2) && s->op4.stval)
                        stack_push_stmt(stk, s->op4.stval, 1);
                if (s->op3)
                        stack_push_stmt(stk, s->op3, 1);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to