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

group: perform grouping in arrays

One step towards JAQL group implementation.  Group input into arrays of
groups that match the grouping condition.


diffs (165 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
@@ -5076,6 +5076,8 @@ dumptree(jc *j, Client cntxt, MalBlkPtr 
                                continue;
                        }
                        case j_group: {
+                               int lv[] = {j2, j3, j4, -1};
+                               int *lp = lv;
                                tree *w;
                                if (j1 != 0) { /* group from single input, 
previous pipe component */
                                        assert(t->tval1 == NULL ||
@@ -5088,8 +5090,151 @@ dumptree(jc *j, Client cntxt, MalBlkPtr 
                                                t->tval1->sval = GDKstrdup("$");
                                                continue;
                                        }
+                                       /* recall:
+                                        *   sval = varname of group key
+                                        *   tval1 = source input (if co-group)
+                                        *   tval2 = var from source to group on
+                                        *   tval3 = name of result (default $) 
(only into)
+                                        */
                                        a = dumpwalkvar(mb, j1, j5);
-                                       b = dumprefvar(mb, t->tval2, a, &j1, 
&j5, &j6, &j7);
+                                       b = dumprefvar(mb, w->tval2, a, &j1, 
&j5, &j6, &j7);
+                                       /* b should point to all "groups" now */
+
+                                       for (; *lp != -1; lp++) {
+                                               q = newInstruction(mb, 
ASSIGNsymbol);
+                                               setModuleId(q, algebraRef);
+                                               setFunctionId(q, semijoinRef);
+                                               q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                               q = pushArgument(mb, q, *lp);
+                                               q = pushArgument(mb, q, b);
+                                               d = getArg(q, 0);
+                                               pushInstruction(mb, q);
+                                               q = newInstruction(mb, 
ASSIGNsymbol);
+                                               setModuleId(q, algebraRef);
+                                               setFunctionId(q, tuniqueRef);
+                                               q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                               q = pushArgument(mb, q, d);
+                                               e = getArg(q, 0);
+                                               pushInstruction(mb, q);
+                                               f = dumpnextid(mb, j1);
+                                               q = newInstruction(mb, 
ASSIGNsymbol);
+                                               setModuleId(q, algebraRef);
+                                               setFunctionId(q, markHRef);
+                                               q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                               q = pushArgument(mb, q, e);
+                                               q = pushArgument(mb, q, f);
+                                               f = e = 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, e);
+                                               e = 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, d);
+                                               q = pushArgument(mb, q, e);
+                                               e = getArg(q, 0);
+                                               pushInstruction(mb, q);
+                                               /* e = kindid:grouparrayid */
+
+                                               q = newInstruction(mb, 
ASSIGNsymbol);
+                                               setModuleId(q, batRef);
+                                               setFunctionId(q, reverseRef);
+                                               q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                               q = pushArgument(mb, q, b);
+                                               d = 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, d);
+                                               q = pushArgument(mb, q, e);
+                                               e = 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, e);
+                                               e = getArg(q, 0);
+                                               pushInstruction(mb, q);
+                                               /* e = grouparrayid:elementid */
+
+                                               q = newInstruction(mb, 
ASSIGNsymbol);
+                                               setModuleId(q, algebraRef);
+                                               setFunctionId(q, projectRef);
+                                               q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                               q = pushOid(mb, q, (oid)0);
+                                               q = pushArgument(mb, q, e);
+                                               d = getArg(q, 0);
+                                               pushInstruction(mb, q);
+                                               q = newInstruction(mb, 
ASSIGNsymbol);
+                                               setModuleId(q, algebraRef);
+                                               setFunctionId(q, 
putName("sdifference", 11));
+                                               q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                               q = pushArgument(mb, q, j5);
+                                               q = pushArgument(mb, q, d);
+                                               j5 = 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, j5);
+                                               q = pushArgument(mb, q, e);
+                                               j5 = 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, f);
+                                               e = getArg(q, 0);
+                                               pushInstruction(mb, q);
+                                               q = newInstruction(mb, 
ASSIGNsymbol);
+                                               setModuleId(q, algebraRef);
+                                               setFunctionId(q, projectRef);
+                                               q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                               q = pushOid(mb, q, (oid)0);
+                                               q = pushArgument(mb, q, e);
+                                               e = 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, j5);
+                                               q = pushArgument(mb, q, e);
+                                               j5 = getArg(q, 0);
+                                               pushInstruction(mb, q);
+
+                                               q = newInstruction(mb, 
ASSIGNsymbol);
+                                               setModuleId(q, algebraRef);
+                                               setFunctionId(q, projectRef);
+                                               q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                               q = pushArgument(mb, q, f);
+                                               q = pushBte(mb, q, 'a');
+                                               e = getArg(q, 0);
+                                               pushInstruction(mb, q);
+                                               q = newInstruction(mb, 
ASSIGNsymbol);
+                                               setModuleId(q, algebraRef);
+                                               setFunctionId(q, kunionRef);
+                                               q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                               q = pushArgument(mb, q, j1);
+                                               q = pushArgument(mb, q, e);
+                                               j1 = getArg(q, 0);
+                                               pushInstruction(mb, q);
+                                       }
+                               } else {
+                                       /* co-group */
                                }
                        } break;
                        case j_sort: {
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to