diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2005-11-15 03:53:27 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2005-11-15 03:53:27 +0000 |
commit | cc6345d7842d9ca91e770cb982051ae598824437 (patch) | |
tree | be214c68451fdb4e2cebcd0781c599be698283b4 /lib/sqlalchemy/mapper.py | |
parent | c541c080234584618e89882a3d8d5048cde6105c (diff) | |
download | sqlalchemy-cc6345d7842d9ca91e770cb982051ae598824437.tar.gz |
tweak to lazy loading a right-direction
Diffstat (limited to 'lib/sqlalchemy/mapper.py')
-rw-r--r-- | lib/sqlalchemy/mapper.py | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/lib/sqlalchemy/mapper.py b/lib/sqlalchemy/mapper.py index 12c928979..b493b7522 100644 --- a/lib/sqlalchemy/mapper.py +++ b/lib/sqlalchemy/mapper.py @@ -980,7 +980,7 @@ class PropertyLoader(MapperProperty): class LazyLoader(PropertyLoader): def init(self, key, parent): PropertyLoader.init(self, key, parent) - (self.lazywhere, self.lazybinds) = create_lazy_clause(self.parent.table, self.primaryjoin, self.secondaryjoin, self.foreignkey) + (self.lazywhere, self.lazybinds) = create_lazy_clause(self.parent.table, self.primaryjoin, self.secondaryjoin, self.foreignkey, self.direction) def _set_class_attribute(self, class_, key): objectstore.uow().register_attribute(class_, key, uselist = self.uselist, deleteremoved = self.private, create_prop=lambda i: self.setup_loader(i)) @@ -992,8 +992,8 @@ class LazyLoader(PropertyLoader): #print "setting up loader, lazywhere", str(self.lazywhere) for col, bind in self.lazybinds.iteritems(): if self.direction == PropertyLoader.RIGHT: - params[bind.key] = self.mapper._getattrbycolumn(instance, col) - #print "getting attr", col.table.name + "." + col.key, "off instance", repr(instance), "and its", params[bind.key] + params[bind.key] = self.parent._getattrbycolumn(instance, col) + print "getting attr", col.table.name + "." + col.key, "off instance", repr(instance), "and its", params[bind.key] else: params[bind.key] = self.parent._getattrbycolumn(instance, col) if params[bind.key] is None: @@ -1024,19 +1024,26 @@ class LazyLoader(PropertyLoader): # objectstore.uow().register_callable(instance, self.key, lazyload, uselist=self.uselist, deleteremoved = self.private) # self.setup_loader(instance) -def create_lazy_clause(table, primaryjoin, secondaryjoin, foreignkey): +def create_lazy_clause(table, primaryjoin, secondaryjoin, foreignkey, direction): binds = {} def visit_binary(binary): + #print "LEFT", binary.left.table.name, binary.left.key, "RIGHT", binary.right.table.name, binary.right.key, "FKEY", foreignkey.table.name, foreignkey.key circular = binary.left.table is binary.right.table if isinstance(binary.left, schema.Column) and ((not circular and binary.left.table is table) or foreignkey is binary.right): -# binary.left = binds.setdefault(table.name + "_" + binary.left.name, - binary.left = binds.setdefault(binary.left, + if direction == PropertyLoader.RIGHT: + key = binary.right + else: + key = binary.left + binary.left = binds.setdefault(key, sql.BindParamClause(table.name + "_" + binary.left.name, None, shortname = binary.left.name)) binary.swap() if isinstance(binary.right, schema.Column) and ((not circular and binary.right.table is table) or foreignkey is binary.left): -# binary.right = binds.setdefault(table.name + "_" + binary.right.name, - binary.right = binds.setdefault(binary.right, + if direction == PropertyLoader.RIGHT: + key = binary.left + else: + key = binary.right + binary.right = binds.setdefault(key, sql.BindParamClause(table.name + "_" + binary.right.name, None, shortname = binary.right.name)) if secondaryjoin is not None: |