Changeset: 0e4e2663fc0f for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0e4e2663fc0f
Modified Files:
        monetdb5/extras/jaql/jaqlgencode.c
Branch: Jul2012
Log Message:

join: properly preserve inputs

when both inputs are preserved, two subsequent outerjoins would remove
previously preserved values, so calculate a kdiff instead, and insert
the missing values afterwards

make sure the order is as in the original input


diffs (117 lines):

diff --git a/monetdb5/extras/jaql/jaqlgencode.c 
b/monetdb5/extras/jaql/jaqlgencode.c
--- a/monetdb5/extras/jaql/jaqlgencode.c
+++ b/monetdb5/extras/jaql/jaqlgencode.c
@@ -1581,7 +1581,7 @@ static void
 dumppredjoin(jc *j, MalBlkPtr mb, json_var *js, tree *t)
 {
        InstrPtr q;
-       int a = 0, b = 0, c = 0, d = 0, l = 0, r = 0;
+       int a = 0, b = 0, c = 0, d = 0, e = 0, l = 0, r = 0;
        tree *pred;
        jc tj;
        json_var *vars, *ljv, *rjv;
@@ -1807,7 +1807,7 @@ dumppredjoin(jc *j, MalBlkPtr mb, json_v
                        setFunctionId(q, mirrorRef);
                        q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
                        q = pushArgument(mb, q, d);
-                       l = getArg(q, 0);
+                       e = l = getArg(q, 0);
                        pushInstruction(mb, q);
                        q = newInstruction(mb, ASSIGNsymbol);
                        setModuleId(q, algebraRef);
@@ -1815,8 +1815,31 @@ dumppredjoin(jc *j, MalBlkPtr mb, json_v
                        q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
                        q = pushArgument(mb, q, l);
                        q = pushArgument(mb, q, a);
-                       a = getArg(q, 0);
+                       l = getArg(q, 0);
                        pushInstruction(mb, q);
+                       if (rjv->preserve == 1) {
+                               /* build diff, so we can append this to the 
outerjoin on
+                                * ljv done below */
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, algebraRef);
+                               setFunctionId(q, putName("kdifference", 11));
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, l);
+                               q = pushArgument(mb, q, a);
+                               l = getArg(q, 0);
+                               pushInstruction(mb, q);
+                               /* reorder to original input order */
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, algebraRef);
+                               setFunctionId(q, leftjoinRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, e);
+                               q = pushArgument(mb, q, l);
+                               l = getArg(q, 0);
+                               pushInstruction(mb, q);
+                       } else {
+                               a = l;
+                       }
                }
                if (rjv->preserve == 1) {
                        q = newInstruction(mb, ASSIGNsymbol);
@@ -1828,23 +1851,40 @@ dumppredjoin(jc *j, MalBlkPtr mb, json_v
                        pushInstruction(mb, q);
                        q = newInstruction(mb, ASSIGNsymbol);
                        setModuleId(q, batRef);
+                       setFunctionId(q, reverseRef);
+                       q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
+                       q = pushArgument(mb, q, a);
+                       e = a = getArg(q, 0);
+                       pushInstruction(mb, q);
+                       q = newInstruction(mb, ASSIGNsymbol);
+                       setModuleId(q, algebraRef);
+                       setFunctionId(q, putName("kdifference", 11));
+                       q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
+                       q = pushArgument(mb, q, r);
+                       q = pushArgument(mb, q, a);
+                       a = getArg(q, 0);
+                       pushInstruction(mb, q);
+                       /* reorder to original input order */
+                       q = newInstruction(mb, ASSIGNsymbol);
+                       setModuleId(q, batRef);
                        setFunctionId(q, mirrorRef);
                        q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
                        q = pushArgument(mb, q, r);
                        r = getArg(q, 0);
                        pushInstruction(mb, q);
                        q = newInstruction(mb, ASSIGNsymbol);
-                       setModuleId(q, batRef);
-                       setFunctionId(q, reverseRef);
+                       setModuleId(q, algebraRef);
+                       setFunctionId(q, leftjoinRef);
                        q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
+                       q = pushArgument(mb, q, r);
                        q = pushArgument(mb, q, a);
                        a = getArg(q, 0);
                        pushInstruction(mb, q);
                        q = newInstruction(mb, ASSIGNsymbol);
-                       setModuleId(q, algebraRef);
-                       setFunctionId(q, putName("outerjoin", 9));
+                       setModuleId(q, batRef);
+                       setFunctionId(q, insertRef);
                        q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
-                       q = pushArgument(mb, q, r);
+                       q = pushArgument(mb, q, e);
                        q = pushArgument(mb, q, a);
                        a = getArg(q, 0);
                        pushInstruction(mb, q);
@@ -1855,6 +1895,16 @@ dumppredjoin(jc *j, MalBlkPtr mb, json_v
                        q = pushArgument(mb, q, a);
                        a = getArg(q, 0);
                        pushInstruction(mb, q);
+                       if (ljv->preserve == 1) {
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, batRef);
+                               setFunctionId(q, insertRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, a);
+                               q = pushArgument(mb, q, l);
+                               a = getArg(q, 0);
+                               pushInstruction(mb, q);
+                       }
                }
 
                q = newInstruction(mb, ASSIGNsymbol);
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to