Hi,I think it might be useful to look at what SQL we expect to generate based on the JDOQL here.
Would someone like to try the JDOQL to SQL mapping? It might help understanding of the issue.
Thanks, Craig On Oct 28, 2006, at 3:02 PM, Erik Bengtson wrote:
Michael, When compiling this query we do the following: - define result sets - set1 * setN (fails here since not constrained) - restriction We would have to change that to: - define result sets - restriction (this would constraint the str to stringCol) - set1 * setNIf the query was evaluated by the JDO implementation the second one is certainlythe fastest.I agree that this way the query should work, but needs clarification in the specon the evaluation order (unless I missed it). Quoting Michael Bouschen <[EMAIL PROTECTED]>:Hi Erik,I fully agree with Craig's description of what the queries should return.Michael,I was reading Craig comments and noted that "str" is an unbound variableand nota parameter, and now I think the query is invalid since there is no valueforYes, str is a varaible and not a parameter. But why is it unbound? There is a contains clause binding the variable to field stringCol which is astr.collection of strings: q.setFilter("this.stringCol.contains(str)"); The third query binds the variable b to the collection of B instances called bCol: q.setFilter("this.bCol.contains(b)"); Here are the three queries in single string JDOQL:SELECT str FROM A WHERE this.stringCol.contains(str) VARIABLES Stringstr GROUP BY str SELECT str, count(this) FROM A WHERE this.stringCol.contains(str) VARIABLES String str GROUP BY strSELECT b count(this) FROM A WHERE this.bCol.contains(b) VARIABLES B bGROUP BY b Here is the SQL query for the second JDOQL query. Suppose class A ismapped to table TABLE_A and the string collection to table STRING_TABLE. This table has a foreign key to table A and a VARCHAR column called text. SELECT s.text, COUNT(a.id) FROM TABLE_A a, STRING_TABLE s WHERE s.a_id= a.id GROUP BY s.text I'm currently using this SQL query as a workaround and create a Queryinstance with the "javax.jdo.query.SQL" language parameter. It returnsthe expected result! Regards MichaelUnbound variables are not null values. Quoting Craig L Russell <[EMAIL PROTECTED]>: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 willcheck the TCK to add these queries to existing TCK tests or add newtest 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 athe cartesian product of all A instances and all strings contained inany stringCol. The result tuples consist of tuples of (A, String)where the elements of stringCol are projected and associated with theinstances 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 instancesof A stringCol. The result is a List<String>. I don't know offhandhow the implementation can do this trick (returning a List<Object> inwhich each element is a String is easy).This query should collect all of the unique strings in all instancesThis results in an exception: JDOUserException: Unable to find the field "str" in the candidateclass. It is possible that this field is a field in a subclass, butit 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: strof A stringCol, count them, and return the string and count ofoccurrences. 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 ofoccurrences. The result is a List<Object[ ]> Each element consists ofan Object[ ] containing a B in element 0 and a Long in element 1. CraigAny 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 BerlinCraig RussellArchitect, Sun Java Enterprise System http://java.sun.com/ products/jdo408 276-5638 mailto:[EMAIL PROTECTED] P.S. A good JDO? O, Gasp!-- 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!
smime.p7s
Description: S/MIME cryptographic signature
