From 865e2aaa19a1c4597b25c4ac0a090f7f3938bc20 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Mon, 20 Mar 2006 01:16:16 +0000 Subject: [PATCH] a few tweaks and the polymorph example can also use eager loading --- examples/polymorph/polymorph.py | 4 ++-- lib/sqlalchemy/mapping/properties.py | 8 ++++++++ lib/sqlalchemy/sql.py | 1 + 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/examples/polymorph/polymorph.py b/examples/polymorph/polymorph.py index d240a55ac3..804ef4e7a3 100644 --- a/examples/polymorph/polymorph.py +++ b/examples/polymorph/polymorph.py @@ -71,7 +71,7 @@ person_join = select( select( [people, engineers.c.description, column("'engineer'").label('type')], people.c.person_id==engineers.c.person_id)).alias('pjoin') - + # lets print out what this Selectable looks like. The mapper is going to take the selectable and # Select off of it, with the flag "use_labels" which indicates to prefix column names with the table @@ -106,7 +106,7 @@ people_mapper = mapper(Person, person_join, extension=ext) # (translation: it'll work) # TODO: get the eager loading to work (the compound select alias doesnt like being aliased itself) assign_mapper(Company, companies, properties={ - 'employees': relation(people_mapper, private=True) + 'employees': relation(people_mapper, lazy=False, private=True) }) c = Company(name='company1') diff --git a/lib/sqlalchemy/mapping/properties.py b/lib/sqlalchemy/mapping/properties.py index 6b8c137930..6a073f0a6b 100644 --- a/lib/sqlalchemy/mapping/properties.py +++ b/lib/sqlalchemy/mapping/properties.py @@ -785,10 +785,18 @@ class EagerLoader(PropertyLoader): def _instance(self, row, imap, result_list=None): """gets an instance from a row, via this EagerLoader's mapper.""" + # since the EagerLoader makes an Alias of its mapper's table, + # we translate the actual result columns back to what they + # would normally be into a "virtual row" which is passed to the child mapper. + # that way the mapper doesnt have to know about the modified column name + # (neither do any MapperExtensions). The row is keyed off the Column object + # (which is what mappers use) as well as its "label" (which might be what + # user-defined code is using) fakerow = util.DictDecorator(row) for c in self.eagertarget.c: parent = self.target._get_col_by_original(c.original) fakerow[parent] = row[c] + fakerow[parent._label] = row[c] row = fakerow return self.mapper._instance(row, imap, result_list) diff --git a/lib/sqlalchemy/sql.py b/lib/sqlalchemy/sql.py index b88cf18cd0..e87fd3443b 100644 --- a/lib/sqlalchemy/sql.py +++ b/lib/sqlalchemy/sql.py @@ -1040,6 +1040,7 @@ class ColumnClause(ColumnElement): return BindParamClause(self.table.name + "_" + self.text, obj, shortname = self.text, type=self.type) def _make_proxy(self, selectable, name = None): c = ColumnClause(name or self.text, selectable) + c._original = self.original selectable.columns[c.name] = c return c def _compare_type(self, obj): -- 2.47.2