21 březen 2013
In Gaelyk you can already save query created by query dsl using datastore.query{...}
and than excute it using datastore prepare function but this method only support a subset of dsl statements - namelyselect
, from
, where
, and
and sort
. Corection using as
or setting limit
or offset
is simply ignored.
In Gaelyk 2.0 you can use datastore.build{...}
method
to create instance of QueryBuilder.
Warning! Thanks to Groovy 2.0
extension modules you can use helper method on any DatastoreService
instance even outside groovlets or templates
but you still have to assing the DatastoreService
in datastore
variable and call
the methods on that variable to make query dsl transformation working.
This is current limitation and should change in time of final Gaelyk 2.0 release.
Let's show the difference between datastore.query
and datastore.build
methods:
Query method example
Query query = datastore.query {
from 'Comment' as Comment
where author == 10
sort by crate desc
limit 10
}
PreparedQuery pq = datastore.prepare query
// The limit is gone! We need to set it again
FetchOptions.Builder options = withLimit(10)
// set the offset if there is page param specified
if(params.page){
options = options.offset((params.page as int) * 10)
}
def comments = pq.asList(options.build())
// and we also get only entities not comments
for(Entity e in entity){
// which needs to be coerced manually
Comment comment = e as Comment
process comment
}
When using datastore.query
method a portion of query parameters where erased, expecially loosing coercion
is very confusing. On the other hand if you use datastore.build
instead than all the information are kept.
Build method example
QueryBuiler dsl = datastore.build {
from 'Comment' as Comment
where author == 10
sort by crate desc
limit 10
}
// set the offset if there is page param specified
if(params.page){
dsl.offset((params.page as int) * 10)
}
def comments = dsl.execute()
// no need to coerce manually
for(Comment in comments){
process comment
}