makeAdvancedQuery vs. ZCatalog/CatalogTool.searchResults()

2 messages Options
Embed this post
Permalink
Michael Hierweck

makeAdvancedQuery vs. ZCatalog/CatalogTool.searchResults()

Reply Threaded More More options
Print post
Permalink
Hallo allerseits,

ich habe versucht, umzusetzen, was Dieter Maurer vor einiger Zeit
vorgeschlagen hat:

https://mail.dzug.org/pipermail/zope/2009-April/007316.html

--------------------------------------------------------------

# Sicherstellen, dass AdvancedQuery bereits seine Patches
# aktiviert hat.

import Products.AdvancedQuery

# Patchen von ZCatalog und CatalogTool

def _searchResults(self, REQUEST=None, used=None, _merge=1, **kw):
  return self.evalAdvancedQuery(self.makeAdvancedQuery(kw))

from Products.ZCatalog.ZCatalog import ZCatalog
ZCatalog.__call__ = _searchResults
ZCatalog.searchResults = _searchResults
del ZCatalog

from Products.CMFCore.CatalogTool import CatalogTool
CatalogTool.__call__ = _searchResults
CatalogTool.searchResults = _searchResults
del CatalogTool

----------------------------------------------------------------------

# relevanter Ausschnitt aus dem Testcode

def test(context):
   brains = context.portal_catalog.searchResults(portal_type='Document')
   for brain in brains:
     print brain.Title

----------------------------------------------------------------------

Der Testcode (mit instance run test.py aufgerufen) funktioniert auch.

Die Website insgesamt funktioniert bedingt durch den Patch aber nicht
mehr, die Zope-Instanzen rechnen sich zu Tode (CPU-Zeit) und fressen den
gesamten RAM (vorher rund 800 MB pro Instanz).

Danke für Tipps

Michael



_______________________________________________
zope mailing list
[hidden email]
https://mail.dzug.org/mailman/listinfo/zope
Michael Hierweck

Re: makeAdvancedQuery vs. ZCatalog/CatalogTool.searchResults()

Reply Threaded More More options
Print post
Permalink
Hallo,

ich habe noch einmal an dem Versuch gefeilt. Da makeAdvancedQuery die
Sortierung nicht behandelt, mache ich das selbst.

------------------------------------------------------------------------

import Products.AdvancedQuery

def _searchResults(self, REQUEST=None, used=None, _merge=1, **kw):
  if kw.has_key('sort_on'):
    sort_on = kw['sort_on']
    if kw.has_key('sort_order') and (kw['sort_order'] == 'descending' or
kw['sort_order'] == 'reverse'):
      sort_order = 'desc'
    else:
      sort_order = 'asc'
    sorting = ((sort_on,sort_order),)
  else:
    sorting = ()
  return self.evalAdvancedQuery(self.makeAdvancedQuery(kw), sorting)

from Products.ZCatalog.ZCatalog import ZCatalog
ZCatalog.searchResults = _searchResults
ZCatalog.__call__ =  _searchResults
del ZCatalog

------------------------------------------------------------------------

Wenn ich diesen Patch anwende, wird meine Plone Site leider so extrem
langsam, dass man meint, sie würde hängen (kein Output nach über einer
Stunde).

Die extreme Rechenzeit wird aber dem Anschein *zwischen* einzelnen
Suchaufrufen verbraucht.

Ich habe mal versuchsweise die Ergebnismengen gekürzt:
return self.evalAdvancedQuery(self.makeAdvancedQuery(kw), sorting)[:25]

Dann ist die Website schnell, aber "kurz"...

Ich vermute, dass Teile von Plone mit der LazyMap von AdvancedQuery
"ungeschickt" umgehen. Aber kann es sein, dass der ungepatchte ZCatalog
dann so erheblich effizienter ist? (Verständnisproblem)

Viele Grüße

Michael



_______________________________________________
zope mailing list
[hidden email]
https://mail.dzug.org/mailman/listinfo/zope