diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-03-29 00:56:34 +0000 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-03-29 00:56:34 +0000 |
| commit | 740733f41080da1913a574e018731b9d6c3e4816 (patch) | |
| tree | 8df24ddc7169e39a3cb1ac6dd695199b0a8e9a82 /lib | |
| parent | c622b0f59d1b6270ca7cc7acc0fec437161b1d73 (diff) | |
| download | sqlalchemy-740733f41080da1913a574e018731b9d6c3e4816.tar.gz | |
- corresponding to label/bindparam name generataion, eager loaders
generate deterministic names for the aliases they create using
md5 hashes.
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/sqlalchemy/orm/strategies.py | 12 | ||||
| -rw-r--r-- | lib/sqlalchemy/util.py | 8 |
2 files changed, 17 insertions, 3 deletions
diff --git a/lib/sqlalchemy/orm/strategies.py b/lib/sqlalchemy/orm/strategies.py index ad3c6432e..f980a189c 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 0f1a988ce..dadcf0dde 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 = {} |
