[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