From: Jason Kirtland Date: Fri, 17 Oct 2008 19:19:05 +0000 (+0000) Subject: Cache polymorphic_iterator in UOWTask; substantial savings for polymorphism-heavy... X-Git-Tag: rel_0_5rc3~74 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6481d24642488bd445bc0ab29d211fe468814e1c;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Cache polymorphic_iterator in UOWTask; substantial savings for polymorphism-heavy workloads. --- diff --git a/lib/sqlalchemy/orm/unitofwork.py b/lib/sqlalchemy/orm/unitofwork.py index 8412887a45..52bf1578e4 100644 --- a/lib/sqlalchemy/orm/unitofwork.py +++ b/lib/sqlalchemy/orm/unitofwork.py @@ -342,6 +342,10 @@ class UOWTask(object): self.dependencies = set() self.cyclical_dependencies = set() + @util.lazy_property + def inheriting_mappers(self): + return list(self.mapper.polymorphic_iterator()) + @property def polymorphic_tasks(self): """Return an iterator of UOWTask objects corresponding to the @@ -372,7 +376,7 @@ class UOWTask(object): those mappers. """ - for mapper in self.mapper.polymorphic_iterator(): + for mapper in self.inheriting_mappers: t = self.base_task._inheriting_tasks.get(mapper, None) if t is not None: yield t diff --git a/lib/sqlalchemy/util.py b/lib/sqlalchemy/util.py index 88245945e2..770b48796c 100644 --- a/lib/sqlalchemy/util.py +++ b/lib/sqlalchemy/util.py @@ -395,6 +395,19 @@ def iterate_attributes(cls): yield (key, c.__dict__[key]) break +class lazy_property(object): + """A read-only @property that is only evaluated once.""" + def __init__(self, fget, doc=None): + self.fget = fget + self.__doc__ = doc or fget.__doc__ + self.__name__ = fget.__name__ + + def __get__(self, obj, cls): + if obj is None: + return None + obj.__dict__[self.__name__] = result = self.fget(obj) + return result + # from paste.deploy.converters def asbool(obj): if isinstance(obj, (str, unicode)):