Hi Michael,
From the spec,
<spec>
The candidate tuples
are the cartesian product of the candidate class and all variables
used in the result. The re-
sult tuples are the tuples of the candidate class and all variables
used in the result that sat-
isfy the filter. The result is the collection of result expressions
projected from the result
tuples.
</spec>
On Oct 27, 2006, at 2:12 PM, Michael Bouschen wrote:
Hi,
I'm having problems running JDOQL queries that group by a variable.
I think the queries below are valid, but I would like to double
check this. If you agree that the queries are valid JDOQL, I will
check the TCK to add these queries to existing TCK tests or add new
test cases. I tried the queries with JPOX version 1.1.3 and with
the nightly build from Oct 27 (no difference). I will send a test
case to reproduce the problem to Erik and Andy, since I cannot
attach archives here.
The class model is simple: pc class A has a field stringCol which
is a collection of strings and another field bCol which is a
collection of instances of class B.
The following query groups the class A instances by the strings in
their string collection:
Query q = pm.newQuery(A.class);
q.declareVariables("java.lang.String str");
q.setFilter("this.stringCol.contains(str)");
q.setGrouping("str");
q.setResult("str");
The cartesian product of the candidate class and all variables is a
the cartesian product of all A instances and all strings contained in
any stringCol. The result tuples consist of tuples of (A, String)
where the elements of stringCol are projected and associated with the
instances of A whence they came. The result comes from grouping and
projecting the String from the result tuple. So,
This query should collect all of the unique strings in all instances
of A stringCol. The result is a List<String>. I don't know offhand
how the implementation can do this trick (returning a List<Object> in
which each element is a String is easy).
This results in an exception:
JDOUserException: Unable to find the field "str" in the candidate
class. It is possible that this field is a field in a subclass, but
it is illegal to reference fields directly when they are in a
subclass.
I get a different exception when adding an aggregate to the result
clause
q.setResult("str, count(this)");
JDOUserException: Unconstrained variable referenced: str
This query should collect all of the unique strings in all instances
of A stringCol, count them, and return the string and count of
occurrences. The result is a List<Object[ ]> Each element consists of
an Object[ ] containing a String in element 0 and a Long in
element 1.
The behavior is different when iterating a collection of pc
instances:
Query q = pm.newQuery(A.class);
q.declareVariables("model.B b");
q.setFilter("this.bCol.contains(b)");
q.setGrouping("b");
q.setResult("count(this), b");
This results in:
JDOUserException: The result clause has a field expression
"UnboundVariable "UNBOUND_B.ID"" that doesnt appear in the
grouping. Any result specification has to be present in the
grouping when grouping is specified.
This query should collect all of the unique B instances in all
instances of A bCol, count them, and return the B and count of
occurrences. The result is a List<Object[ ]> Each element consists of
an Object[ ] containing a B in element 0 and a Long in element 1.
Craig
Any help is appreciated. Thanks!
Regards Michael
--
Michael Bouschen [EMAIL PROTECTED] Engineering GmbH
mailto:[EMAIL PROTECTED] http://www.tech.spree.de/
Tel.:++49/30/235 520-33 Buelowstr. 66
Fax.:++49/30/2175 2012 D-10783 Berlin
Craig Russell
Architect, Sun Java Enterprise System http://java.sun.com/products/
jdo
408 276-5638 mailto:[EMAIL PROTECTED]
P.S. A good JDO? O, Gasp!