Changeset: 54d0ff58e379 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=54d0ff58e379
Added Files:
        monetdb5/extras/jaql/jaqltests/Tests/in.jaql
        monetdb5/extras/jaql/jaqltests/Tests/in.stable.err
        monetdb5/extras/jaql/jaqltests/Tests/in.stable.out
Modified Files:
        monetdb5/extras/jaql/jaqlgencode.c
        monetdb5/extras/jaql/jaqltests/Tests/All
Branch: Jul2012
Log Message:

filter: first shot at implementing IN-clause

We can now perform <var> IN [list...] queries.


diffs (truncated from 428 to 300 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
@@ -492,17 +492,23 @@ dumpcomp(jc *j, Client cntxt, MalBlkPtr 
 {
        InstrPtr q;
        int a = 0, b = 0, c = 0, d = 0, e = 0, f = 0, g = 0;
+       int ink = 0, inn = 0, ind = 0, ins = 0;
 
        assert(t != NULL);
-       assert(t->tval1->type == j_var || t->tval1->type == j_operation);
        assert(t->tval2->type == j_comp);
-       assert(t->tval3->type == j_var || t->tval3->type == j_operation
-                       || t->tval3->type == j_num || t->tval3->type == j_dbl
-                       || t->tval3->type == j_str || t->tval3->type == j_bool);
+       assert(t->tval2->cval != j_in || (
+                               t->tval3->type == j_json_arr &&
+                               (t->tval1->type == j_var || t->tval1->type == 
j_operation)));
+       assert(t->tval2->cval == j_in || (
+                          (t->tval3->type == j_var || t->tval3->type == 
j_operation
+                               || t->tval3->type == j_num || t->tval3->type == 
j_dbl
+                               || t->tval3->type == j_str || t->tval3->type == 
j_bool) &&
+                          (t->tval1->type == j_var || t->tval1->type == 
j_operation)
+                  ));
 
        if (t->tval1->type == j_operation) {
                a = dumpvariabletransformation(j, cntxt, mb, t->tval1, elems);
-       } else {
+       } else /* if (t->tval1->type == j_var) */ {
                a = dumprefvar(j, mb, t->tval1, elems);
        }
 
@@ -593,6 +599,107 @@ dumpcomp(jc *j, Client cntxt, MalBlkPtr 
                        b = getArg(q, 0);
                        pushInstruction(mb, q);
                        return b;
+               case j_json_arr:
+                       /* we will create 4 BATs, one for kind matches (t, f, 
n),
+                        * and one for num, dbl and str each */
+                       q = newInstruction(mb, ASSIGNsymbol);
+                       setModuleId(q, batRef);
+                       setFunctionId(q, newRef);
+                       q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
+                       q = pushType(mb, q, TYPE_oid);
+                       q = pushType(mb, q, TYPE_bte);
+                       ink = getArg(q, 0);
+                       pushInstruction(mb, q);
+                       q = newInstruction(mb, ASSIGNsymbol);
+                       setModuleId(q, batRef);
+                       setFunctionId(q, newRef);
+                       q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
+                       q = pushType(mb, q, TYPE_oid);
+                       q = pushType(mb, q, TYPE_lng);
+                       inn = getArg(q, 0);
+                       pushInstruction(mb, q);
+                       q = newInstruction(mb, ASSIGNsymbol);
+                       setModuleId(q, batRef);
+                       setFunctionId(q, newRef);
+                       q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
+                       q = pushType(mb, q, TYPE_oid);
+                       q = pushType(mb, q, TYPE_dbl);
+                       ind = getArg(q, 0);
+                       pushInstruction(mb, q);
+                       q = newInstruction(mb, ASSIGNsymbol);
+                       setModuleId(q, batRef);
+                       setFunctionId(q, newRef);
+                       q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
+                       q = pushType(mb, q, TYPE_oid);
+                       q = pushType(mb, q, TYPE_str);
+                       ins = getArg(q, 0);
+                       pushInstruction(mb, q);
+                       if (t->tval3->tval1 != NULL) {
+                               tree *n;
+                               for (n = t->tval3->tval1; n != NULL; n = 
n->next) {
+                                       switch (n->type) {
+                                               case j_num:
+                                                       q = newInstruction(mb, 
ASSIGNsymbol);
+                                                       setModuleId(q, batRef);
+                                                       setFunctionId(q, 
insertRef;);
+                                                       q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                                       q = pushArgument(mb, q, 
inn);
+                                                       q = pushNil(mb, q, 
TYPE_oid);
+                                                       q = pushLng(mb, q, 
n->nval);
+                                                       inn = getArg(q, 0);
+                                                       pushInstruction(mb, q);
+                                                       break;
+                                               case j_dbl:
+                                                       q = newInstruction(mb, 
ASSIGNsymbol);
+                                                       setModuleId(q, batRef);
+                                                       setFunctionId(q, 
insertRef;);
+                                                       q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                                       q = pushArgument(mb, q, 
ind);
+                                                       q = pushNil(mb, q, 
TYPE_oid);
+                                                       q = pushDbl(mb, q, 
n->dval);
+                                                       ind = getArg(q, 0);
+                                                       pushInstruction(mb, q);
+                                                       break;
+                                               case j_str:
+                                                       q = newInstruction(mb, 
ASSIGNsymbol);
+                                                       setModuleId(q, batRef);
+                                                       setFunctionId(q, 
insertRef;);
+                                                       q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                                       q = pushArgument(mb, q, 
ins);
+                                                       q = pushNil(mb, q, 
TYPE_oid);
+                                                       q = pushStr(mb, q, 
n->sval);
+                                                       ins = getArg(q, 0);
+                                                       pushInstruction(mb, q);
+                                                       break;
+                                               case j_bool:
+                                                       q = newInstruction(mb, 
ASSIGNsymbol);
+                                                       setModuleId(q, batRef);
+                                                       setFunctionId(q, 
insertRef;);
+                                                       q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                                       q = pushArgument(mb, q, 
ink);
+                                                       q = pushNil(mb, q, 
TYPE_oid);
+                                                       q = pushBte(mb, q, 
n->nval ? 't' : 'f');
+                                                       ink = getArg(q, 0);
+                                                       pushInstruction(mb, q);
+                                                       break;
+                                               case j_null:
+                                                       q = newInstruction(mb, 
ASSIGNsymbol);
+                                                       setModuleId(q, batRef);
+                                                       setFunctionId(q, 
insertRef;);
+                                                       q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                                       q = pushArgument(mb, q, 
ink);
+                                                       q = pushNil(mb, q, 
TYPE_oid);
+                                                       q = pushBte(mb, q, 'n');
+                                                       ink = getArg(q, 0);
+                                                       pushInstruction(mb, q);
+                                                       break;
+                                               default:
+                                                       assert(0);
+                                       }
+                               }
+                       }
+                       c = 0;
+                       break;
                default:
                        assert(0);
        }
@@ -670,6 +777,166 @@ dumpcomp(jc *j, Client cntxt, MalBlkPtr 
                                g = getArg(q, 0);
                                pushInstruction(mb, q);
                                break;
+                       case j_in:
+                               /* perform joins with ins, inn, ind, ink */
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, batRef);
+                               setFunctionId(q, newRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushType(mb, q, TYPE_oid);
+                               q = pushType(mb, q, TYPE_oid);
+                               g = getArg(q, 0);
+                               pushInstruction(mb, q);
+
+                               /* string */
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, algebraRef);
+                               setFunctionId(q, joinRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, a);
+                               q = pushArgument(mb, q, j->j2);
+                               b = getArg(q, 0);
+                               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, b);
+                               b = getArg(q, 0);
+                               pushInstruction(mb, q);
+
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, algebraRef);
+                               setFunctionId(q, joinRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, ins);
+                               q = pushArgument(mb, q, b);
+                               c = getArg(q, 0);
+                               pushInstruction(mb, q);
+
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, batRef);
+                               setFunctionId(q, insertRef;);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, g);
+                               q = pushArgument(mb, q, c);
+                               g = getArg(q, 0);
+                               pushInstruction(mb, q);
+
+                               /* int */
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, algebraRef);
+                               setFunctionId(q, joinRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, a);
+                               q = pushArgument(mb, q, j->j3);
+                               b = getArg(q, 0);
+                               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, b);
+                               b = getArg(q, 0);
+                               pushInstruction(mb, q);
+
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, algebraRef);
+                               setFunctionId(q, joinRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, inn);
+                               q = pushArgument(mb, q, b);
+                               c = getArg(q, 0);
+                               pushInstruction(mb, q);
+
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, batRef);
+                               setFunctionId(q, insertRef;);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, g);
+                               q = pushArgument(mb, q, c);
+                               g = getArg(q, 0);
+                               pushInstruction(mb, q);
+
+                               /* double */
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, algebraRef);
+                               setFunctionId(q, joinRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, a);
+                               q = pushArgument(mb, q, j->j4);
+                               b = getArg(q, 0);
+                               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, b);
+                               b = getArg(q, 0);
+                               pushInstruction(mb, q);
+
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, algebraRef);
+                               setFunctionId(q, joinRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, ind);
+                               q = pushArgument(mb, q, b);
+                               c = getArg(q, 0);
+                               pushInstruction(mb, q);
+
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, batRef);
+                               setFunctionId(q, insertRef;);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, g);
+                               q = pushArgument(mb, q, c);
+                               g = getArg(q, 0);
+                               pushInstruction(mb, q);
+
+                               /* kind */
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, algebraRef);
+                               setFunctionId(q, joinRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, a);
+                               q = pushArgument(mb, q, j->j1);
+                               b = getArg(q, 0);
+                               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, b);
+                               b = getArg(q, 0);
+                               pushInstruction(mb, q);
+
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, algebraRef);
+                               setFunctionId(q, joinRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, ink);
+                               q = pushArgument(mb, q, b);
+                               c = getArg(q, 0);
+                               pushInstruction(mb, q);
+
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, batRef);
+                               setFunctionId(q, insertRef;);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, g);
+                               q = pushArgument(mb, q, c);
+                               g = getArg(q, 0);
+                               pushInstruction(mb, q);
+
+                               /* get elem ids on the left again */    
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, batRef);
+                               setFunctionId(q, reverseRef;);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to