]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Support method form of any_(), all_()
authorMike Bayer <mike_mp@zzzcomputing.com>
Wed, 27 Sep 2017 14:14:57 +0000 (10:14 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Wed, 27 Sep 2017 19:49:29 +0000 (15:49 -0400)
Fixed bug where the recently added :meth:`.ColumnOperators.any_`
and :meth:`.ColumnOperators.all_` methods didn't work when called
as methods, as opposed to using the standalone functions
:func:`~.expression.any_` and :func:`~.expression.all_`.  Also
added documentation examples for these relatively unintuitive
SQL operators.

Change-Id: I3e56b463e9fd146a077b9970624f50cba27f9811
Fixes: #4093
doc/build/changelog/unreleased_11/4093.rst [new file with mode: 0644]
lib/sqlalchemy/sql/default_comparator.py
lib/sqlalchemy/sql/operators.py
test/sql/test_operators.py

diff --git a/doc/build/changelog/unreleased_11/4093.rst b/doc/build/changelog/unreleased_11/4093.rst
new file mode 100644 (file)
index 0000000..4fba815
--- /dev/null
@@ -0,0 +1,11 @@
+.. change::
+    :tags: bug, sql
+    :tickets: 4093
+    :versions: 1.2.0b3
+
+    Fixed bug where the recently added :meth:`.ColumnOperators.any_`
+    and :meth:`.ColumnOperators.all_` methods didn't work when called
+    as methods, as opposed to using the standalone functions
+    :func:`~.expression.any_` and :func:`~.expression.all_`.  Also
+    added documentation examples for these relatively unintuitive
+    SQL operators.
\ No newline at end of file
index a52bdbaedc83df8b3822828b4dbb1fd148a776b7..7544c9a441cb4d98357211f690b92be556ce5284 100644 (file)
@@ -15,7 +15,7 @@ from .elements import BindParameter, True_, False_, BinaryExpression, \
     Null, _const_expr, _clause_element_as_expr, \
     ClauseList, ColumnElement, TextClause, UnaryExpression, \
     collate, _is_literal, _literal_as_text, ClauseElement, and_, or_, \
-    Slice, Visitable, _literal_as_binds
+    Slice, Visitable, _literal_as_binds, CollectionAggregate
 from .selectable import SelectBase, Alias, Selectable, ScalarSelect
 
 
@@ -265,6 +265,8 @@ operator_lookup = {
     "json_path_getitem_op": (_binary_operate, ),
     "json_getitem_op": (_binary_operate, ),
     "concat_op": (_binary_operate,),
+    "any_op": (_scalar, CollectionAggregate._create_any),
+    "all_op": (_scalar, CollectionAggregate._create_all),
     "lt": (_boolean_compare, operators.ge),
     "le": (_boolean_compare, operators.gt),
     "ne": (_boolean_compare, operators.eq),
index a14afcb702e630b92bf54ed6e99d00689629e6ac..ef6f78929fbfb9e6db024f5b7cbbdfddb6ce933b 100644 (file)
@@ -802,6 +802,22 @@ class ColumnOperators(Operators):
         """Produce a :func:`~.expression.any_` clause against the
         parent object.
 
+        This operator is only appropriate against a scalar subquery
+        object, or for some backends an column expression that is
+        against the ARRAY type, e.g.::
+
+            # postgresql '5 = ANY (somearray)'
+            expr = 5 == mytable.c.somearray.any_()
+
+            # mysql '5 = ANY (SELECT value FROM table)'
+            expr = 5 == select([table.c.value]).as_scalar().any_()
+
+        .. seealso::
+
+            :func:`~.expression.any_` - standalone version
+
+            :func:`~.expression.all_` - ALL operator
+
         .. versionadded:: 1.1
 
         """
@@ -811,6 +827,22 @@ class ColumnOperators(Operators):
         """Produce a :func:`~.expression.all_` clause against the
         parent object.
 
+        This operator is only appropriate against a scalar subquery
+        object, or for some backends an column expression that is
+        against the ARRAY type, e.g.::
+
+            # postgresql '5 = ALL (somearray)'
+            expr = 5 == mytable.c.somearray.all_()
+
+            # mysql '5 = ALL (SELECT value FROM table)'
+            expr = 5 == select([table.c.value]).as_scalar().all_()
+
+        .. seealso::
+
+            :func:`~.expression.all_` - standalone version
+
+            :func:`~.expression.any_` - ANY operator
+
         .. versionadded:: 1.1
 
         """
index 61295467d741ce7d64fd9109b21a2e9a598d8c31..2a11688444eeb855a71df743f5f1f22e24551377 100644 (file)
@@ -2714,6 +2714,15 @@ class AnyAllTest(fixtures.TestBase, testing.AssertsCompiledSQL):
             checkparams={"param_1": 5}
         )
 
+    def test_any_array_method(self):
+        t = self._fixture()
+
+        self.assert_compile(
+            5 == t.c.arrval.any_(),
+            ":param_1 = ANY (tab1.arrval)",
+            checkparams={"param_1": 5}
+        )
+
     def test_all_array(self):
         t = self._fixture()
 
@@ -2723,6 +2732,15 @@ class AnyAllTest(fixtures.TestBase, testing.AssertsCompiledSQL):
             checkparams={"param_1": 5}
         )
 
+    def test_all_array_method(self):
+        t = self._fixture()
+
+        self.assert_compile(
+            5 == t.c.arrval.all_(),
+            ":param_1 = ALL (tab1.arrval)",
+            checkparams={"param_1": 5}
+        )
+
     def test_any_comparator_array(self):
         t = self._fixture()
 
@@ -2831,6 +2849,16 @@ class AnyAllTest(fixtures.TestBase, testing.AssertsCompiledSQL):
             checkparams={'data_1': 10, 'param_1': 5}
         )
 
+    def test_any_subq_method(self):
+        t = self._fixture()
+
+        self.assert_compile(
+            5 == select([t.c.data]).where(t.c.data < 10).as_scalar().any_(),
+            ":param_1 = ANY (SELECT tab1.data "
+            "FROM tab1 WHERE tab1.data < :data_1)",
+            checkparams={'data_1': 10, 'param_1': 5}
+        )
+
     def test_all_subq(self):
         t = self._fixture()
 
@@ -2840,3 +2868,13 @@ class AnyAllTest(fixtures.TestBase, testing.AssertsCompiledSQL):
             "FROM tab1 WHERE tab1.data < :data_1)",
             checkparams={'data_1': 10, 'param_1': 5}
         )
+
+    def test_all_subq_method(self):
+        t = self._fixture()
+
+        self.assert_compile(
+            5 == select([t.c.data]).where(t.c.data < 10).as_scalar().all_(),
+            ":param_1 = ALL (SELECT tab1.data "
+            "FROM tab1 WHERE tab1.data < :data_1)",
+            checkparams={'data_1': 10, 'param_1': 5}
+        )