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