Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
andrus opened this issue Jul 31, 2023 · 1 comment
Labels
Milestone

Comments

@andrus
Copy link
Contributor

andrus commented Jul 31, 2023

Originally reported here: bootique/bootique-agrest#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))

  • at the same time when I change this code in this way I get correct result
        AgRequestBuilder builder = AgJaxrs.request(config)
                .addIncludes(includes)
                .andExp(Exp.keyValue("playerId", "in", players.value()))
                .andExp(Exp.withPositionalParams("seasonId = $seasonId", seasonId))
                .limit(Optional.ofNullable(limit).orElse(default_limit));  

(playerId in (10000, 10001)) and seasonId = $seasonId

  • at the last thing this code
        AgRequestBuilder builder = AgJaxrs.request(config)
                .addIncludes(includes)
                .andExp(Exp.withPositionalParams("seasonId = $seasonId and gameTypeId = $gameTypeId",
                        seasonId, gameTypeId)
                        .and(Exp.keyValue("playerId", "in", players.value())))
                .limit(Optional.ofNullable(limit).orElse(default_limit)); 

works as expected
((seasonId = 20212022) and (gameTypeId = 2) and playerId in (10000, 10001))

[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
Copy link
Contributor Author

andrus commented Jul 31, 2023

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant