[Zope3-dev] Florent's O-R blog entry

Paul Winkler pw_lists at slinkp.com
Wed Aug 24 09:59:38 EDT 2005


Martijn Faassen wrote:
> Missing powerful query concepts
> -------------------------------
>
> Certain powerful query concepts like joins, available in a relational
> setting, are missing. I've already run into a scenario where I wanted to
>  someting like this: given a bunch of version objects with field 'id',
> where multiple objects can have the same 'id' to indicate they're
> versions of the same object, I want all objects where field
> 'workflow_state' is 'PUBLISHED' unless there is another object with the
> same id that have workflow_state 'NEW', in which case I want that one'.
>
> I think joins would be a way to solve it, though I haven't figured out
> the details, nor how to implement them efficiently on top of the
> catalog. This kind of thing is where a relational database makes life a
> lot simpler.

I used to have the same complaints in Zope 2, but so far I've been happy
with Dieter's AdvancedQuery product.  See
http://www.dieter.handshake.de/pyprojects/zope/AdvancedQuery.html
It might be worth a look while thinking about what to implement for zope 3.

Here's Dieter's example from that page:

from Products.AdvancedQuery import Eq, Between, Le

# search for objects below 'a/b/c' with ids between 'a' and 'z~'
query = Eq('path','a/b/c') & Between('id', 'a', 'z~')

# evaluate and sort descending by 'modified' and ascending by 'Creator'
context.Catalog.evalAdvancedQuery(query, (('modified','desc'), 'Creator',))

# search 'News' not yet archived and 'File's not yet expired.
now = context.ZopeTime()
query = Eq('portal_type', 'News') & ~ Le('ArchivalDate', now)
        | Eq('portal_type', 'File') & ~ Le('expires', now)
context.Catalog.evalAdvancedQuery(query)





More information about the Zope3-dev mailing list