Changeset: 2fab4bac05e0 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2fab4bac05e0
Modified Files:
        monetdb5/extras/jaql/Tests/plan01.mal
        monetdb5/extras/jaql/Tests/plan01.stable.out
        monetdb5/extras/jaql/jaql.c
        monetdb5/extras/jaql/parser/jaql.y
Branch: jacqueline
Log Message:

jaql: add parsing support for matching all pairs from an object

Support the var.* construct, which expands into all found pairs from the
object dereferenced.  This only adds parsing support (and printing again
from the parse tree).


diffs (116 lines):

diff --git a/monetdb5/extras/jaql/Tests/plan01.mal 
b/monetdb5/extras/jaql/Tests/plan01.mal
--- a/monetdb5/extras/jaql/Tests/plan01.mal
+++ b/monetdb5/extras/jaql/Tests/plan01.mal
@@ -1,3 +1,7 @@
 jaql.x("plan a -> transform { \"a\":$.j };");
 jaql.x("plan a -> transform { \"a\":$.j[1] };");
 jaql.x("plan a -> transform { \"a\":$.j[*].k };");
+
+jaql.x("plan a -> transform { \"a\":$.* };");
+jaql.x("plan a -> transform { $.* };");
+jaql.x("plan a -> transform { $.*.foo };");
diff --git a/monetdb5/extras/jaql/Tests/plan01.stable.out 
b/monetdb5/extras/jaql/Tests/plan01.stable.out
--- a/monetdb5/extras/jaql/Tests/plan01.stable.out
+++ b/monetdb5/extras/jaql/Tests/plan01.stable.out
@@ -20,11 +20,17 @@ function user.main():void;
     jaql.x("plan a -> transform { \"a\":$.j };");
     jaql.x("plan a -> transform { \"a\":$.j[1] };");
     jaql.x("plan a -> transform { \"a\":$.j[*].k };");
+    jaql.x("plan a -> transform { \"a\":$.* };");
+    jaql.x("plan a -> transform { $.* };");
+    jaql.x("plan a -> transform { $.*.foo };");
 end main;
 a as $ -> transform: { "a": $.j } 
 a as $ -> transform: { "a": $.j[1] } 
 !transform: cannot perform array expansion in a pair value (needs to be single 
value)
 
+a as $ -> transform: { "a": $.* } 
+a as $ -> transform: { <to be deduced from expansion> $.* } 
+a as $ -> transform: { "foo": $.*.foo } 
 
 # 16:07:49 >  
 # 16:07:49 >  "Done."
diff --git a/monetdb5/extras/jaql/jaql.c b/monetdb5/extras/jaql/jaql.c
--- a/monetdb5/extras/jaql/jaql.c
+++ b/monetdb5/extras/jaql/jaql.c
@@ -667,7 +667,8 @@ make_pair(char *name, tree *val)
                                return res;
                        }
                }
-               name = GDKstrdup(w->sval);
+               if (w->sval != NULL)
+                       name = GDKstrdup(w->sval);
        }
 
        for (w = val; w->tval1 != NULL; w = w->tval1) {
@@ -677,7 +678,8 @@ make_pair(char *name, tree *val)
                        res->sval = GDKstrdup("transform: cannot perform array 
expansion "
                                        "in a pair value (needs to be single 
value)");
                        freetree(val);
-                       GDKfree(name);
+                       if (name != NULL)
+                               GDKfree(name);
                        return res;
                }
        }
@@ -973,11 +975,20 @@ printtree(tree *t, int level, char op)
                                break;
                        case j_pair:
                                if (op) {
-                                       printf("j_pair( \"%s\", ", t->sval);
+                                       printf("j_pair( ");
+                                       if (t->sval != NULL) {
+                                               printf("\"%s\", ", t->sval);
+                                       } else {
+                                               printf("<deduced_name>, ");
+                                       }
                                        printtree(t->tval1, level + step, op);
                                        printf(") ");
                                } else {
-                                       printf("\"%s\": ", t->sval);
+                                       if (t->sval == NULL) {
+                                               printf("<to be deduced from 
expansion> ");
+                                       } else {
+                                               printf("\"%s\": ", t->sval);
+                                       }
                                        printtree(t->tval1, level + step, op);
                                        if (t->next != NULL)
                                                printf(", ");
@@ -1229,12 +1240,13 @@ printtree(tree *t, int level, char op)
                        case j_var:
                                if (op) {
                                        printf("j_var( %s%s ",
-                                                       t->sval, t->tval1 != 
NULL ? "." : "");
+                                                       t->sval == NULL ? "*" : 
t->sval,
+                                                       t->tval1 != NULL ? "." 
: "");
                                        if (t->tval1 != NULL)
                                                printtree(t->tval1, level + 
step, op);
                                        printf(") ");
                                } else {
-                                       printf("%s", t->sval);
+                                       printf("%s", t->sval == NULL ? "*" : 
t->sval);
                                        printtree(t->tval2, level + step, op);
                                        printf("%c", t->tval1 != NULL ? '.' : ' 
');
                                        printtree(t->tval1, level + step, op);
diff --git a/monetdb5/extras/jaql/parser/jaql.y 
b/monetdb5/extras/jaql/parser/jaql.y
--- a/monetdb5/extras/jaql/parser/jaql.y
+++ b/monetdb5/extras/jaql/parser/jaql.y
@@ -192,6 +192,7 @@ predicate: opt_not variable
                 ;
 
 variable: ident opt_arr_ind     {$$ = make_varname($1, $2);}
+               | variable _DOT '*'     {$$ = append_varname($1, NULL, NULL);}
                | variable _DOT _IDENT opt_arr_ind
                                        {$$ = append_varname($1, $3, $4);}
                ;
@@ -201,10 +202,6 @@ opt_arr_ind: /* empty */        {$$ = NU
                   | '[' _NUMBER ']'    {$$ = make_array_index($2, 0);}
                   ;
 
-/*
-varx: variable _DOT '*';
-       */
-
 and_or: _AND  {$$ = make_comp(j_and);}
          | _OR   {$$ = make_comp(j_or);}
          ;
_______________________________________________
Checkin-list mailing list
Checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to