]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
trying to get mappers to support having versions against different tables for the...
authorMike Bayer <mike_mp@zzzcomputing.com>
Tue, 7 Feb 2006 02:54:26 +0000 (02:54 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 7 Feb 2006 02:54:26 +0000 (02:54 +0000)
that dont affect the original class mapper and create objects with the correct identity key
support in EagerLoader to better handle "selectalias" when the eager mapper hits another eager mapper, etc

lib/sqlalchemy/engine.py
lib/sqlalchemy/mapping/__init__.py
lib/sqlalchemy/mapping/mapper.py
lib/sqlalchemy/mapping/properties.py
lib/sqlalchemy/util.py

index 8bb4767d95372d1a4e3e2494ef74c934c8976a1a..dfc4a7337b473e1150c1c5dc1a61546a2ec2990c 100644 (file)
@@ -725,6 +725,7 @@ class RowProxy:
         except:
             raise AttributeError
     def keys(self):
+        print "KEYS", self.__parent.keys
         return self.__parent.keys
     def values(self): 
         return list(self)
index ce693b2fb8934764bf1a39a7f4cc1db76421aea0..f208a932ec87b2d2d21d9cc483045696ecb81c71 100644 (file)
@@ -117,6 +117,8 @@ def class_mapper(class_):
         pass
         raise "Class '%s' has no mapper associated with it" % class_.__name__
 
+mapperlib.class_mapper = class_mapper
+
 def assign_mapper(class_, *args, **params):
     params.setdefault("is_primary", True)
     if not isinstance(getattr(class_, '__init__'), types.MethodType):
index eb54e0301d43a94cc5832231f45d39b9bc01c619..597214220dc4d7e2c3d189ac766715916055dba2 100644 (file)
@@ -174,7 +174,10 @@ class Mapper(object):
             ):
             objectstore.global_attributes.reset_class_managed(self.class_)
             self._init_class()
-            
+            self.identitytable = self.primarytable
+        else:
+            self.identitytable = class_mapper(self.class_).table
+                
         if inherits is not None:
             for key, prop in inherits.props.iteritems():
                 if not self.props.has_key(key):
@@ -678,10 +681,9 @@ class Mapper(object):
         for key, value in self.props.iteritems():
             value.setup(key, statement, **kwargs) 
         return statement
-
         
     def _identity_key(self, row):
-        return objectstore.get_row_key(row, self.class_, self.primarytable, self.pks_by_table[self.table])
+        return objectstore.get_row_key(row, self.class_, self.identitytable, self.pks_by_table[self.table])
 
     def _instance(self, row, imap, result = None, populate_existing = False):
         """pulls an object instance from the given row and appends it to the given result
index a58db251f06e4cb338f611fb6c981f33b934cf3c..72cb447496a230e41690be4d17277a0ade265a1b 100644 (file)
@@ -706,7 +706,7 @@ class EagerLoader(PropertyLoader):
             self.eagersecondary = self.secondaryjoin
             self.eager_order_by = self.order_by
             
-    def setup(self, key, statement, recursion_stack = None, **options):
+    def setup(self, key, statement, recursion_stack = None, eagertable=None, **options):
         """add a left outer join to the statement thats being constructed"""
 
         if recursion_stack is None:
@@ -726,12 +726,19 @@ class EagerLoader(PropertyLoader):
         else:
             towrap = self.parent.table
 
+        if eagertable is not None:
+            eagerprimary = self.eagerprimary.copy_container()
+            aliasizer = Aliasizer(self.parent.table, aliases={self.parent.table:eagertable})
+            eagerprimary.accept_visitor(aliasizer)
+        else:
+            eagerprimary = self.eagerprimary
+                
         if self.secondaryjoin is not None:
-            statement._outerjoin = sql.outerjoin(towrap, self.secondary, self.eagerprimary).outerjoin(self.eagertarget, self.eagersecondary)
+            statement._outerjoin = sql.outerjoin(towrap, self.secondary, eagerprimary).outerjoin(self.eagertarget, self.eagersecondary)
             if self.order_by is False and self.secondary.default_order_by() is not None:
                 statement.order_by(*self.secondary.default_order_by())
         else:
-            statement._outerjoin = towrap.outerjoin(self.eagertarget, self.eagerprimary)
+            statement._outerjoin = towrap.outerjoin(self.eagertarget, eagerprimary)
             if self.order_by is False and self.eagertarget.default_order_by() is not None:
                 statement.order_by(*self.eagertarget.default_order_by())
 
@@ -777,6 +784,7 @@ class EagerLoader(PropertyLoader):
         # the values against the columns of the mapper's original non-aliased table.
         if self.selectalias is not None:
             fakerow = {}
+            fakerow = util.DictDecorator(row)
             for c in self.eagertarget.c:
                 fakerow[c.original] = row[c]
             row = fakerow
index 9e93e995a5eebc1238f9f7cf25d696aab7adc24f..665ab4f537930151686b1e237ecd03e58038f7d5 100644 (file)
@@ -161,7 +161,14 @@ class ThreadLocal(object):
     def __setattr__(self, key, value):
         self._tdict["%d_%s" % (thread.get_ident(), key)] = value
 
-
+class DictDecorator(dict):
+    def __init__(self, decorate):
+        self.decorate = decorate
+    def __getitem__(self, key):
+        try:
+            return dict.__getitem__(self, key)
+        except KeyError:
+            return self.decorate[key]
 class HashSet(object):
     """implements a Set."""
     def __init__(self, iter = None, ordered = False):