]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
nested query will always use order_by even if distinct is present, added test case...
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 5 Feb 2007 23:16:43 +0000 (23:16 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 5 Feb 2007 23:16:43 +0000 (23:16 +0000)
lib/sqlalchemy/orm/query.py
test/orm/eagertest3.py

index 09863dbab581767a30c7c0e1fe9e8a7ab68e4548..4c0a4b1ecda48c5f55439d5465dcd4917d203738 100644 (file)
@@ -446,7 +446,7 @@ class Query(object):
                 cf = []
                 
             s2 = sql.select(self.table.primary_key + list(cf), whereclause, use_labels=True, from_obj=from_obj, **context.select_args())
-            if not distinct and order_by:
+            if order_by:
                 s2.order_by(*util.to_list(order_by))
             s3 = s2.alias('tbl_row_count')
             crit = s3.primary_key==self.table.primary_key
index e33ce439449b6baf3b4fa9122a38d3b6dcbf23bf..5b498c0c807055c51bf681094b3e675caed8d745 100644 (file)
@@ -266,6 +266,64 @@ class EagerTest3(testbase.ORMTest):
         # assert equality including ordering (may break if the DB "ORDER BY" and python's sort() used differing
         # algorithms and there are repeated 'somedata' values in the list)
         assert verify_result == arb_result
-        
+
+class EagerTest4(testbase.ORMTest):
+    def define_tables(self, metadata):
+        global departments, employees
+        departments = Table('departments', metadata,
+                            Column('department_id', Integer, primary_key=True),
+                            Column('name', String(50)))
+
+        employees = Table('employees', metadata, 
+                          Column('person_id', Integer, primary_key=True),
+                          Column('name', String(50)),
+                          Column('department_id', Integer,
+                                 ForeignKey('departments.department_id')))
+
+    def test_basic(self):
+        class Department(object):
+            def __init__(self, **kwargs):
+                for k, v in kwargs.iteritems():
+                    setattr(self, k, v)
+            def __repr__(self):
+                return "<Department %s>" % (self.name,)
+
+        class Employee(object):
+            def __init__(self, **kwargs):
+                for k, v in kwargs.iteritems():
+                    setattr(self, k, v)
+            def __repr__(self):
+                return "<Employee %s>" % (self.name,)
+
+        mapper(Employee, employees)
+        mapper(Department, departments,
+                      properties=dict(employees=relation(Employee,
+                                                         lazy=False,
+                                                         backref='department')))
+
+        d1 = Department(name='One')
+        for e in 'Jim Jack John Susan'.split():
+            d1.employees.append(Employee(name=e))
+
+        d2 = Department(name='Two')
+        for e in 'Joe Bob Mary Wally'.split():
+            d2.employees.append(Employee(name=e))
+
+        sess = create_session()
+        sess.save(d1)
+        sess.save(d2)
+        sess.flush()
+
+        q = sess.query(Department)
+        filters = [q.join_to('employees'),
+                   Employee.c.name.startswith('J')]
+
+        d = SelectResults(q, and_(*filters), ops=dict(distinct=True))
+        d = d.order_by([desc(Department.c.name)])
+        assert d.count() == 2
+        assert d[0] is d2
+
+
+    
 if __name__ == "__main__":    
     testbase.main()