[Zope] Suppressing dupes in a concatenated ZCatalog query.

Jonathan dev101 at magma.ca
Thu Jul 28 17:30:27 EDT 2005


----- Original Message ----- 
From: <abgillette at allmail.net>
To: <zope at zope.org>
Sent: Thursday, July 28, 2005 4:57 PM
Subject: [Zope] Suppressing dupes in a concatenated ZCatalog query.


> Hi All,
>
> I have a ZCatalog with two text indexes, news_subj and news_text. Each
> ZCatalog item also has a unique numeric ID.
>
> I'd like to search news_subj and news_text simultaneously, with the
> results checked for duplicates. In other words, if catalog item 1001 has
> the word "foobar" in both the news_subj and news_text fields, I only
> want it to show up once in my search results.
>
> Here's what I've got, so far:
>
> <dtml-in expr="mp_catalog({'news_text':'foobar'}) +
> mp_catalog({'news_subj':'foobar'})">
>    <dtml-var news_subj><br>
> </dtml-in>
>
> This correctly searches both fields, but, when "foobar" appears in both
> news_subj and news_text, the result is displayed twice.
>
> Can anyone give me a pointer on suppressing dupes in a concatenated
> ZCatalog query? I'm sure there's an easy answer, but I haven't been able
> to find it.

I had saved the following extract from a previous message on this mailing 
list, it may be of some help:

<snip>
finally I got it working and maybe it helps someone else ..
you can't necessarily eliminate duplicates from the ZCatalog search results 
by sorting the mybrains because the same object
 in the ZODB may be denoted my two different mybrains as far as I 
understand. so my "solution" was to make the absolute
 URLs the keys of a dictionary and return the values(), i.e. the mybrains:
PythonMethod "uniq" (parameter "items" contains the results of a Catalog 
query):
d = {}
 for item in items:
   url = item.getURL()
   d.update( { url: item } )
 return d.values()

 you can call it like that:
<dtml-let resa="Catalog(text_obj=begriff)"
   resb="Catalog(abstract_obj=begriff)"
   resc="Catalog(title=begriff)"
   res="resa[:_.len(resa)] + resb[:_.len(resb)] + resc[:_.len(resc)]">
 <dtml-in "uniq(items=res)" size=50 start=query_start> ....

</snip>

This is not a very elegant solution and will be cpu intensive, but if your 
catalog is not too large it may work for you.

hth

Jonathan 




More information about the Zope mailing list