diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2009-02-13 17:14:05 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2009-02-13 17:14:05 +0000 |
commit | f180cc0c9fe7b8cc470c8051a1201a8a86c8b32b (patch) | |
tree | 3b3a76c5cea635c772f1364a3ee68dd64814fc8b /lib/sqlalchemy | |
parent | 2d6b3f09eb642915bf4618e78815e701dcabf592 (diff) | |
download | sqlalchemy-f180cc0c9fe7b8cc470c8051a1201a8a86c8b32b.tar.gz |
- Fixed bugs in Query regarding simultaneous selection of
multiple joined-table inheritance entities with common base
classes, previously the adaption applied to "e2" on
"e1 JOIN e2" would be partially applied to "e1". Additionally,
comparisons on relations (i.e. Entity2.related==e2)
were not getting adapted correctly.
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r-- | lib/sqlalchemy/orm/properties.py | 4 | ||||
-rw-r--r-- | lib/sqlalchemy/orm/query.py | 7 |
2 files changed, 5 insertions, 6 deletions
diff --git a/lib/sqlalchemy/orm/properties.py b/lib/sqlalchemy/orm/properties.py index d5857d965..42c3bffa3 100644 --- a/lib/sqlalchemy/orm/properties.py +++ b/lib/sqlalchemy/orm/properties.py @@ -485,11 +485,11 @@ class RelationProperty(StrategizedProperty): if self.property.direction in [ONETOMANY, MANYTOMANY]: return ~self._criterion_exists() else: - return self.property._optimized_compare(None, adapt_source=self.adapter) + return _orm_annotate(self.property._optimized_compare(None, adapt_source=self.adapter)) elif self.property.uselist: raise sa_exc.InvalidRequestError("Can't compare a collection to an object or collection; use contains() to test for membership.") else: - return self.property._optimized_compare(other, adapt_source=self.adapter) + return _orm_annotate(self.property._optimized_compare(other, adapt_source=self.adapter)) def _criterion_exists(self, criterion=None, **kwargs): if getattr(self, '_of_type', None): diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index b2c68faa2..5bef348a1 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -127,6 +127,7 @@ class Query(object): def __mapper_loads_polymorphically_with(self, mapper, adapter): for m2 in mapper._with_polymorphic_mappers: + self._polymorphic_adapters[m2] = adapter for m in m2.iterate_to_root(): self._polymorphic_adapters[m.mapped_table] = self._polymorphic_adapters[m.local_table] = adapter @@ -145,6 +146,7 @@ class Query(object): def _reset_polymorphic_adapter(self, mapper): for m2 in mapper._with_polymorphic_mappers: + self._polymorphic_adapters.pop(m2, None) for m in m2.iterate_to_root(): self._polymorphic_adapters.pop(m.mapped_table, None) self._polymorphic_adapters.pop(m.local_table, None) @@ -1892,10 +1894,7 @@ class _MapperEntity(_QueryEntity): adapter = None if not self.is_aliased_class and query._polymorphic_adapters: - for mapper in self.mapper.iterate_to_root(): - adapter = query._polymorphic_adapters.get(mapper.mapped_table, None) - if adapter: - break + adapter = query._polymorphic_adapters.get(self.mapper, None) if not adapter and self.adapter: adapter = self.adapter |