From bd9afff0bf887d2239b7713edd77acd35490f156 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Tue, 31 Jul 2012 14:44:02 +0200 Subject: [PATCH] fix performance problem in relation registry --- relation/__init__.py | 5 +++++ relation/registry.py | 16 ++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/relation/__init__.py b/relation/__init__.py index bef1d08..7df847a 100644 --- a/relation/__init__.py +++ b/relation/__init__.py @@ -37,11 +37,16 @@ class Relation(Persistent): order = 0 relevance = 1.0 + fallback = None @classmethod def getPredicateName(cls): return '%s.%s' % (cls.__module__, cls.__name__) + @property + def ident(self): + return self.getPredicateName() + def validate(self, registry=None): return True diff --git a/relation/registry.py b/relation/registry.py index aed4e66..275d073 100644 --- a/relation/registry.py +++ b/relation/registry.py @@ -186,7 +186,7 @@ class RelationRegistry(Catalog): if value is not None: criteria[attr] = intids.getId(value) pn = example.getPredicateName() - if pn: + if pn is not None: criteria['relationship'] = pn for k in kw: # overwrite example fields with explicit values @@ -244,12 +244,20 @@ def getRelations(first=None, second=None, third=None, relationships=None): if not relationships: return registry.query(**query) else: - result = set() + predicates = [] for r in relationships: - query['relationship'] = r - result.update(registry.query(**query)) + if hasattr(r, 'predicate'): + predicates.append(r.predicate) + r.predicate = None + else: + predicates.append(r.getPredicateName()) + result = registry.query(**query) + if predicates: + return [r for r in result + if r.ident in predicates or r.fallback in predicates] return result + def getRelationSingle(obj=None, relationship=None, forSecond=True): """ Returns the one and only relation for first having relationship or None if there is none.