performance improvement: only create new relation if necessary

This commit is contained in:
Helmut Merz 2011-11-21 12:11:31 +01:00
parent 341371604c
commit 1d5b525a59

View file

@ -18,8 +18,6 @@
""" """
Common stuff. Common stuff.
$Id$
""" """
from zope import component from zope import component
@ -350,23 +348,24 @@ class RelationSet(object):
@Lazy @Lazy
def predicate(self): def predicate(self):
#return self.conceptManager[self.predicateName]
return self.conceptManager.get(self.predicateName) return self.conceptManager.get(self.predicateName)
class ParentRelationSet(RelationSet): class ParentRelationSet(RelationSet):
def add(self, related, order=0, relevance=1.0): def add(self, related, order=0, relevance=1.0):
#if isinstance(related, AdapterBase):
# related = related.context
related = baseObject(related) related = baseObject(related)
existing = list(self.context.getParentRelations([self.predicate], related,
noSecurityCheck=self.noSecurityCheck))
if len(existing) == 1:
rel = existing[0]
if rel.order == order and rel.relevance == relevance:
return
self.context.deassignParent(related, [self.predicate], # avoid duplicates self.context.deassignParent(related, [self.predicate], # avoid duplicates
noSecurityCheck=self.noSecurityCheck) noSecurityCheck=self.noSecurityCheck)
self.context.assignParent(related, self.predicate, order, relevance) self.context.assignParent(related, self.predicate, order, relevance)
def remove(self, related): def remove(self, related):
#if isinstance(related, AdapterBase):
# related = related.context
self.context.deassignParent(baseObject(related), [self.predicate]) self.context.deassignParent(baseObject(related), [self.predicate])
def __iter__(self): def __iter__(self):
@ -396,8 +395,13 @@ class ParentRelationSet(RelationSet):
class ChildRelationSet(RelationSet): class ChildRelationSet(RelationSet):
def add(self, related, order=0, relevance=1.0): def add(self, related, order=0, relevance=1.0):
if isinstance(related, AdapterBase): related = baseObject(related)
related = related.context existing = list(self.context.getChildRelations([self.predicate], related,
noSecurityCheck=self.noSecurityCheck))
if len(existing) == 1:
rel = existing[0]
if rel.order == order and rel.relevance == relevance:
return
self.context.deassignChild(related, [self.predicate]) # avoid duplicates self.context.deassignChild(related, [self.predicate]) # avoid duplicates
self.context.assignChild(related, self.predicate, order, relevance) self.context.assignChild(related, self.predicate, order, relevance)