Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/main/java/com/dashjoin/jsonata/Functions.java
Original file line number Diff line number Diff line change
Expand Up @@ -225,13 +225,13 @@ static void string(StringBuilder b, Object arg, boolean prettify, String indent)
b.append('{');
if (prettify)
b.append('\n');
for (Entry<String, Object> e : ((Map<String, Object>) arg).entrySet()) {
for (Entry<Object, Object> e : ((Map<Object, Object>) arg).entrySet()) {
if (prettify) {
b.append(indent);
b.append(" ");
}
b.append('"');
Utils.quote(e.getKey(), b);
Utils.quote(e.getKey().toString(), b);
b.append('"');
b.append(':');
if (prettify)
Expand Down
13 changes: 10 additions & 3 deletions src/main/java/com/dashjoin/jsonata/Jsonata.java
Original file line number Diff line number Diff line change
Expand Up @@ -1535,6 +1535,13 @@ static Symbol chainAST() {
List args = new ArrayList<>(); args.add(lhs); args.add(func); // == [lhs, func]
result = /* await */ apply(chain, args, null, environment);
} else {
if (lhs instanceof List && "partial".equals(expr.rhs.type)) {
var tempLhs = (List)lhs;
lhs = new HashMap();
for (int i = 0; i < tempLhs.size(); i++) {
((HashMap) lhs).put(i, tempLhs.get(i));
}
Copy link
Author

@sergeevik sergeevik Dec 16, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe better:

var lhsNewMap =  new HashMap();
var lhsOldList = (List)lhs;
for (int i = 0; i < lhsOldList.size(); i++) {
  lhsNewMap.put(i, tempLhs.get(i));
}
lhs = lhsNewMap;

}
List args = new ArrayList<>(); args.add(lhs); // == [lhs]
result = /* await */ apply(func, args, null, environment);
}
Expand Down Expand Up @@ -1755,7 +1762,7 @@ Jsonata getPerThreadInstance() {
List _res = new ArrayList<>();
for (String s : (List<String>)validatedArgs) {
//System.err.println("PAT "+proc+" input "+s);
if (((Pattern)proc).matcher(s).find()) {
if (s != null && ((Pattern)proc).matcher(s).find()) {
//System.err.println("MATCH");
_res.add(s);
}
Expand Down Expand Up @@ -1821,7 +1828,7 @@ Object evaluateLambda(Symbol expr, Object input, Frame environment) {
var evaluatedArgs = new ArrayList<>();
for(var ii = 0; ii < expr.arguments.size(); ii++) {
var arg = expr.arguments.get(ii);
if (arg.type.equals("operator") && (arg.value.equals("?"))) {
if (arg.type.equals("operator") && (arg.value.toString().equals("?"))) {
evaluatedArgs.add(arg);
} else {
evaluatedArgs.add(/* await */ evaluate(arg, input, environment));
Expand Down Expand Up @@ -1910,7 +1917,7 @@ Object partialApplyProcedure(Symbol proc, List<Symbol> args) {
for (var param : proc.arguments) {
// proc.arguments.forEach(Object (param, index) {
Object arg = index<args.size() ? args.get(index) : null;
if ((arg==null) || (arg instanceof Symbol && ("operator".equals(((Symbol)arg).type) && "?".equals(((Symbol)arg).value)))) {
if ((arg==null) || (arg instanceof Symbol && ("operator".equals(((Symbol)arg).type) && (((Symbol)arg).value.toString().equals("?"))))) {
unboundArgs.add(param);
} else {
env.bind((String)param.value, arg);
Expand Down
16 changes: 16 additions & 0 deletions src/test/java/com/dashjoin/jsonata/CustomFunctionTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -85,4 +85,20 @@ public Object call(Object input, @SuppressWarnings("rawtypes") List args) throws
Assertions.assertEquals("T0410", ex.getError());
Assertions.assertEquals("append", ex.getExpected());
}

@Test
public void testEachEmptyArray() {
var expression = Jsonata.jsonata("[] ~> $each(?, function($v) { $v })");
Object evaluate = expression.evaluate("{}");
Assertions.assertNull(evaluate);
}

@Test
public void testEachArrayWithData() {
var expression = Jsonata.jsonata("[123, 321] ~> $each(?, function($v) { $v })");
Object evaluate = expression.evaluate("{}");
Assertions.assertInstanceOf(List.class, evaluate);
List<Integer> expected = List.of(123, 321);
Assertions.assertEquals(expected, evaluate);
}
}