Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
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
Copy Markdown
Contributor 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);
}
}