Re: ExpressionFactory.matchAllExp(...)

From: Marcel (emmpeege..mail.com)
Date: Tue Jul 25 2006 - 01:36:25 EDT

  • Next message: Bill Dudney: "Re: CayenneModeler plugin environment"

    Andrus,

    Sorry, it came out unclearly in the email. The exception, an
    ExpressionException, doesn't have a stack trace.

    Here is a standalone snippet that will create the problem:

    private void matchAllTest() {
        HashMap map = new HashMap();
        map.put("test", "test");
        Expression qual = ExpressionFactory.matchAllExp(map, Expression.AND);
    }

    I thought that ought to create a valid expression, but if you step
    through matchAllExp there is an exception thrown, and it doesn't seem to
    depend on the values of the map entry. I can't see how the unit test
    doesn't throw it.
    Here is the stack as the exception is about to be thrown (explicitly
    using throw):

    Thread [main] (Suspended)
        ASTAnd(AggregateConditionNode).jjtAddChild(Node, int) line: 125
        ASTAnd(SimpleNode).setOperand(int, Object) line: 187
        ExpressionFactory.matchAllExp(Map, int) line: 298
        SelectObjectPage2.matchAllTest()

    Hope that is clearer. I've worked around it fairly simply.

    Marcel

    Andrus Adamchik wrote:
    > Marcel,
    >
    > Could you post the actual code and exception stack trace? (sorry, I am
    > tired at the end of the day and can't make sense of what you wrote).
    > BTW, this unit test works:
    >
    > public void testMatchAllExp() throws Exception {
    > // create expressions and check the counts,
    > // leaf count should be (2N) : 2 leafs for each pair
    > // node count should be (2N + 1) for nodes with more than 1 pair
    > // and 2N for a single pair : 2 nodes for each pair + 1 list node
    > // where N is map size
    >
    > // check for N in (1..3)
    > for (int n = 1; n <= 3; n++) {
    > Map map = new HashMap();
    >
    > // populate map
    > for (int i = 1; i <= n; i++) {
    > map.put("k" + i, "v" + i);
    > }
    >
    > Expression exp = ExpressionFactory.matchAllExp(map,
    > Expression.LESS_THAN);
    > assertNotNull(exp);
    > handler.traverseExpression(exp);
    >
    > // assert statistics
    > handler.assertConsistency();
    > assertEquals("Failed: " + exp, 2 * n, handler.getLeafs());
    > assertEquals("Failed: " + exp, n < 2 ? 2 * n : 2 * n + 1,
    > handler
    > .getNodeCount());
    > }
    > }
    >
    >
    >
    >
    > On Jul 24, 2006, at 9:38 PM, Marcel wrote:
    >
    >>
    >> As far as I can tell there is a bug in
    >> ExpressionFactory.*matchAllExp*(java.util.Map map, int type).
    >>
    >> With a map of keys and values, an exception will always arise here:
    >>
    >> Thread [main] (Suspended)
    >> ASTAnd(AggregateConditionNode).jjtAddChild(Node, int) line: 120
    >> ASTAnd(SimpleNode).setOperand(int, Object) line: 187
    >> ExpressionFactory.matchAllExp(Map, int) line: 298
    >>
    >> jjtAddChild throws an exception whenNode is not of type ConditionNode
    >> or AggregateConditionNode. However, the Node parameter is just the
    >> Object parameter from setOperand, which is called from matchAllExp as:
    >>
    >> exp.setOperand(0, new ASTObjPath(entry.getKey()));
    >>
    >> Where entry.getKey() is the object path (in my case just the name of
    >> an object attribute). ASTObjPath is not of the correct type, so an
    >> exception is thrown everytime, regardless of what entry.getKey()
    >> happens to be.
    >>
    >> Folks with more experience? I'll try just stringing my own expression
    >> together for now.
    >>
    >> Marcel
    >>
    >
    >



    This archive was generated by hypermail 2.0.0 : Tue Jul 25 2006 - 01:36:59 EDT