Hi Paul, Thanks for the detailed report. Yeah, EOModel importer due to its nature (people import their projects once, and then stay on Cayenne and never come back) has its share of issues. I just logged a Jira [1], but for now I recommend manually removing the failing qualifier from the source EOModel to be able to finish the rest of the import, and then manually enter this qualifier for the mapped Cayenne query corresponding to this EOFetchSpecification.
Andrus [1] https://issues.apache.org/jira/browse/CAY-2790 > On Jan 13, 2023, at 7:07 PM, Paul L. Merchant Jr. > <paul.l.merchant...@dartmouth.edu> wrote: > > Hi everyone, I'm evaluating Cayenne as a replacement for a EnterpriseObjects > in a legacy code base. I think I've run into a bug in CayenneModeler 4.2.RC2 > while importing one of my EOFetchSpecifications: > > CayenneModeler Info > Version: 4.2.RC2 > Build Date: Dec 01 2022 08:35:36 > Exception: > ================================= > org.apache.cayenne.exp.ExpressionException: [v.4.2.RC2 Dec 01 2022 08:35:36] > And: invalid child - null > at > org.apache.cayenne.exp.parser.AggregateConditionNode.jjtAddChild(AggregateConditionNode.java:94) > at > org.apache.cayenne.exp.parser.SimpleNode.setOperand(SimpleNode.java:325) > at > org.apache.cayenne.exp.ExpressionFactory.joinExp(ExpressionFactory.java:1298) > at > org.apache.cayenne.exp.ExpressionFactory.joinExp(ExpressionFactory.java:1270) > at > org.apache.cayenne.wocompat.EOQuery$EOFetchSpecificationParser.makeQualifier(EOQuery.java:413) > at > org.apache.cayenne.wocompat.EOModelProcessor.makeEOQueryDescriptor(EOModelProcessor.java:266) > at > org.apache.cayenne.wocompat.EOModelProcessor.makeQuery(EOModelProcessor.java:223) > at > org.apache.cayenne.wocompat.EOModelProcessor.loadEOModel(EOModelProcessor.java:180) > at > org.apache.cayenne.wocompat.EOModelProcessor.loadEOModel(EOModelProcessor.java:105) > at > org.apache.cayenne.modeler.action.ImportEOModelAction.importEOModel(ImportEOModelAction.java:124) > at > org.apache.cayenne.modeler.action.ImportEOModelAction.performAction(ImportEOModelAction.java:88) > at > org.apache.cayenne.modeler.util.CayenneAction.actionPerformed(CayenneAction.java:171) > at > java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1972) > at > java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2313) > at > java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405) > at > java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262) > at > java.desktop/javax.swing.AbstractButton.doClick(AbstractButton.java:374) > at > java.desktop/com.apple.laf.ScreenMenuItem.actionPerformed(ScreenMenuItem.java:129) > at java.desktop/java.awt.MenuItem.processActionEvent(MenuItem.java:692) > at java.desktop/java.awt.MenuItem.processEvent(MenuItem.java:651) > at > java.desktop/java.awt.MenuComponent.dispatchEventImpl(MenuComponent.java:379) > at > java.desktop/java.awt.MenuComponent.dispatchEvent(MenuComponent.java:367) > at > java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776) > at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:722) > at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:716) > at > java.base/java.security.AccessController.doPrivileged(AccessController.java:399) > at > java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) > at > java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:97) > at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:746) > at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:744) > at > java.base/java.security.AccessController.doPrivileged(AccessController.java:399) > at > java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) > at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:743) > at > java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) > at > java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) > at > java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) > at > java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) > at > java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) > at > java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90) > > > The relevant fetch specification is relatively straightforward: > > qualifier = { > class = EOAndQualifier; > qualifiers = ( > { > class = EOKeyValueQualifier; > key = "storedName.netid"; > selectorName = "isEqualTo:"; > value = {"_key" = netid; class = EOQualifierVariable; }; > }, > { > class = EOKeyValueQualifier; > key = "storedName.sourceDnd.domain"; > selectorName = "isEqualTo:"; > value = {"_key" = upperRealm; class = EOQualifierVariable; > }; > } > ); > }; > > Perhaps relevant is that storedName is a relationship to an entity in a > different EOModel, but it doesn't matter whether that model has been imported > first. > > Any thoughts? > > Thanks, > > Paul Merchant, Jr. > Senior Programmer/Analyst > Digital Library Technologies Group > Dartmouth College