]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Another previously unknown feature from 0.6, synonyms
authorMike Bayer <mike_mp@zzzcomputing.com>
Thu, 15 Sep 2011 21:58:01 +0000 (17:58 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 15 Sep 2011 21:58:01 +0000 (17:58 -0400)
    of relationship() can again be passed to join().

CHANGES
lib/sqlalchemy/orm/descriptor_props.py
lib/sqlalchemy/orm/properties.py
lib/sqlalchemy/orm/query.py
lib/sqlalchemy/orm/util.py
test/orm/test_joins.py
test/orm/test_query.py

diff --git a/CHANGES b/CHANGES
index f98071715a1193a1d3f193c3e5d833a05ad1d438..58525eb75a8253a9c0e04436b209d5d9206fee11 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -19,6 +19,9 @@ CHANGES
     in 0.7, can now make a synonym() of a synonym()
     again.
 
+  - Another previously unknown feature from 0.6, synonyms
+    of relationship() can again be passed to join().
+
   - Identity map .discard() uses dict.pop(,None) 
     internally instead of "del" to avoid KeyError/warning 
     during a non-determinate gc teardown [ticket:2267]
index 6385d40e2970e89c4bea2ef921a22f18ba8b94cf..302c374c3cf18b6761b0ef2b3a2a6eb55aa87bdc 100644 (file)
@@ -355,6 +355,10 @@ class SynonymProperty(DescriptorProperty):
     def _proxied_property(self):
         return getattr(self.parent.class_, self.name).property
 
+    @property
+    def _synonym_resolved_property(self):
+        return self._proxied_property
+
     def _comparator_factory(self, mapper):
         prop = self._proxied_property
 
index 1b1eef6d25e8639436b4ebeb16b539a1019db924..813c655fa238c1a50146b9dc1b8407f7fc7e6940 100644 (file)
@@ -266,6 +266,9 @@ class RelationshipProperty(StrategizedProperty):
             self.backref = None
         else:
             self.backref = backref
+    @property
+    def _synonym_resolved_property(self):
+        return self
 
     def instrument_class(self, mapper):
         attributes.register_descriptor(
index 6ef6c3b573773417b8da28f77f62095a420f4692..20c8280d14f84d301d826b25ea7acb7f5d8ea555 100644 (file)
@@ -1582,16 +1582,16 @@ class Query(object):
 
             if isinstance(onclause, interfaces.PropComparator):
                 if right_entity is None:
-                    right_entity = onclause.property.mapper
+                    right_entity = onclause.property._synonym_resolved_property.mapper
                     of_type = getattr(onclause, '_of_type', None)
                     if of_type:
                         right_entity = of_type
                     else:
-                        right_entity = onclause.property.mapper
+                        right_entity = onclause.property._synonym_resolved_property.mapper
 
                 left_entity = onclause.parententity
 
-                prop = onclause.property
+                prop = onclause.property._synonym_resolved_property
                 if not isinstance(onclause,  attributes.QueryableAttribute):
                     onclause = prop
 
index d778bef3d70315c421611e2f98998d090b34ac8b..d7c8b20a2fa41a94595cd208f36de14cb453c78a 100644 (file)
@@ -357,7 +357,7 @@ class _ORMJoin(expression.Join):
 
             if prop:
                 pj, sj, source, dest, \
-                secondary, target_adapter = prop._create_joins(
+                secondary, target_adapter = prop._synonym_resolved_property._create_joins(
                                 source_selectable=adapt_from,
                                 dest_selectable=adapt_to,
                                 source_polymorphic=True,
index 7e47c55bf86b55babc2c7514cfbcc5afd73eee9e..af35912f7951475fab86b358c510d70258ed33db 100644 (file)
@@ -386,6 +386,24 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
             "ON addresses.id = orders.address_id"
         )
 
+    def test_join_on_synonym(self):
+
+        class User(object):
+            pass
+        class Address(object):
+            pass
+        users, addresses = (self.tables.users, self.tables.addresses)
+        mapper(User, users, properties={
+            'addresses':relationship(Address),
+            'ad_syn':synonym("addresses")
+        })
+        mapper(Address, addresses)
+        self.assert_compile(
+            Session().query(User).join(User.ad_syn),
+            "SELECT users.id AS users_id, users.name AS users_name "
+            "FROM users JOIN addresses ON users.id = addresses.user_id"
+        )
+
     def test_multi_tuple_form(self):
         """test the 'tuple' form of join, now superseded by the two-element join() form.
 
index 73298e8dffdd52c8195c07b5d99cf5801bf9b732..ec4a328e0b51bc8fbe6f11dedc08ca1a52bdee3b 100644 (file)
@@ -1793,8 +1793,6 @@ class SynonymTest(QueryTest):
         })
         mapper(Keyword, keywords)
 
-    @testing.fails_if(lambda: True, "0.7 regression, may not support "
-                                "synonyms for relationship")
     def test_joins(self):
         User = self.classes.User