From: Mike Bayer Date: Mon, 5 Feb 2007 23:16:43 +0000 (+0000) Subject: nested query will always use order_by even if distinct is present, added test case... X-Git-Tag: rel_0_3_5~52 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=54c5a4764233f515f696e667596364666f558473;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git nested query will always use order_by even if distinct is present, added test case to back it up --- diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index 09863dbab5..4c0a4b1ecd 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -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 diff --git a/test/orm/eagertest3.py b/test/orm/eagertest3.py index e33ce43944..5b498c0c80 100644 --- a/test/orm/eagertest3.py +++ b/test/orm/eagertest3.py @@ -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 "" % (self.name,) + + class Employee(object): + def __init__(self, **kwargs): + for k, v in kwargs.iteritems(): + setattr(self, k, v) + def __repr__(self): + return "" % (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()