Skip to content

Commit

Permalink
- re-merge + CHANGES
Browse files Browse the repository at this point in the history
  • Loading branch information
zzzeek committed Apr 23, 2012
2 parents ff0fb31 + 8b16cd8 commit 8f35f7a
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 5 deletions.
1 change: 1 addition & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ Major contributing authors include:
- Michael Bayer <[email protected]>
- Jason Kirtland <[email protected]>
- Gaetan de Menten <[email protected]>
- Diana Clarke <[email protected]>
- Michael Trier <[email protected]>
- Philip Jenvey <[email protected]>
- Ants Aasma <[email protected]>
Expand Down
9 changes: 9 additions & 0 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,15 @@ those which apply to an 0.7 release are noted.
approach can be upgraded to this new
approach. [ticket:1401]

- [feature] Query now "auto correlates" by
default in the same way as select() does.
Previously, a Query used as a subquery
in another would require the correlate()
method be called explicitly in order to
correlate a table on the inside to the
outside. As always, correlate(None)
disables correlation. [ticket:2179]

- [feature] Added prefix_with() method
to Query, calls upon select().prefix_with()
to allow placement of MySQL SELECT
Expand Down
2 changes: 0 additions & 2 deletions lib/sqlalchemy/orm/query.py
Original file line number Diff line number Diff line change
Expand Up @@ -2907,7 +2907,6 @@ def _compile_context(self, labels=True):
context.whereclause,
from_obj=froms,
use_labels=labels,
correlate=False,
# TODO: this order_by is only needed if
# LIMIT/OFFSET is present in self._select_args,
# else the application on the outside is enough
Expand Down Expand Up @@ -2973,7 +2972,6 @@ def _compile_context(self, labels=True):
from_obj=froms,
use_labels=labels,
for_update=for_update,
correlate=False,
order_by=context.order_by,
**self._select_args
)
Expand Down
2 changes: 1 addition & 1 deletion lib/sqlalchemy/orm/strategies.py
Original file line number Diff line number Diff line change
Expand Up @@ -749,7 +749,7 @@ def _generate_from_original_query(self,
):
# reformat the original query
# to look only for significant columns
q = orig_query._clone()
q = orig_query._clone().correlate(None)

# TODO: why does polymporphic etc. require hardcoding
# into _adapt_col_list ? Does query.add_columns(...) work
Expand Down
82 changes: 80 additions & 2 deletions test/orm/test_froms.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,85 @@ def setup_mappers(cls):
configure_mappers()


class QueryCorrelatesLikeSelect(QueryTest, AssertsCompiledSQL):

query_correlated = "SELECT users.name AS users_name, " \
"(SELECT count(addresses.id) AS count_1 FROM addresses " \
"WHERE addresses.user_id = users.id) AS anon_1 FROM users"

query_not_correlated = "SELECT users.name AS users_name, " \
"(SELECT count(addresses.id) AS count_1 FROM addresses, users " \
"WHERE addresses.user_id = users.id) AS anon_1 FROM users"

def test_as_scalar_select_auto_correlate(self):
addresses, users = self.tables.addresses, self.tables.users
query = select(
[func.count(addresses.c.id)],
addresses.c.user_id==users.c.id
).as_scalar()
query = select([users.c.name.label('users_name'), query])
self.assert_compile(query, self.query_correlated,
dialect=default.DefaultDialect()
)

def test_as_scalar_select_explicit_correlate(self):
addresses, users = self.tables.addresses, self.tables.users
query = select(
[func.count(addresses.c.id)],
addresses.c.user_id==users.c.id
).correlate(users).as_scalar()
query = select([users.c.name.label('users_name'), query])
self.assert_compile(query, self.query_correlated,
dialect=default.DefaultDialect()
)

def test_as_scalar_select_correlate_off(self):
addresses, users = self.tables.addresses, self.tables.users
query = select(
[func.count(addresses.c.id)],
addresses.c.user_id==users.c.id
).correlate(None).as_scalar()
query = select([ users.c.name.label('users_name'), query])
self.assert_compile(query, self.query_not_correlated,
dialect=default.DefaultDialect()
)

def test_as_scalar_query_auto_correlate(self):
sess = create_session()
Address, User = self.classes.Address, self.classes.User
query = sess.query(func.count(Address.id))\
.filter(Address.user_id==User.id)\
.as_scalar()
query = sess.query(User.name, query)
self.assert_compile(query, self.query_correlated,
dialect=default.DefaultDialect()
)

def test_as_scalar_query_explicit_correlate(self):
sess = create_session()
Address, User = self.classes.Address, self.classes.User
query = sess.query(func.count(Address.id))\
.filter(Address.user_id==User.id)\
.correlate(self.tables.users)\
.as_scalar()
query = sess.query(User.name, query)
self.assert_compile(query, self.query_correlated,
dialect=default.DefaultDialect()
)

def test_as_scalar_query_correlate_off(self):
sess = create_session()
Address, User = self.classes.Address, self.classes.User
query = sess.query(func.count(Address.id))\
.filter(Address.user_id==User.id)\
.correlate(None)\
.as_scalar()
query = sess.query(User.name, query)
self.assert_compile(query, self.query_not_correlated,
dialect=default.DefaultDialect()
)


class RawSelectTest(QueryTest, AssertsCompiledSQL):
"""compare a bunch of select() tests with the equivalent Query using straight table/columns.
Expand All @@ -90,10 +169,9 @@ def test_select(self):
)

# a little tedious here, adding labels to work around Query's auto-labelling.
# also correlate needed explicitly. hmmm.....
# TODO: can we detect only one table in the "froms" and then turn off use_labels ?
s = sess.query(addresses.c.id.label('id'), addresses.c.email_address.label('email')).\
filter(addresses.c.user_id==users.c.id).correlate(users).statement.alias()
filter(addresses.c.user_id==users.c.id).statement.alias()

self.assert_compile(sess.query(users, s.c.email).select_from(users.join(s, s.c.id==users.c.id)).with_labels().statement,
"SELECT users.id AS users_id, users.name AS users_name, anon_1.email AS anon_1_email "
Expand Down

0 comments on commit 8f35f7a

Please sign in to comment.