db-jdo-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Michael Bouschen <mbo.t...@spree.de>
Subject Re: JDOQL query problems (JPOX issues?)
Date Sat, 28 Oct 2006 21:53:05 GMT
Hi Erik,

my 0.02$:

According to section "14.6.5 Variable declaration" a variable is a 
constrained variable, if there is a contains clause for this variable. 
W/o a contains clause this (so called unconstrained) variable is 
constrained by the extent of the pc class. An unconstrained variable of 
type String would not make sense, because there is no such extent. But 
the variable "str" in the example has a contains clause constraining it 
to the string collection field in A.

Regards Michael
> Craig,
>
> I understand that variables of PC get bound to a set of pc type, but strings...
> What is it bound to?
>
> rgds
>
> Quoting Craig L Russell <Craig.Russell@Sun.COM>:
>
>   
>> Hi Erik,
>>
>> On Oct 28, 2006, at 7:19 AM, Erik Bengtson wrote:
>>
>>     
>>> Michael,
>>>
>>> I was reading Craig comments and noted that "str" is an unbound
>>> variable
>>>       
>> The variable "str" is bound by the filter q.setFilter
>> ("this.stringCol.contains(str)").
>>
>> Craig
>>     
>>> a parameter, and now I think the query is invalid since there is no
>>> value for
>>> str.
>>>
>>> Unbound variables are not null values.
>>>
>>> Quoting Craig L Russell <Craig.Russell@Sun.COM>:
>>>
>>>       
>>>> 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		Tech@Spree Engineering GmbH
>>>>> mailto:mbo.tech@spree.de	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:Craig.Russell@sun.com
>>>> P.S. A good JDO? O, Gasp!
>>>>
>>>>
>>>>         
>>>
>>>       
>> Craig Russell
>> Architect, Sun Java Enterprise System http://java.sun.com/products/jdo
>> 408 276-5638 mailto:Craig.Russell@sun.com
>> P.S. A good JDO? O, Gasp!
>>
>>
>>     
>
>
>   


-- 
Michael Bouschen		Tech@Spree Engineering GmbH
mailto:mbo.tech@spree.de	http://www.tech.spree.de/
Tel.:++49/30/235 520-33		Buelowstr. 66			
Fax.:++49/30/2175 2012		D-10783 Berlin			


Mime
View raw message