Skip to content

Commit 6690975

Browse files
committed
Issues-79: fix each partial invoke
In js array may be object with key as index some another fix: - remove generic in string method. replace with toString - applyInner check not null before use in matcher - check ? when arg type is operator by toString.equals (? is char in value) - 2 test for each partial expression
1 parent 78ce14c commit 6690975

3 files changed

Lines changed: 28 additions & 5 deletions

File tree

src/main/java/com/dashjoin/jsonata/Functions.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,13 +225,13 @@ static void string(StringBuilder b, Object arg, boolean prettify, String indent)
225225
b.append('{');
226226
if (prettify)
227227
b.append('\n');
228-
for (Entry<String, Object> e : ((Map<String, Object>) arg).entrySet()) {
228+
for (Entry<Object, Object> e : ((Map<Object, Object>) arg).entrySet()) {
229229
if (prettify) {
230230
b.append(indent);
231231
b.append(" ");
232232
}
233233
b.append('"');
234-
Utils.quote(e.getKey(), b);
234+
Utils.quote(e.getKey().toString(), b);
235235
b.append('"');
236236
b.append(':');
237237
if (prettify)

src/main/java/com/dashjoin/jsonata/Jsonata.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1535,6 +1535,13 @@ static Symbol chainAST() {
15351535
List args = new ArrayList<>(); args.add(lhs); args.add(func); // == [lhs, func]
15361536
result = /* await */ apply(chain, args, null, environment);
15371537
} else {
1538+
if (lhs instanceof List && "partial".equals(expr.rhs.type)) {
1539+
var tempLhs = (List)lhs;
1540+
lhs = new HashMap();
1541+
for (int i = 0; i < tempLhs.size(); i++) {
1542+
((HashMap) lhs).put(i, tempLhs.get(i));
1543+
}
1544+
}
15381545
List args = new ArrayList<>(); args.add(lhs); // == [lhs]
15391546
result = /* await */ apply(func, args, null, environment);
15401547
}
@@ -1755,7 +1762,7 @@ Jsonata getPerThreadInstance() {
17551762
List _res = new ArrayList<>();
17561763
for (String s : (List<String>)validatedArgs) {
17571764
//System.err.println("PAT "+proc+" input "+s);
1758-
if (((Pattern)proc).matcher(s).find()) {
1765+
if (s != null && ((Pattern)proc).matcher(s).find()) {
17591766
//System.err.println("MATCH");
17601767
_res.add(s);
17611768
}
@@ -1821,7 +1828,7 @@ Object evaluateLambda(Symbol expr, Object input, Frame environment) {
18211828
var evaluatedArgs = new ArrayList<>();
18221829
for(var ii = 0; ii < expr.arguments.size(); ii++) {
18231830
var arg = expr.arguments.get(ii);
1824-
if (arg.type.equals("operator") && (arg.value.equals("?"))) {
1831+
if (arg.type.equals("operator") && (arg.value.toString().equals("?"))) {
18251832
evaluatedArgs.add(arg);
18261833
} else {
18271834
evaluatedArgs.add(/* await */ evaluate(arg, input, environment));
@@ -1910,7 +1917,7 @@ Object partialApplyProcedure(Symbol proc, List<Symbol> args) {
19101917
for (var param : proc.arguments) {
19111918
// proc.arguments.forEach(Object (param, index) {
19121919
Object arg = index<args.size() ? args.get(index) : null;
1913-
if ((arg==null) || (arg instanceof Symbol && ("operator".equals(((Symbol)arg).type) && "?".equals(((Symbol)arg).value)))) {
1920+
if ((arg==null) || (arg instanceof Symbol && ("operator".equals(((Symbol)arg).type) && (((Symbol)arg).value.toString().equals("?"))))) {
19141921
unboundArgs.add(param);
19151922
} else {
19161923
env.bind((String)param.value, arg);

src/test/java/com/dashjoin/jsonata/CustomFunctionTest.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,20 @@ public Object call(Object input, @SuppressWarnings("rawtypes") List args) throws
8585
Assertions.assertEquals("T0410", ex.getError());
8686
Assertions.assertEquals("append", ex.getExpected());
8787
}
88+
89+
@Test
90+
public void testEachEmptyArray() {
91+
var expression = Jsonata.jsonata("[] ~> $each(?, function($v) { $v })");
92+
Object evaluate = expression.evaluate("{}");
93+
Assertions.assertNull(evaluate);
94+
}
95+
96+
@Test
97+
public void testEachArrayWithData() {
98+
var expression = Jsonata.jsonata("[123, 321] ~> $each(?, function($v) { $v })");
99+
Object evaluate = expression.evaluate("{}");
100+
Assertions.assertInstanceOf(List.class, evaluate);
101+
List<Integer> expected = List.of(123, 321);
102+
Assertions.assertEquals(expected, evaluate);
103+
}
88104
}

0 commit comments

Comments
 (0)