of relationship() can again be passed to join().
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]
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
self.backref = None
else:
self.backref = backref
+ @property
+ def _synonym_resolved_property(self):
+ return self
def instrument_class(self, mapper):
attributes.register_descriptor(
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
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,
"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.
})
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