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
17 changes: 11 additions & 6 deletions src/main/java/com/dashjoin/jsonata/Jsonata.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.concurrent.Callable;
import java.util.function.BiFunction;
import java.util.function.Function;
Expand Down Expand Up @@ -1821,7 +1822,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") && Objects.equals('?', arg.value)) {
evaluatedArgs.add(arg);
} else {
evaluatedArgs.add(/* await */ evaluate(arg, input, environment));
Expand Down Expand Up @@ -1901,7 +1902,7 @@ Object validateArguments(Object signature, Object args, Object context) {
* @param {Array} args - Arguments
* @returns {{lambda: boolean, input: *, environment: {bind, lookup}, arguments: Array, body: *}} Result of partially applied procedure
*/
Object partialApplyProcedure(Symbol proc, List<Symbol> args) {
Object partialApplyProcedure(Symbol proc, List args) {
// create a closure, bind the supplied parameters and return a Object that takes the remaining (?) parameters
// Note Uli: if no env, bind to default env so the native functions can be found
var env = createFrame(proc.environment!=null ? proc.environment : this.environment);
Expand All @@ -1910,11 +1911,15 @@ 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)))) {
unboundArgs.add(param);
} else {
env.bind((String)param.value, arg);
if (arg instanceof Symbol) {
Symbol sym = (Symbol) arg;
if ("operator".equals(sym.type) && Objects.equals('?', sym.value)) {
unboundArgs.add(param);
index++;
continue;
}
}
env.bind((String)param.value, arg);
index++;
}
var procedure = parser.new Symbol();
Expand Down
20 changes: 20 additions & 0 deletions src/test/java/com/dashjoin/jsonata/CustomFunctionTest.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package com.dashjoin.jsonata;

import java.io.IOException;
import java.nio.charset.Charset;
import java.util.List;
import java.util.Map;

import com.dashjoin.jsonata.json.Json;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
Expand Down Expand Up @@ -85,4 +89,20 @@ public Object call(Object input, @SuppressWarnings("rawtypes") List args) throws
Assertions.assertEquals("T0410", ex.getError());
Assertions.assertEquals("append", ex.getExpected());
}

@Test
public void testMapWithAppend() throws IOException {
Object answer = Json.parseJson("{\"systems\": \"asd\"}");
var expression = Jsonata.jsonata("{'systems': 'asd'}.$map($, $append(?))");
Object evaluate = expression.evaluate(null);
Assertions.assertEquals(answer, evaluate);
}

@Test
public void testMapWithAppend2() {
Object answer = Json.parseJson("{\"systems\": \"asd\"}");
var expression = Jsonata.jsonata("$map($, $append(?))");
Object evaluate = expression.evaluate(answer);
Assertions.assertEquals(answer, evaluate);
}
}