summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2007-03-29 00:56:34 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2007-03-29 00:56:34 +0000
commit740733f41080da1913a574e018731b9d6c3e4816 (patch)
tree8df24ddc7169e39a3cb1ac6dd695199b0a8e9a82 /lib
parentc622b0f59d1b6270ca7cc7acc0fec437161b1d73 (diff)
downloadsqlalchemy-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.py12
-rw-r--r--lib/sqlalchemy/util.py8
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 = {}