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

Reply via email to