]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- corresponding to label/bindparam name generataion, eager loaders
authorMike Bayer <mike_mp@zzzcomputing.com>
Thu, 29 Mar 2007 00:56:34 +0000 (00:56 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 29 Mar 2007 00:56:34 +0000 (00:56 +0000)
generate deterministic names for the aliases they create using
md5 hashes.

CHANGES
lib/sqlalchemy/orm/strategies.py
lib/sqlalchemy/util.py

diff --git a/CHANGES b/CHANGES
index 2289a14b274aa9ab83109862905fc7ebd5700ff7..17736daa29052bab8262d3e673e3fe07c544f185 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -17,6 +17,9 @@
     - sending None as an argument to func.<something> 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)
index ad3c6432e9156382704c7e79474aece7fbc78ac2..f980a189c48b775e8d627d5c13aae0fccd914ce9 100644 (file)
@@ -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))
index 0f1a988ce907dba4df7fb4e9b75e2ae7c7838816..dadcf0ddeea1eacbd8c3a2dee2a2345760eca271 100644 (file)
@@ -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 = {}