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