diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-09-07 00:01:34 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-09-07 00:01:34 -0400 |
commit | 7950270cf2b12807acd7c330b11dae36e50c3a28 (patch) | |
tree | f1ec50aa6fc604d7a2dadf1b41aff73952a05dcc /test/sql/test_generative.py | |
parent | e80c7cc5c103788a4c7e1c479af2c37cd9c958b3 (diff) | |
download | sqlalchemy-7950270cf2b12807acd7c330b11dae36e50c3a28.tar.gz |
- enhance ClauseAdapter / ColumnAdapter to have new behaviors with labels.
The "anonymize label" logic is now generalized to ClauseAdapter, and takes
place when the anonymize_labels flag is sent, taking effect for all
.columns lookups as well as within traverse() calls against the label
directly.
- traverse() will also memoize what it gets in columns, so that
calling upon traverse() / .columns against the same Label will
produce the same anonymized label. This is so that AliasedClass
produces the same anonymized label when it is accessed per-column
(e.g. SomeAlias.some_column) as well as when it is applied to a Query,
and within column loader strategies (e.g. query(SomeAlias)); the
former uses traverse() while the latter uses .columns
- AliasedClass now calls onto ColumnAdapter
- Query also makes sure to use that same ColumnAdapter from the AliasedClass
in all cases
- update the logic from 0.9 in #1068 to make use of the same
_label_resolve_dict we use for #2992, simplifying how that works
and adding support for new scenarios that were pretty broken
(see #3148, #3188)
Diffstat (limited to 'test/sql/test_generative.py')
-rw-r--r-- | test/sql/test_generative.py | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/test/sql/test_generative.py b/test/sql/test_generative.py index 2e3c4b1e8..1140a1180 100644 --- a/test/sql/test_generative.py +++ b/test/sql/test_generative.py @@ -1207,6 +1207,52 @@ class ClauseAdapterTest(fixtures.TestBase, AssertsCompiledSQL): "WHERE c.bid = anon_1.b_aid" ) + t1 = table("table1", + column("col1"), + column("col2"), + column("col3"), + ) + t2 = table("table2", + column("col1"), + column("col2"), + column("col3"), + ) + + def test_label_anonymize_one(self): + t1a = t1.alias() + adapter = sql_util.ClauseAdapter(t1a, anonymize_labels=True) + + expr = select([t1.c.col2]).where(t1.c.col3 == 5).label('expr') + expr_adapted = adapter.traverse(expr) + + stmt = select([expr, expr_adapted]).order_by(expr, expr_adapted) + self.assert_compile( + stmt, + "SELECT " + "(SELECT table1.col2 FROM table1 WHERE table1.col3 = :col3_1) " + "AS expr, " + "(SELECT table1_1.col2 FROM table1 AS table1_1 " + "WHERE table1_1.col3 = :col3_2) AS anon_1 " + "ORDER BY expr, anon_1" + ) + + def test_label_anonymize_two(self): + t1a = t1.alias() + adapter = sql_util.ClauseAdapter(t1a, anonymize_labels=True) + + expr = select([t1.c.col2]).where(t1.c.col3 == 5).label(None) + expr_adapted = adapter.traverse(expr) + + stmt = select([expr, expr_adapted]).order_by(expr, expr_adapted) + self.assert_compile( + stmt, + "SELECT " + "(SELECT table1.col2 FROM table1 WHERE table1.col3 = :col3_1) " + "AS anon_1, " + "(SELECT table1_1.col2 FROM table1 AS table1_1 " + "WHERE table1_1.col3 = :col3_2) AS anon_2 " + "ORDER BY anon_1, anon_2" + ) class SpliceJoinsTest(fixtures.TestBase, AssertsCompiledSQL): __dialect__ = 'default' |