Skip to content

Custom function pipe error #83

@sergeevik

Description

@sergeevik

test in jsonata

describe("custom function pipe", () => {
    // Platform specific
    describe("$add(1,2) ~> $add(?, 3)", function() {
        it("should return 6", async function() {
            function add(a, b) {
                return a + b;
            }

            var expr = jsonata("$add(1,2) ~> $add(?, 3)");
            expr.registerFunction("add", add);
            var result = await expr.evaluate();
            var expected = 6;
            expect(result).to.be.equal(expected);
        });
    });
});

success resturn 6

test in jsonata java

  @Test
  public void testCustomFunctionPipe() {
    var expression = Jsonata.jsonata("$add(1, 2) ~> $add(?, 3)");
    expression.registerFunction("add", new JFunction(new JFunctionCallable() {
      @SuppressWarnings("rawtypes")
      @Override
      public Object call(Object input, List args) throws Throwable {
        return (Integer) args.get(0) + (Integer) args.get(1);
      }
    }, null));
    Assertions.assertEquals(6, expression.evaluate(null));
  }

thrown Exception

Proc not found null

com.dashjoin.jsonata.JException: Attempted to invoke a non-function
	at com.dashjoin.jsonata@0.9.9-local4/com.dashjoin.jsonata.Jsonata.applyInner(Jsonata.java:1782)
	at com.dashjoin.jsonata@0.9.9-local4/com.dashjoin.jsonata.Jsonata.apply(Jsonata.java:1705)
	at com.dashjoin.jsonata@0.9.9-local4/com.dashjoin.jsonata.Jsonata.evaluateApplyExpression(Jsonata.java:1547)
	at com.dashjoin.jsonata@0.9.9-local4/com.dashjoin.jsonata.Jsonata._evaluate(Jsonata.java:203)
	at com.dashjoin.jsonata@0.9.9-local4/com.dashjoin.jsonata.Jsonata.evaluate(Jsonata.java:131)
	at com.dashjoin.jsonata@0.9.9-local4/com.dashjoin.jsonata.Jsonata.evaluate(Jsonata.java:2607)
	at com.dashjoin.jsonata@0.9.9-local4/com.dashjoin.jsonata.Jsonata.evaluate(Jsonata.java:2568)
	at com.dashjoin.jsonata@0.9.9-local4/com.dashjoin.jsonata.CustomFunctionTest.testCustomFunctionPipe(CustomFunctionTest.java:65)

I need to use this call chain for another custom method. I used a simple "add" as an example.
In my case I can't use Fn2 because I need "input" data, but all Fn* interfaces pass only arguments.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions