Changeset: e629e708114e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e629e708114e
Modified Files:
        monetdb5/optimizer/opt_mergetable.c
        monetdb5/optimizer/opt_prelude.c
        monetdb5/optimizer/opt_prelude.h
        monetdb5/optimizer/opt_support.c
        monetdb5/optimizer/opt_support.h
Branch: batcalc-updated
Log Message:

changed mergetable to handle calc ops with more arguments


diffs (153 lines):

diff --git a/monetdb5/optimizer/opt_mergetable.c 
b/monetdb5/optimizer/opt_mergetable.c
--- a/monetdb5/optimizer/opt_mergetable.c
+++ b/monetdb5/optimizer/opt_mergetable.c
@@ -582,6 +582,64 @@ mat_apply3(MalBlkPtr mb, InstrPtr p, mat
 }
 
 static int
+mat_apply4(MalBlkPtr mb, InstrPtr p, matlist_t *ml, int m, int n, int o, int 
e, int mvar, int nvar, int ovar, int evar)
+{
+       int k, l;
+       InstrPtr *r = NULL;
+       r = (InstrPtr*) GDKmalloc(sizeof(InstrPtr)* p->retc);
+       if(!r)
+               return -1;
+       for(k=0; k < p->retc; k++) {
+               if((r[k] = newInstruction(mb, matRef, packRef)) == NULL) {
+                       for(l=0; l < k; l++)
+                               freeInstruction(r[l]);
+                       GDKfree(r);
+                       return -1;
+               }
+               getArg(r[k],0) = getArg(p,k);
+       }
+
+       for(k = 1; k < ml->v[m].mi->argc; k++) {
+               int tpe;
+               InstrPtr q = copyInstruction(p);
+               if(!q) {
+                       GDKfree(r);
+                       return -1;
+               }
+
+               for(l=0; l < p->retc; l++) {
+                       tpe = getArgType(mb,p,l);
+                       getArg(q, l) = newTmpVariable(mb, tpe);
+               }
+               getArg(q, mvar) = getArg(ml->v[m].mi, k);
+               getArg(q, nvar) = getArg(ml->v[n].mi, k);
+               getArg(q, ovar) = getArg(ml->v[o].mi, k);
+               getArg(q, evar) = getArg(ml->v[e].mi, k);
+               pushInstruction(mb, q);
+               for(l=0; l < p->retc; l++) {
+                       if(setPartnr(ml, -1, getArg(q,l), k)) {
+                               for(l=0; l < k; l++)
+                                       freeInstruction(r[l]);
+                               GDKfree(r);
+                               return -1;
+                       }
+                       r[l] = addArgument(mb, r[l], getArg(q, l));
+               }
+       }
+       for(k=0; k < p->retc; k++) {
+               if(mat_add_var(ml, r[k], NULL, getArg(r[k], 0), mat_type(ml->v, 
m),  -1, -1, 1)) {
+                       for(l=0; l < k; l++)
+                               freeInstruction(r[l]);
+                       GDKfree(r);
+                       return -1;
+               }
+               pushInstruction(mb, r[k]);
+       }
+       GDKfree(r);
+       return 0;
+}
+
+static int
 mat_setop(MalBlkPtr mb, InstrPtr p, matlist_t *ml, int m, int n)
 {
        int tpe = getArgType(mb,p, 0), k, j;
@@ -2224,6 +2282,19 @@ OPTmergetableImplementation(Client cntxt
                        continue;
                }
 
+               if (match == 4 && bats == 4 && isMap2Op(p) &&  p->retc == 1 &&
+                  (m=is_a_mat(getArg(p,fm), &ml)) >= 0 &&
+                  (n=is_a_mat(getArg(p,fn), &ml)) >= 0 &&
+                  (o=is_a_mat(getArg(p,fo), &ml)) >= 0 &&
+                  (e=is_a_mat(getArg(p,fe), &ml)) >= 0){
+                       assert(ml.v[m].mi->argc == ml.v[n].mi->argc); 
+                       if(mat_apply4(mb, p, &ml, m, n, o, e, fm, fn, fo, fe)) {
+                               msg = 
createException(MAL,"optimizer.mergetable",SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                               goto cleanup;
+                       }
+                       actions++;
+                       continue;
+               }
 
                if (match == 3 && bats == 3 && (isFragmentGroup(p) || 
isFragmentGroup2(p) || isMapOp(p)) &&  p->retc != 2 &&
                   (m=is_a_mat(getArg(p,fm), &ml)) >= 0 &&
diff --git a/monetdb5/optimizer/opt_prelude.c b/monetdb5/optimizer/opt_prelude.c
--- a/monetdb5/optimizer/opt_prelude.c
+++ b/monetdb5/optimizer/opt_prelude.c
@@ -39,6 +39,7 @@ str alter_typeRef;
 str alter_userRef;
 str alter_viewRef;
 str andRef;
+str orRef;
 str antijoinRef;
 str appendidxRef;
 str appendRef;
@@ -339,6 +340,7 @@ void optimizerInit(void)
        alter_userRef = putName("alter_user");
        alter_viewRef = putName("alter_view");
        andRef = putName("and");
+       orRef = putName("or");
        antijoinRef = putName("antijoin");
        appendidxRef = putName("append_idxbat");
        appendRef = putName("append");
diff --git a/monetdb5/optimizer/opt_prelude.h b/monetdb5/optimizer/opt_prelude.h
--- a/monetdb5/optimizer/opt_prelude.h
+++ b/monetdb5/optimizer/opt_prelude.h
@@ -35,6 +35,7 @@ mal_export  str alter_typeRef;
 mal_export  str alter_userRef;
 mal_export  str alter_viewRef;
 mal_export  str andRef;
+mal_export  str orRef;
 mal_export  str antijoinRef;
 mal_export  str appendidxRef;
 mal_export  str appendRef;
diff --git a/monetdb5/optimizer/opt_support.c b/monetdb5/optimizer/opt_support.c
--- a/monetdb5/optimizer/opt_support.c
+++ b/monetdb5/optimizer/opt_support.c
@@ -505,6 +505,20 @@ inline int isMapOp(InstrPtr p){
                 getModuleId(p) != batcapiRef;
 }
 
+inline int isMap2Op(InstrPtr p){
+       if (isUnsafeFunction(p) || isSealedFunction(p))
+               return 0;
+       return  getModuleId(p) &&
+               ((getModuleId(p) == malRef && getFunctionId(p) == multiplexRef) 
||
+                (getModuleId(p) == malRef && getFunctionId(p) == manifoldRef) 
||
+                (getModuleId(p) == batcalcRef) ||
+                (getModuleId(p) != batcalcRef && getModuleId(p) != batRef && 
strncmp(getModuleId(p), "bat", 3) == 0) ||
+                (getModuleId(p) == mkeyRef)) && !isOrderDepenent(p) &&
+                getModuleId(p) != batrapiRef &&
+                getModuleId(p) != batpyapi3Ref &&
+                getModuleId(p) != batcapiRef;
+}
+
 inline int isLikeOp(InstrPtr p){
        return  (getModuleId(p) == batalgebraRef &&
                (getFunctionId(p) == likeRef || 
diff --git a/monetdb5/optimizer/opt_support.h b/monetdb5/optimizer/opt_support.h
--- a/monetdb5/optimizer/opt_support.h
+++ b/monetdb5/optimizer/opt_support.h
@@ -41,6 +41,7 @@ mal_export int isDelta(InstrPtr q);
 mal_export int isMatJoinOp(InstrPtr q);
 mal_export int isMatLeftJoinOp(InstrPtr q);
 mal_export int isMapOp(InstrPtr q);
+mal_export int isMap2Op(InstrPtr q);
 mal_export int isLikeOp(InstrPtr q);
 mal_export int isTopn(InstrPtr q);
 mal_export int isSlice(InstrPtr q);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to