agrestio / agrest

Server-side Java REST Framework for easy access to data graphs from various backends
https://agrest.io
Apache License 2.0
80 stars 34 forks source link

org.apache.cayenne.exp.ExpressionException: [v.4.2 May 16 2023 08:31:12] In: invalid parent - Equal #646

Closed andrus closed 1 year ago

andrus commented 1 year ago

Originally reported here: https://github.com/bootique/bootique-agrest/issues/86

Strange behavior of agrest-cayenne expressions:

        AgRequestBuilder builder = AgJaxrs.request(config)
                .addIncludes(includes)
                .andExp(Exp.withPositionalParams("seasonId = $seasonId", seasonId))
                .andExp(Exp.keyValue("playerId", "in", players.value()))
                .limit(Optional.ofNullable(limit).orElse(default_limit));

generates this sql in org.apache.cayenne.exp.parser.ConditionNode.jjtSetParent(ConditionNode.java:47) (seasonId = 20212022 = playerId in (10001, 10000))

[05/Jul/2023:12:34:49,670] bootique-http-57 WARN L01q-7M-80000000 ? i.a.c.s.CayenneRuntimeExceptionMapper: Cayenne exception
org.apache.cayenne.exp.ExpressionException: [v.4.2 May 16 2023 08:31:12] In: invalid parent - Equal
    at org.apache.cayenne.exp.parser.ConditionNode.jjtSetParent(ConditionNode.java:47)
    at org.apache.cayenne.exp.parser.SimpleNode.setOperand(SimpleNode.java:329)
    at io.agrest.cayenne.exp.CayenneExpressionVisitor.addToParent(CayenneExpressionVisitor.java:331)
    at io.agrest.cayenne.exp.CayenneExpressionVisitor.process(CayenneExpressionVisitor.java:316)
    at io.agrest.cayenne.exp.CayenneExpressionVisitor.visit(CayenneExpressionVisitor.java:103)
    at io.agrest.cayenne.exp.CayenneExpressionVisitor.visit(CayenneExpressionVisitor.java:14)
    at io.agrest.exp.parser.ExpIn.jjtAccept(ExpIn.java:20)
    at io.agrest.cayenne.exp.CayenneExpressionVisitor.process(CayenneExpressionVisitor.java:311)
    at io.agrest.cayenne.exp.CayenneExpressionVisitor.visit(CayenneExpressionVisitor.java:43)
    at io.agrest.cayenne.exp.CayenneExpressionVisitor.visit(CayenneExpressionVisitor.java:14)
    at io.agrest.exp.parser.ExpAnd.jjtAccept(ExpAnd.java:21)
    at io.agrest.exp.parser.Node.accept(Node.java:44)
    at io.agrest.cayenne.exp.CayenneExpParser.parse(CayenneExpParser.java:18)
    at io.agrest.cayenne.processor.CayenneQueryAssembler.createBaseQuery(CayenneQueryAssembler.java:307)
    at io.agrest.cayenne.processor.CayenneQueryAssembler.createRootQuery(CayenneQueryAssembler.java:68)
    at io.agrest.cayenne.processor.select.ViaQueryResolver.doAssembleQuery(ViaQueryResolver.java:30)
    at io.agrest.resolver.BaseRootDataResolver.assembleQuery(BaseRootDataResolver.java:18)
    at io.agrest.runtime.processor.select.stage.SelectAssembleQueryStage.doExecute(SelectAssembleQueryStage.java:22)
    at io.agrest.runtime.processor.select.stage.SelectAssembleQueryStage.execute(SelectAssembleQueryStage.java:14)
    at io.agrest.runtime.processor.select.stage.SelectAssembleQueryStage.execute(SelectAssembleQueryStage.java:10)
    at io.agrest.processor.Processor.lambda$andThen$0(Processor.java:20)
    at io.agrest.processor.Processor.lambda$andThen$0(Processor.java:18)
    at io.agrest.processor.Processor.lambda$andThen$0(Processor.java:18)
    at io.agrest.processor.Processor.lambda$andThen$0(Processor.java:18)
    at io.agrest.processor.ExceptionMappingProcessorDecorator.execute(ExceptionMappingProcessorDecorator.java:21)
    at io.agrest.runtime.DefaultSelectBuilder.get(DefaultSelectBuilder.java:147)
andrus commented 1 year ago

This should be fixed per #628 . Test case: CayenneExpParserTest.parseComposite_DifferentOrder()