From: Mike Bayer Date: Thu, 29 Mar 2007 00:56:34 +0000 (+0000) Subject: - corresponding to label/bindparam name generataion, eager loaders X-Git-Tag: rel_0_3_7~89 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=740733f41080da1913a574e018731b9d6c3e4816;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - corresponding to label/bindparam name generataion, eager loaders generate deterministic names for the aliases they create using md5 hashes. --- diff --git a/CHANGES b/CHANGES index 2289a14b27..17736daa29 100644 --- a/CHANGES +++ b/CHANGES @@ -17,6 +17,9 @@ - sending None as an argument to func. will produce an argument of NULL - orm: + - corresponding to label/bindparam name generataion, eager loaders + generate deterministic names for the aliases they create using + md5 hashes. - improved/fixed custom collection classes when giving it "set"/ "sets.Set" classes or subclasses (was still looking for append() methods on them during lazy loads) diff --git a/lib/sqlalchemy/orm/strategies.py b/lib/sqlalchemy/orm/strategies.py index ad3c6432e9..f980a189c4 100644 --- a/lib/sqlalchemy/orm/strategies.py +++ b/lib/sqlalchemy/orm/strategies.py @@ -352,12 +352,13 @@ class EagerLoader(AbstractRelationLoader): """ def __init__(self, eagerloader, parentclauses=None): + self.id = (parentclauses is not None and (parentclauses.id + "/") or '') + str(eagerloader.parent_property) self.parent = eagerloader self.target = eagerloader.select_table - self.eagertarget = eagerloader.select_table.alias() + self.eagertarget = eagerloader.select_table.alias(self._aliashash("/target")) if eagerloader.secondary: - self.eagersecondary = eagerloader.secondary.alias() + self.eagersecondary = eagerloader.secondary.alias(self._aliashash("/secondary")) self.aliasizer = sql_util.Aliasizer(eagerloader.target, eagerloader.secondary, aliases={ eagerloader.target:self.eagertarget, eagerloader.secondary:self.eagersecondary @@ -380,7 +381,12 @@ class EagerLoader(AbstractRelationLoader): self.eager_order_by = None self._row_decorator = self._create_decorator_row() - + + def _aliashash(self, extra): + """return a deterministic 4 digit hash value for this AliasedClause's id + extra.""" + # use the first 4 digits of an MD5 hash + return "anon_" + util.hash(self.id + extra)[0:4] + def _aliasize_orderby(self, orderby, copy=True): if copy: return self.aliasizer.copy_and_process(util.to_list(orderby)) diff --git a/lib/sqlalchemy/util.py b/lib/sqlalchemy/util.py index 0f1a988ce9..dadcf0ddee 100644 --- a/lib/sqlalchemy/util.py +++ b/lib/sqlalchemy/util.py @@ -10,6 +10,8 @@ except ImportError: import dummy_thread as thread import dummy_threading as threading +import md5 + import __builtin__ try: @@ -56,6 +58,12 @@ def flatten_iterator(x): else: yield elem +def hash(string): + """return an md5 hash of the given string.""" + h = md5.new() + h.update(string) + return h.hexdigest() + class ArgSingleton(type): instances = {}