[Zope-CMF] Complex sorting on Zcatalogs.
Tres Seaver
tseaver@zope.com
Mon, 22 Oct 2001 20:51:12 -0400
Josef Albert Meile wrote:
> Sorry for this question which for some of you could be very simple,
> but I tried to find the answer on the Zope's website by giving the
> keywords: ZCatalog, sorting and sort, but I found nothing. I just
> found that it isn't possible with the original "dtml-in" tag and that
> there is a testing patch which permits to do it. I guess that it
> isn't possible with ZCatalogs. Anyway, correct me if I am wrong.
>
> I would like to make search on a Zcatalog and sort it on two or more
> field indexes. For example:
>
> objects=catalog(
> {
> 'meta_type' : pType,
> 'review_state' : pStatus,
> 'sort_on' : ['personTitle','personName'],
> }
> )
>
> I tried it but it didn't work.
> What is the correct sintax?
Unlike the in-tag's sort attribute, which can be a tuple, the catalog's
'sort_on' parameter must map to an index name (the only reason to have
the catalog sort your requests is to take advantage of indexing).
You might either
- fetch the objects without sorting, and then sort yourself::
objects = catalog( ...)
objects.sort( lambda x, y: cmp( ( x.personTitle(), x.personName() ),
( y.personTitle(), y.personName() ) )
or:
- create a PythonScript, 'personTitleName', which concatenates the
two fields::
## Script (Python) "personTitleName"
return '%s %s' % ( context.personTitle(), context.personName() )
and then create a field index on 'personTitleName'; you could then
query that index using 'sort_on' (after reindexing your content)::
objects=catalog( { 'meta_type' : pType
, 'review_state' : pStatus
, 'sort_on' : 'personTitleName'
}
)
BTW, this is really a question for zope@zope.org, rather than zope-cmf.
Tres.
--
===============================================================
Tres Seaver tseaver@zope.com
Zope Corporation "Zope Dealers" http://www.zope.com