]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
(no commit message)
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 16 Jul 2005 22:21:53 +0000 (22:21 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 16 Jul 2005 22:21:53 +0000 (22:21 +0000)
lib/sqlalchemy/ansisql.py
lib/sqlalchemy/databases/oracle.py
lib/sqlalchemy/engine.py
lib/sqlalchemy/mapper.py
lib/sqlalchemy/sql.py
test/mapper.py
test/select.py

index dac1b0e7680e437c2435b1d271e7bcf802fb04fc..e269e7efd7eda8289f0c702c028595c9fe02e2a2 100644 (file)
@@ -190,7 +190,8 @@ class ANSICompiler(sql.Compiled):
         else:
             self.froms[join] = (self.get_from_text(join.left) + " JOIN " + self.get_from_text(join.right) + 
             " ON " + self.get_str(join.onclause))
-
+            
+            
     def visit_insert(self, insert_stmt):
         colparams = insert_stmt.get_colparams(self.bindparams)
 
index 861b80b0e47f0295f61cded886dad56a662da3e1..7f76fa2d639708b71d10161fa3832804a2d39806 100644 (file)
@@ -32,8 +32,8 @@ class OracleSQLEngine(ansisql.ANSISQLEngine):
         self._use_ansi = use_ansi
         ansisql.ANSISQLEngine.__init__(self, **params)
         
-    def compile(self, statement):
-        compiler = OracleCompiler(statement, use_ansi = self._use_ansi)
+    def compile(self, statement, bindparams = None):
+        compiler = OracleCompiler(statement, bindparams, use_ansi = self._use_ansi)
         
         statement.accept_visitor(compiler)
         return compiler
@@ -45,10 +45,10 @@ class OracleCompiler(ansisql.ANSICompiler):
     """oracle compiler modifies the lexical structure of Select statements to work under 
     non-ANSI configured Oracle databases, if the use_ansi flag is False."""
     
-    def __init__(self, parent, use_ansi = True):
+    def __init__(self, parent, bindparams, use_ansi = True):
         self._outertable = None
         self._use_ansi = use_ansi
-        ansisql.ANSICompiler.__init__(self, parent)
+        ansisql.ANSICompiler.__init__(self, parent, bindparams)
         
     def visit_join(self, join):
         if self._use_ansi:
index b81e6c3d0460c76459bb00b118a586d4b2751205..0814caf5738f78bd46b4e0ffe85ca382c92e33aa 100644 (file)
@@ -71,7 +71,7 @@ class SQLEngine(schema.SchemaEngine):
     def dbapi(self):
         raise NotImplementedError()
 
-    def compile(self, statement):
+    def compile(self, statement, bindparams):
         raise NotImplementedError()
 
     def proxy(self):
index 2e8252aa5a0b5045a134f7a0d9637ef20ba0a13c..36f131745373fd2f84fd51cb077c3090eea7a2d2 100644 (file)
@@ -102,8 +102,8 @@ class Mapper(object):
 
     def _select_whereclause(self, whereclause = None, **params):
         statement = sql.select([self.table], whereclause)
-        for value in self.props.values():
-            value.setup(self.table, statement) 
+        for key, value in self.props.iteritems():
+            value.setup(key, self.table, statement) 
         return self._select_statement(statement, **params)
     
     def _select_statement(self, statement, **params):
@@ -123,7 +123,7 @@ class Mapper(object):
 class MapperProperty:
     def execute(self, instance, key, row, isduplicate):
         raise NotImplementedError()
-    def setup(self, primarytable, statement):
+    def setup(self, key, primarytable, statement):
         pass
 
 class ColumnProperty(MapperProperty):
@@ -138,13 +138,14 @@ class EagerLoader(MapperProperty):
     def __init__(self, mapper, whereclause):
         self.mapper = mapper
         self.whereclause = whereclause
-    def setup(self, primarytable, statement):
+    def setup(self, key, primarytable, statement):
+        targettable = self.mapper.table
         if hasattr(statement, '_outerjoin'):
-            statement._outerjoin.right = sql.outerjoin(primarytable, self.mapper.table, self.whereclause)
+            statement._outerjoin = sql.outerjoin(statement._outerjoin, targettable, self.whereclause)
         else:
-            statement._outerjoin = sql.outerjoin(primarytable, self.mapper.table, self.whereclause)
-            statement.append_from(statement._outerjoin)
-        statement.append_column(self.mapper.table)
+            statement._outerjoin = sql.outerjoin(primarytable, targettable, self.whereclause)
+        statement.append_from(statement._outerjoin)
+        statement.append_column(targettable)
     def execute(self, instance, key, row, isduplicate):
         try:
             list = getattr(instance, key)
index 2d9d26e9510a2ff9ef0ae0a474323c946cdd8a35..071a6185ce5708bd549e0bf43f0f86059e8048f9 100644 (file)
@@ -279,6 +279,9 @@ class Join(Selectable):
         self.onclause = onclause
         self.isouter = isouter
     
+    def add_join(self, join):
+        pass
+        
     def select(self, whereclauses = None, **params):
         return select([self.left, self.right], and_(self.onclause, whereclauses), **params)
     
@@ -287,13 +290,15 @@ class Join(Selectable):
         self.right.accept_visitor(visitor)
         self.onclause.accept_visitor(visitor)
         visitor.visit_join(self)
-
+            
     def _engine(self):
         return self.left._engine() or self.right._engine()
         
     def _get_from_objects(self):
-        return [self, FromClause(from_key = self.left.id), FromClause(from_key = self.right.id)]
-
+        result = [self] + [FromClause(from_key = c.id) for c in self.left._get_from_objects() + self.right._get_from_objects()]
+        print repr([c.id for c in result])
+        return result
+        
 class Alias(Selectable):
     def __init__(self, selectable, alias):
         self.selectable = selectable
@@ -304,6 +309,8 @@ class Alias(Selectable):
         for co in selectable.columns:
             co._make_proxy(self)
 
+    primary_keys = property (lambda self: [c for c in self.columns if c.primary_key])
+    
     def accept_visitor(self, visitor):
         self.selectable.accept_visitor(visitor)
         visitor.visit_alias(self)
index 1391aee24085b4ffd5decf0a97da62191898c548..23d01baac4fbf509669bcf73c34065417d29997c 100644 (file)
@@ -77,8 +77,8 @@ class MapperTest(PersistTest):
         print repr(l)
 
     def testmultieager(self):
-        openorders = alias(self.orders, 'open')
-        closedorders = alias(self.orders, 'closed')
+        openorders = alias(self.orders, 'openorders')
+        closedorders = alias(self.orders, 'closedorders')
         m = mapper.Mapper(User, self.users, properties = dict(
             orders_open = mapper.EagerLoader(mapper.Mapper(Order, openorders), and_(openorders.c.isopen == 1, self.users.c.user_id==openorders.c.user_id)),
             orders_closed = mapper.EagerLoader(mapper.Mapper(Order, closedorders), and_(closedorders.c.isopen == 0, self.users.c.user_id==closedorders.c.user_id))
@@ -91,7 +91,7 @@ class MapperTest(PersistTest):
         self.users.drop()
         self.addresses.drop()
         self.orders.drop()
-        
+       pass    
         
 if __name__ == "__main__":
     unittest.main()        
index 6bdf43167f8a57bf194c0499134fced794f18cce..d1ea2cd8ec8f919e0f5f663385e096bf6b28e9dc 100644 (file)
@@ -207,19 +207,23 @@ FROM myothertable, mytable WHERE mytable.myid = myothertable.otherid"
                 [self.table],
                 from_obj = [join(self.table, self.table2, self.table.c.id == self.table2.c.id)]
             ),
-        "SELECT mytable.myid, mytable.name, mytable.description FROM (mytable JOIN myothertable ON mytable.myid = myothertable.otherid)")
+        "SELECT mytable.myid, mytable.name, mytable.description FROM mytable JOIN myothertable ON mytable.myid = myothertable.otherid")
         
         self.runtest(
             select(
-                [join(self.table, join(self.table2, self.table3, self.table2.c.id == self.table3.c.id), self.table.c.id == self.table2.c.id),
-                
+                [join(join(self.table, self.table2, self.table.c.id == self.table2.c.id), self.table3, self.table.c.id == self.table3.c.id)
             ]),
-            "SELECT mytable.myid, mytable.name, mytable.description, myothertable.otherid, \
-myothertable.othername, thirdtable.userid, thirdtable.otherstuff FROM \
-(mytable JOIN (myothertable JOIN thirdtable ON myothertable.otherid = thirdtable.userid) ON mytable.myid = myothertable.otherid)"
+            "SELECT mytable.myid, mytable.name, mytable.description, myothertable.otherid, myothertable.othername, thirdtable.userid, thirdtable.otherstuff FROM mytable JOIN myothertable ON mytable.myid = myothertable.otherid JOIN thirdtable ON mytable.myid = thirdtable.userid"
         )
         
-        
+    def testmultijoin(self):
+        self.runtest(
+                select([self.table, self.table2, self.table3],
+                from_obj = [outerjoin(join(self.table, self.table2, self.table.c.id == self.table2.c.id), self.table3, self.table.c.id==self.table3.c.id)]
+                )
+                ,"SELECT mytable.myid, mytable.name, mytable.description, myothertable.otherid, myothertable.othername, thirdtable.userid, thirdtable.otherstuff FROM mytable JOIN myothertable ON mytable.myid = myothertable.otherid LEFT OUTER JOIN thirdtable ON mytable.myid = thirdtable.userid"
+            )
+            
     def testunion(self):
             x = union(
                   select([self.table], self.table.c.id == 5),
@@ -263,7 +267,7 @@ FROM myothertable UNION SELECT thirdtable.userid, thirdtable.otherstuff FROM thi
                 
         self.runtest(query, 
             "SELECT mytable.myid, mytable.name, mytable.description, myothertable.otherid, myothertable.othername \
-FROM (mytable LEFT OUTER JOIN myothertable ON mytable.myid = myothertable.otherid) \
+FROM mytable LEFT OUTER JOIN myothertable ON mytable.myid = myothertable.otherid \
 WHERE mytable.name = :mytable_name AND mytable.myid = :mytable_myid AND \
 myothertable.othername != :myothertable_othername AND \
 EXISTS (select yay from foo where boo = lar)",