You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@cayenne.apache.org by Eric Polino <er...@campgroundautomation.com> on 2008/08/19 16:21:48 UTC

QueryChain

I need to run a group of select queries all at once and would like to
parallelize it.  I'm attempting to do it with QueryChain but I'm
having issues getting the data I'm querying.  I know that QueryChain
will always return DataRows, but it seems as though I only get the
first query's result back and not all of them.  I'm using this page
from the guide as my starting point.
http://cayenne.apache.org/doc/querychain.html

QueryChain query = new QueryChain();

query.addQuery(new SQLTemplate(TypeFoo.class, "select count(*) as foo1
from TypeFoo"));
query.addQuery(new SQLTemplate(TypeBar.class, "select count(*) as foo2
from TypeBar"));
query.addQuery(new SQLTemplate(Type.class, "select count(*) as foo3
from Type"));

List<DataRow> ret = getDataContext().performQuery(query);
DataRow dr = ret.get(0);

System.out.println(ret.size()); //  "1"
System.out.println(dr.keySet().size());  //  "1"
System.out.println("FOO1 " + dr.get("FOO1")); //  "FOO1 123"
System.out.println("FOO2 " + dr.get("FOO2")); //  "FOO2 null"
System.out.println("FOO3 " + dr.get("FOO3")); //  "FOO3 null"

TIA,
Eric


-- 
Eric Polino
Campground Automated Systems

Re: QueryChain

Posted by Eric Polino <er...@campgroundautomation.com>.
On Wed, Aug 20, 2008 at 2:22 PM, Eric Polino
<er...@campgroundautomation.com> wrote:
> Alright sweet! That was it! Thanks.
>
> Now, QueryChain always returns DataRows because it can't know how to
> marshal objects.  Clearly the results from the three queries being run
> in the following code could be marshaled into List<Student> objects.
> Is there a way I can do that?
>
>  SQLTemplate tmpl = new SQLTemplate(TypeFoo.class, "select

Typo, that should be Student.class, and not TypeFoo.class

> #result('field1' 'int' 'age'), #result('field2' 'String' 'name') from
> Students where age < $bar");
>  QueryChain query = new QueryChain();
>
>  Map<String, String> param = new HashMap<String, String>();
>
>  param.put("bar", "4");
>  query.add(tmpl.queryWithParameters(param));
>
>  param.put("bar", "7");
>  query.add(tmpl.queryWithParameters(param));
>
>  param.put("bar", "14");
>  query.add(tmpl.queryWithParameters(param));
>
>  QueryResponse response = context.performGenericQuery(query);
>
> Here's how I'm getting my List<List<DataRow>> object from
> performGenericQuery().  It's a little dirty, but it seems to work for
> me.  Is this any useful to the marshaling I'm talking about above?
>
>    QueryResponse ret = getDataContext().performGenericQuery(query);
>    List<List<DataRow>> val = new ArrayList<List<DataRow>>();
>    ret.reset();
>    while(ret.next()){
>      if(ret.isList()){
>        val.add(ret.currentList());
>      }
>    }
>
> Once again, TIA,
> Eric
>
>
> On Wed, Aug 20, 2008 at 4:09 AM, Andrus Adamchik <an...@objectstyle.org> wrote:
>> Hi Eric,
>>
>> 'performQuery' method will only return the first result set, no matter how
>> many results you have in the query. To get all results, you will need to use
>> a different method for select:
>>
>> QueryResponse result = context.performGenericQuery(query);
>>
>> Then you can scan vis the QueryResponse object and access individual result
>> lists:
>>
>> http://cayenne.apache.org/doc/api/org/apache/cayenne/QueryResponse.html
>>
>> HTH
>> Andrus
>>
>>
>> On Aug 19, 2008, at 5:21 PM, Eric Polino wrote:
>>
>>> I need to run a group of select queries all at once and would like to
>>> parallelize it.  I'm attempting to do it with QueryChain but I'm
>>> having issues getting the data I'm querying.  I know that QueryChain
>>> will always return DataRows, but it seems as though I only get the
>>> first query's result back and not all of them.  I'm using this page
>>> from the guide as my starting point.
>>> http://cayenne.apache.org/doc/querychain.html
>>>
>>> QueryChain query = new QueryChain();
>>>
>>> query.addQuery(new SQLTemplate(TypeFoo.class, "select count(*) as foo1
>>> from TypeFoo"));
>>> query.addQuery(new SQLTemplate(TypeBar.class, "select count(*) as foo2
>>> from TypeBar"));
>>> query.addQuery(new SQLTemplate(Type.class, "select count(*) as foo3
>>> from Type"));
>>>
>>> List<DataRow> ret = getDataContext().performQuery(query);
>>> DataRow dr = ret.get(0);
>>>
>>> System.out.println(ret.size()); //  "1"
>>> System.out.println(dr.keySet().size());  //  "1"
>>> System.out.println("FOO1 " + dr.get("FOO1")); //  "FOO1 123"
>>> System.out.println("FOO2 " + dr.get("FOO2")); //  "FOO2 null"
>>> System.out.println("FOO3 " + dr.get("FOO3")); //  "FOO3 null"
>>>
>>> TIA,
>>> Eric
>>>
>>>
>>> --
>>> Eric Polino
>>> Campground Automated Systems
>>>
>>
>>
>
>
>
> --
> Eric Polino
> Campground Automated Systems
>



-- 
Eric Polino
Campground Automated Systems

Re: QueryChain

Posted by Eric Polino <er...@campgroundautomation.com>.
Alright sweet! That was it! Thanks.

Now, QueryChain always returns DataRows because it can't know how to
marshal objects.  Clearly the results from the three queries being run
in the following code could be marshaled into List<Student> objects.
Is there a way I can do that?

  SQLTemplate tmpl = new SQLTemplate(TypeFoo.class, "select
#result('field1' 'int' 'age'), #result('field2' 'String' 'name') from
Students where age < $bar");
  QueryChain query = new QueryChain();

  Map<String, String> param = new HashMap<String, String>();

  param.put("bar", "4");
  query.add(tmpl.queryWithParameters(param));

  param.put("bar", "7");
  query.add(tmpl.queryWithParameters(param));

  param.put("bar", "14");
  query.add(tmpl.queryWithParameters(param));

  QueryResponse response = context.performGenericQuery(query);

Here's how I'm getting my List<List<DataRow>> object from
performGenericQuery().  It's a little dirty, but it seems to work for
me.  Is this any useful to the marshaling I'm talking about above?

    QueryResponse ret = getDataContext().performGenericQuery(query);
    List<List<DataRow>> val = new ArrayList<List<DataRow>>();
    ret.reset();
    while(ret.next()){
      if(ret.isList()){
        val.add(ret.currentList());
      }
    }

Once again, TIA,
Eric


On Wed, Aug 20, 2008 at 4:09 AM, Andrus Adamchik <an...@objectstyle.org> wrote:
> Hi Eric,
>
> 'performQuery' method will only return the first result set, no matter how
> many results you have in the query. To get all results, you will need to use
> a different method for select:
>
> QueryResponse result = context.performGenericQuery(query);
>
> Then you can scan vis the QueryResponse object and access individual result
> lists:
>
> http://cayenne.apache.org/doc/api/org/apache/cayenne/QueryResponse.html
>
> HTH
> Andrus
>
>
> On Aug 19, 2008, at 5:21 PM, Eric Polino wrote:
>
>> I need to run a group of select queries all at once and would like to
>> parallelize it.  I'm attempting to do it with QueryChain but I'm
>> having issues getting the data I'm querying.  I know that QueryChain
>> will always return DataRows, but it seems as though I only get the
>> first query's result back and not all of them.  I'm using this page
>> from the guide as my starting point.
>> http://cayenne.apache.org/doc/querychain.html
>>
>> QueryChain query = new QueryChain();
>>
>> query.addQuery(new SQLTemplate(TypeFoo.class, "select count(*) as foo1
>> from TypeFoo"));
>> query.addQuery(new SQLTemplate(TypeBar.class, "select count(*) as foo2
>> from TypeBar"));
>> query.addQuery(new SQLTemplate(Type.class, "select count(*) as foo3
>> from Type"));
>>
>> List<DataRow> ret = getDataContext().performQuery(query);
>> DataRow dr = ret.get(0);
>>
>> System.out.println(ret.size()); //  "1"
>> System.out.println(dr.keySet().size());  //  "1"
>> System.out.println("FOO1 " + dr.get("FOO1")); //  "FOO1 123"
>> System.out.println("FOO2 " + dr.get("FOO2")); //  "FOO2 null"
>> System.out.println("FOO3 " + dr.get("FOO3")); //  "FOO3 null"
>>
>> TIA,
>> Eric
>>
>>
>> --
>> Eric Polino
>> Campground Automated Systems
>>
>
>



-- 
Eric Polino
Campground Automated Systems

Re: QueryChain

Posted by Andrus Adamchik <an...@objectstyle.org>.
Hi Eric,

'performQuery' method will only return the first result set, no matter  
how many results you have in the query. To get all results, you will  
need to use a different method for select:

QueryResponse result = context.performGenericQuery(query);

Then you can scan vis the QueryResponse object and access individual  
result lists:

http://cayenne.apache.org/doc/api/org/apache/cayenne/QueryResponse.html

HTH
Andrus


On Aug 19, 2008, at 5:21 PM, Eric Polino wrote:

> I need to run a group of select queries all at once and would like to
> parallelize it.  I'm attempting to do it with QueryChain but I'm
> having issues getting the data I'm querying.  I know that QueryChain
> will always return DataRows, but it seems as though I only get the
> first query's result back and not all of them.  I'm using this page
> from the guide as my starting point.
> http://cayenne.apache.org/doc/querychain.html
>
> QueryChain query = new QueryChain();
>
> query.addQuery(new SQLTemplate(TypeFoo.class, "select count(*) as foo1
> from TypeFoo"));
> query.addQuery(new SQLTemplate(TypeBar.class, "select count(*) as foo2
> from TypeBar"));
> query.addQuery(new SQLTemplate(Type.class, "select count(*) as foo3
> from Type"));
>
> List<DataRow> ret = getDataContext().performQuery(query);
> DataRow dr = ret.get(0);
>
> System.out.println(ret.size()); //  "1"
> System.out.println(dr.keySet().size());  //  "1"
> System.out.println("FOO1 " + dr.get("FOO1")); //  "FOO1 123"
> System.out.println("FOO2 " + dr.get("FOO2")); //  "FOO2 null"
> System.out.println("FOO3 " + dr.get("FOO3")); //  "FOO3 null"
>
> TIA,
> Eric
>
>
> -- 
> Eric Polino
> Campground Automated Systems
>