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
except:
raise AttributeError
def keys(self):
+ print "KEYS", self.__parent.keys
return self.__parent.keys
def values(self):
return list(self)
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):
):
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):
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
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:
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())
# 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
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):