From 5583ab113efbe6c0d352be6fbb2d7f322cceeb3c Mon Sep 17 00:00:00 2001 From: Doug Blank Date: Sun, 22 Aug 2010 15:22:56 +0000 Subject: [PATCH] Filter speed ups, and hook for filter plugins svn: r15800 --- src/Filters/Rules/_MatchesFilterBase.py | 49 +++++++++---------------- src/Filters/_FilterList.py | 36 ++++++++++++------ 2 files changed, 41 insertions(+), 44 deletions(-) diff --git a/src/Filters/Rules/_MatchesFilterBase.py b/src/Filters/Rules/_MatchesFilterBase.py index a112d75ad..8420c28f2 100644 --- a/src/Filters/Rules/_MatchesFilterBase.py +++ b/src/Filters/Rules/_MatchesFilterBase.py @@ -55,50 +55,35 @@ class MatchesFilterBase(Rule): category = _('General filters') def prepare(self, db): - #if Filters.SystemFilters: - #for filt in Filters.SystemFilters.get_filters(self.namespace): - #if filt.get_name() == self.list[0]: - #for rule in filt.flist: - #rule.prepare(db) if Filters.CustomFilters: - for filt in Filters.CustomFilters.get_filters(self.namespace): - if filt.get_name() == self.list[0]: - for rule in filt.flist: - rule.prepare(db) + filters = Filters.CustomFilters.get_filters_dict(self.namespace) + if self.list[0] in filters: + filt = filters[self.list[0]] + for rule in filt.flist: + rule.prepare(db) def reset(self): - #if Filters.SystemFilters: - #for filt in Filters.SystemFilters.get_filters(self.namespace): - #if filt.get_name() == self.list[0]: - #for rule in filt.flist: - #rule.reset() if Filters.CustomFilters: - for filt in Filters.CustomFilters.get_filters(self.namespace): - if filt.get_name() == self.list[0]: - for rule in filt.flist: - rule.reset() + filters = Filters.CustomFilters.get_filters_dict(self.namespace) + if self.list[0] in filters: + filt = filters[self.list[0]] + for rule in filt.flist: + rule.reset() def apply(self, db, obj): - #if Filters.SystemFilters: - #for filt in Filters.SystemFilters.get_filters(self.namespace): - #if filt.get_name() == self.list[0]: - #return filt.check(db, obj.handle) if Filters.CustomFilters: - for filt in Filters.CustomFilters.get_filters(self.namespace): - if filt.get_name() == self.list[0]: - return filt.check(db, obj.handle) + filters = Filters.CustomFilters.get_filters_dict(self.namespace) + if self.list[0] in filters: + filt = filters[self.list[0]] + return filt.check(db, obj.handle) return False def find_filter(self): """ Return the selected filter or None. """ - #if Filters.SystemFilters: - #for filt in Filters.SystemFilters.get_filters(self.namespace): - #if filt.get_name() == self.list[0]: - #return filt if Filters.CustomFilters: - for filt in Filters.CustomFilters.get_filters(self.namespace): - if filt.get_name() == self.list[0]: - return filt + filters = Filters.CustomFilters.get_filters_dict(self.namespace) + if self.list[0] in filters: + return filters[self.list[0]] return None diff --git a/src/Filters/_FilterList.py b/src/Filters/_FilterList.py index a1400dbbe..22922a146 100644 --- a/src/Filters/_FilterList.py +++ b/src/Filters/_FilterList.py @@ -51,6 +51,17 @@ class FilterList(object): def __init__(self, file): self.filter_namespaces = {} self.file = os.path.expanduser(file) + self._cached = None + + def get_filters_dict(self, namespace='generic'): + """ + This runs every for every item to be matched! + """ + if self._cached is None: + filters = self.get_filters(namespace) + self._cached = dict([(filt.name, filt) for filt in filters]) + else: + return self._cached def get_filters(self, namespace='generic'): """ @@ -60,18 +71,19 @@ class FilterList(object): filters = self.filter_namespaces[namespace] else: filters = [] - # plugins = PLUGMAN.process_plugin_data('Filters') - # plugin_filters = [] - # if plugins: - # try: - # plugin_filters = [plug for plug in [plug(namespace) - # if callable(plug) - # else plug - # for plug in plugins] - # if plug is not None] - # except: - # import traceback - # traceback.print_exc() + plugins = PLUGMAN.process_plugin_data('Filters') + if plugins: + plugin_filters = [] + try: + plugin_filters = [plug for plug in [plug(namespace) + if callable(plug) + else plug + for plug in plugins] + if plug is not None] + except: + import traceback + traceback.print_exc() + filters += plugin_filters return filters def add(self, namespace, filt):