Changeset: 5a2a341768cb for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5a2a341768cb
Added Files:
        monetdb5/extras/jaql/jaqltests/Tests/unroll.jaql
        monetdb5/extras/jaql/jaqltests/Tests/unroll.stable.err
        monetdb5/extras/jaql/jaqltests/Tests/unroll.stable.out
Modified Files:
        gdk/gdk.h
        gdk/gdk_bat.c
        gdk/gdk_bbp.c
        gdk/gdk_private.h
        monetdb5/extras/jaql/Tests/group02.mal
        monetdb5/extras/jaql/Tests/group02.stable.out
        monetdb5/extras/jaql/jaqlgencode.c
        monetdb5/extras/jaql/jaqltests/Tests/All
        monetdb5/extras/jaql/jaqltests/Tests/shred.jaql.in
        monetdb5/extras/jaql/jaqltests/Tests/shred.stable.err
        monetdb5/extras/jaql/jaqltests/Tests/shred.stable.out
        monetdb5/extras/jaql/parser/jaql.y
        monetdb5/modules/kernel/bat5.c
        monetdb5/optimizer/opt_pipes.c
        sql/backends/monet5/sql.mx
        sql/backends/monet5/sql_gencode.c
        sql/server/rel_bin.c
        sql/server/sql_statement.c
        sql/server/sql_statement.h
        testing/Mtest.py.in
Branch: lodrdf
Log Message:

Merged from default


diffs (truncated from 1661 to 300 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1838,11 +1838,11 @@ typedef struct {
 } BBPrec;
 
 gdk_export bat BBPlimit;
-#define N_BBPINIT      100
+#define N_BBPINIT      1000
 #if SIZEOF_VOID_P == 4
 #define BBPINITLOG     11
 #else
-#define BBPINITLOG     13
+#define BBPINITLOG     14
 #endif
 #define BBPINIT                (1 << BBPINITLOG)
 /* absolute maximum number of BATs is N_BBPINIT * BBPINIT */
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -720,14 +720,14 @@ heapcopy(BAT *bn, char *ext, Heap *dst, 
 }
 
 static void
-heapfree(Heap *src, Heap *dst)
+heapfree(Heap *dst, Heap *src)
 {
-       if (dst->filename == NULL) {
-               dst->filename = src->filename;
-               src->filename = NULL;
+       if (src->filename == NULL) {
+               src->filename = dst->filename;
+               dst->filename = NULL;
        }
-       HEAPfree(src);
-       *src = *dst;
+       HEAPfree(dst);
+       *dst = *src;
 }
 
 static int
@@ -2657,8 +2657,7 @@ BATsetaccess(BAT *b, int newmode)
                storage_t b0, b1, b2 = STORE_MEM, b3 = STORE_MEM;
 
                if (b->batSharecnt && newmode != BAT_READ) {
-
-                       PROPDEBUG THRprintf(GDKout, "#BATsetaccess: %s has %d 
views; deliver a copy.\n", BATgetId(b), b->batSharecnt);
+                       BATDEBUG THRprintf(GDKout, "#BATsetaccess: %s has %d 
views; creating a copy\n", BATgetId(b), b->batSharecnt);
                        b = BATsetaccess(BATcopy(b, b->htype, b->ttype, TRUE), 
newmode);
                        if (b && b->batStamp > 0)
                                b->batStamp = -b->batStamp;     /* prevent MIL 
setaccess */
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -399,6 +399,7 @@ recover_dir(int direxists)
        return GDKmove(BAKDIR, "BBP", "dir", BATDIR, "BBP", "dir");
 }
 
+static int BBPrecover(void);
 static int BBPrecover_subdir(void);
 static int BBPdiskscan(const char *);
 
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -55,7 +55,6 @@ void BBPdump(void);           /* never called: fo
 void BBPexit(void);
 void BBPinit(void);
 bat BBPinsert(BATstore *bs);
-int BBPrecover(void);
 void BBPreleaselref(bat i);
 void BBPtrim(size_t delta);
 void BBPunshare(bat b);
diff --git a/monetdb5/extras/jaql/Tests/group02.mal 
b/monetdb5/extras/jaql/Tests/group02.mal
--- a/monetdb5/extras/jaql/Tests/group02.mal
+++ b/monetdb5/extras/jaql/Tests/group02.mal
@@ -6,11 +6,10 @@
 jaql.x("[]->group into count($);");
 # only works when the groupkey exists for all elements
 jaql.x("[{\"a\": 1}, {\"a\": 2}]->group by d = $.a into count($);");
-#jaql.x("explain [{\"a\": 1}, {\"a\": 2}, {\"b\": 1}]->group by d = $.a into 
count($);");
-# should return 0 for groups with no matching values
-#jaql.x("[{\"a\": 1, \"b\": 5}, {\"a\": 2}]->group by d = $.a into {d, 
\"s\":sum($[*].b)};");
-#jaql.x("[{\"a\": 1}, {\"a\": 2}, {\"b\": 1}]->group by d = $.a into {d, 
\"c\":count($[*].a)};");
-#jaql.x("[{\"a\": 1}, {\"a\": 2}, {\"b\": 1}]->group by d = $.a into {d, 
\"c\":count($[*].b)};");
+jaql.x("[{\"a\": 1}, {\"a\": 2}, {\"b\": 1}]->group by d = $.a into 
count($);");
+jaql.x("[{\"a\": 1, \"b\": 5}, {\"a\": 2}]->group by d = $.a into {d, 
\"s\":sum($[*].b)};");
+jaql.x("[{\"a\": 1}, {\"a\": 2}, {\"b\": 1}]->group by d = $.a into {d, 
\"c\":count($[*].a)};");
+jaql.x("[{\"a\": 1}, {\"a\": 2}, {\"b\": 1}]->group by d = $.a into {d, 
\"c\":count($[*].b)};");
 
 jaql.x("[[],[1,2]] -> transform {\"cnt\": count($)};");
 jaql.x("[[],[1,2]] -> transform {\"sum\": sum($)};");
diff --git a/monetdb5/extras/jaql/Tests/group02.stable.out 
b/monetdb5/extras/jaql/Tests/group02.stable.out
--- a/monetdb5/extras/jaql/Tests/group02.stable.out
+++ b/monetdb5/extras/jaql/Tests/group02.stable.out
@@ -24,17 +24,20 @@ function user.main():void;
     jaql.x("[]->group into count($);");
 # only works when the groupkey exists for all elements 
     jaql.x("[{\"a\": 1}, {\"a\": 2}]->group by d = $.a into count($);");
-#jaql.x("explain [{\"a\": 1}, {\"a\": 2}, {\"b\": 1}]->group by d = $.a into 
count($);"); 
-# should return 0 for groups with no matching values 
-#jaql.x("[{\"a\": 1, \"b\": 5}, {\"a\": 2}]->group by d = $.a into {d, 
\"s\":sum($[*].b)};"); 
-#jaql.x("[{\"a\": 1}, {\"a\": 2}, {\"b\": 1}]->group by d = $.a into {d, 
\"c\":count($[*].a)};"); 
-#jaql.x("[{\"a\": 1}, {\"a\": 2}, {\"b\": 1}]->group by d = $.a into {d, 
\"c\":count($[*].b)};"); 
+    jaql.x("[{\"a\": 1}, {\"a\": 2}, {\"b\": 1}]->group by d = $.a into 
count($);");
+    jaql.x("[{\"a\": 1, \"b\": 5}, {\"a\": 2}]->group by d = $.a into {d, 
\"s\":sum($[*].b)};");
+    jaql.x("[{\"a\": 1}, {\"a\": 2}, {\"b\": 1}]->group by d = $.a into {d, 
\"c\":count($[*].a)};");
+    jaql.x("[{\"a\": 1}, {\"a\": 2}, {\"b\": 1}]->group by d = $.a into {d, 
\"c\":count($[*].b)};");
     jaql.x("[[],[1,2]] -> transform {\"cnt\": count($)};");
     jaql.x("[[],[1,2]] -> transform {\"sum\": sum($)};");
     jaql.x("[[],[1,2]] -> transform {\"avg\": avg($)};");
 end main;
 [ 0 ]
 [ 1, 1 ]
+[ 1, 1 ]
+[ { "d": 1, "s": 5 }, { "d": 2, "s": null } ]
+[ { "d": 1, "c": 1 }, { "d": 2, "c": 1 } ]
+[ { "d": 1, "c": 0 }, { "d": 2, "c": 0 } ]
 [ { "cnt": 0 }, { "cnt": 2 } ]
 [ { "sum": null }, { "sum": 3 } ]
 [ { "avg": null }, { "avg": 1.500000 } ]
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
@@ -5593,10 +5593,13 @@ dumptree(jc *j, Client cntxt, MalBlkPtr 
                                j->startoid = e;
                                MALCOMMENT(mb, "} j_expand");
                                break;
-                       case j_unroll:
+                       case j_unroll: {
+                               int h = 0, i = 0;
+                               tree *w;
+
                                MALCOMMENT(mb, "j_unroll {");
-                               a = dumpwalkvar(mb, j->j1, j->j5, j->startoid);
-                               b = dumprefvar(j, mb, t->tval2, a);
+                               d = dumpwalkvar(mb, j->j1, j->j5, j->startoid);
+                               b = dumprefvar(j, mb, t->tval2, d);
 
                                /* we only want the arrays from here */
                                q = newInstruction(mb, ASSIGNsymbol);
@@ -5605,274 +5608,324 @@ dumptree(jc *j, Client cntxt, MalBlkPtr 
                                q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
                                q = pushArgument(mb, q, j->j1);
                                q = pushArgument(mb, q, b);
-                               b = getArg(q, 0);
+                               a = getArg(q, 0);
                                pushInstruction(mb, q);
                                q = newInstruction(mb, ASSIGNsymbol);
                                setModuleId(q, algebraRef);
                                setFunctionId(q, selectRef);
                                q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, a);
+                               q = pushBte(mb, q, 'a');
+                               a = getArg(q, 0);
+                               pushInstruction(mb, q);
+
+                               /* check out contents of arrays */
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, batRef);
+                               setFunctionId(q, mirrorRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, a);
+                               a = 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, j->j5);
+                               c = getArg(q, 0);
+                               pushInstruction(mb, q);
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, algebraRef);
+                               setFunctionId(q, leftjoinRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, c);
+                               q = pushArgument(mb, q, a);
+                               a = getArg(q, 0);
+                               pushInstruction(mb, q);
+
+                               /* create full mapping per element */
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, algebraRef);
+                               setFunctionId(q, leftjoinRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, a);
                                q = pushArgument(mb, q, b);
-                               q = pushBte(mb, q, 'a');
                                c = getArg(q, 0);
                                pushInstruction(mb, q);
-
-                               /* get parent(s), we only do objects for the 
moment */
-                               q = newInstruction(mb, ASSIGNsymbol);
-                               setModuleId(q, algebraRef);
-                               setFunctionId(q, joinRef);
-                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
-                               q = pushArgument(mb, q, j->j6);
+                               q = newInstruction(mb, ASSIGNsymbol);
+                               setModuleId(q, batRef);
+                               setFunctionId(q, reverseRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
                                q = pushArgument(mb, q, c);
                                c = getArg(q, 0);
                                pushInstruction(mb, q);
+                               /* c = elemid:arraymemberid */
+
                                q = newInstruction(mb, ASSIGNsymbol);
                                setModuleId(q, batRef);
-                               setFunctionId(q, mirrorRef);
-                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               setFunctionId(q, reverseRef);
+                               q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
+                               q = pushArgument(mb, q, a);
+                               a = getArg(q, 0);
+                               pushInstruction(mb, q);
+                               /* a = arrayid:arraymemberid */
+
+                               /* walk backwards up till the root array 
duplicating
+                                * entries */
+                               dumpbatwritable(j, mb, 1);
+                               dumpbatwritable(j, mb, 6);
+                               dumpbatwritable(j, mb, 7);
+                               for (w = t->tval2->tval1; w != NULL; w = 
w->tval1) {
+                                       MALCOMMENT(mb, "| reverse object 
traversal with re-creation");
+
+                                       /* get parents of variable matches */
+                                       q = newInstruction(mb, ASSIGNsymbol);
+                                       setModuleId(q, algebraRef);
+                                       setFunctionId(q, joinRef);
+                                       q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                       q = pushArgument(mb, q, j->j6);
+                                       q = pushArgument(mb, q, b);
+                                       i = getArg(q, 0);
+                                       pushInstruction(mb, q);
+                                       /* retrieve all entries for the parent 
objects */
+                                       q = newInstruction(mb, ASSIGNsymbol);
+                                       setModuleId(q, batRef);
+                                       setFunctionId(q, reverseRef);
+                                       q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                       q = pushArgument(mb, q, j->j6);
+                                       e = getArg(q, 0);
+                                       pushInstruction(mb, q);
+                                       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, i);
+                                       d = getArg(q, 0);
+                                       pushInstruction(mb, q);
+
+                                       /* explode into count that we need 
(array sizes) */
+                                       g = dumpnextid(mb, j->j1);
+                                       q = newInstruction(mb, ASSIGNsymbol);
+                                       setModuleId(q, algebraRef);
+                                       setFunctionId(q, markTRef);
+                                       q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                       q = pushArgument(mb, q, c);
+                                       q = pushArgument(mb, q, g);
+                                       h = 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, h);
+                                       f = 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);
+                                       f = getArg(q, 0);
+                                       pushInstruction(mb, q);
+
+                                       /* insert object names for values from 
arrays */
+                                       q = newInstruction(mb, ASSIGNsymbol);
+                                       setModuleId(q, algebraRef);
+                                       setFunctionId(q, semijoinRef);
+                                       q = pushReturn(mb, q, 
newTmpVariable(mb, TYPE_any));
+                                       q = pushArgument(mb, q, j->j7);
+                                       q = pushArgument(mb, q, b);
+                                       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, a);
+                                       g = 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, g);
+                                       q = pushArgument(mb, q, e);
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to