diff --git a/expert/README.txt b/expert/README.txt index 257f29b..4aece02 100644 --- a/expert/README.txt +++ b/expert/README.txt @@ -187,10 +187,12 @@ concepts) that are direct or indirect children of jim. >>> sorted(o.title for o in getObjects((qu & fltr.query()).apply())) [u'Doc 001', u'Doc 003'] - >>> #fltr.check(concepts['d001.txt']) - >>> #fltr.check(concepts['d002.txt']) - >>> #objs = fltr.apply(objs) - >>> #sorted(o.title for o in objs.values()) + >>> #fltr.check(resources['d001.txt']) + >>> #fltr.check(resources['d002.txt']) + >>> r1 = qu.apply() + >>> r2 = fltr.apply(dict(zip(r1, getObjects(r1)))) + >>> sorted(o.title for o in r2.values()) + [u'Doc 001', u'Doc 003'] Organizing Queries and Filters with Query Instances diff --git a/expert/filter.py b/expert/filter.py index 2c4eb5b..4ae52b0 100644 --- a/expert/filter.py +++ b/expert/filter.py @@ -28,22 +28,31 @@ from zope.interface import implements from cybertools.catalog.query import And from loops.expert.interfaces import IFilter from loops.expert.query import Children as ChildrenQuery +from loops import util class Filter(object): implements(IFilter) + query = None + def __init__(self, **kw): self.kwargs = kw def apply(self, objects, queryInstance=None): + qu = self.query() + #if qu is not None: + # return set(objects).intersection(qu.apply()) result = IOBTree() - for uid, obj in objects: - if self.check(obj, queryInstance): + for uid, obj in objects.items(): + if self.check(uid, obj, queryInstance): result[uid] = obj return result + def check(self, uid, obj, queryInstance=None): + return uid in self.query().apply() #.keys() + class Children(Filter): diff --git a/expert/interfaces.py b/expert/interfaces.py index e9c1912..1f5f582 100644 --- a/expert/interfaces.py +++ b/expert/interfaces.py @@ -26,7 +26,7 @@ from zope.interface import Interface, Attribute class IQuery(Interface): - """ A query or + """ A query. """ def apply(): @@ -68,7 +68,7 @@ class IFilter(Interface): intermediate results. """ - def check(obj, queryInstance=None): + def check(uid, obj, queryInstance=None): """ Return True if the object given should be included in the filter's result set, False otherwise.