Improve typing to accept labels in ordey_by mand group_by.
Change-Id: I33e5d6f64633d39a220108d412ef84d6478b25e6
from ..engine.result import FrozenResult
from ..engine.result import ScalarResult
from ..sql._typing import _ColumnExpressionArgument
+ from ..sql._typing import _ColumnExpressionOrStrLabelArgument
from ..sql._typing import _ColumnsClauseArgument
from ..sql._typing import _DMLColumnArgument
from ..sql._typing import _JoinTargetArgument
def order_by(
self: SelfQuery,
__first: Union[
- Literal[None, False, _NoArg.NO_ARG], _ColumnExpressionArgument[Any]
+ Literal[None, False, _NoArg.NO_ARG],
+ _ColumnExpressionOrStrLabelArgument[Any],
] = _NoArg.NO_ARG,
- *clauses: _ColumnExpressionArgument[Any],
+ *clauses: _ColumnExpressionOrStrLabelArgument[Any],
) -> SelfQuery:
"""Apply one or more ORDER BY criteria to the query and return
the newly resulting :class:`_query.Query`.
def group_by(
self: SelfQuery,
__first: Union[
- Literal[None, False, _NoArg.NO_ARG], _ColumnExpressionArgument[Any]
+ Literal[None, False, _NoArg.NO_ARG],
+ _ColumnExpressionOrStrLabelArgument[Any],
] = _NoArg.NO_ARG,
- *clauses: _ColumnExpressionArgument[Any],
+ *clauses: _ColumnExpressionOrStrLabelArgument[Any],
) -> SelfQuery:
"""Apply one or more GROUP BY criterion to the query and return
the newly resulting :class:`_query.Query`.
if typing.TYPE_CHECKING:
from ._typing import _ColumnExpressionArgument
from ._typing import _ColumnExpressionOrLiteralArgument
+ from ._typing import _ColumnExpressionOrStrLabelArgument
from ._typing import _TypeEngineArgument
from .elements import BinaryExpression
from .selectable import FromClause
return CollectionAggregate._create_any(expr)
-def asc(column: _ColumnExpressionArgument[_T]) -> UnaryExpression[_T]:
+def asc(
+ column: _ColumnExpressionOrStrLabelArgument[_T],
+) -> UnaryExpression[_T]:
"""Produce an ascending ``ORDER BY`` clause element.
e.g.::
return ColumnClause(text, type_, is_literal, _selectable)
-def desc(column: _ColumnExpressionArgument[_T]) -> UnaryExpression[_T]:
+def desc(
+ column: _ColumnExpressionOrStrLabelArgument[_T],
+) -> UnaryExpression[_T]:
"""Produce a descending ``ORDER BY`` clause element.
e.g.::
_ColumnExpressionOrLiteralArgument = Union[Any, _ColumnExpressionArgument[_T]]
+_ColumnExpressionOrStrLabelArgument = Union[str, _ColumnExpressionArgument[_T]]
+
_InfoType = Dict[Any, Any]
"""the .info dictionary accepted and used throughout Core /ORM"""
if typing.TYPE_CHECKING:
from ._typing import _ColumnExpressionArgument
+ from ._typing import _ColumnExpressionOrStrLabelArgument
from ._typing import _InfoType
from ._typing import _PropagateAttrsType
from ._typing import _TypeEngineArgument
@classmethod
def _create_desc(
- cls, column: _ColumnExpressionArgument[_T]
+ cls, column: _ColumnExpressionOrStrLabelArgument[_T]
) -> UnaryExpression[_T]:
return UnaryExpression(
coercions.expect(roles.ByOfRole, column),
@classmethod
def _create_asc(
cls,
- column: _ColumnExpressionArgument[_T],
+ column: _ColumnExpressionOrStrLabelArgument[_T],
) -> UnaryExpression[_T]:
return UnaryExpression(
coercions.expect(roles.ByOfRole, column),
if TYPE_CHECKING:
from ._typing import _ColumnExpressionArgument
+ from ._typing import _ColumnExpressionOrStrLabelArgument
from ._typing import _FromClauseArgument
from ._typing import _JoinTargetArgument
from ._typing import _MAYBE_ENTITY
def order_by(
self: SelfGenerativeSelect,
__first: Union[
- Literal[None, _NoArg.NO_ARG], _ColumnExpressionArgument[Any]
+ Literal[None, _NoArg.NO_ARG],
+ _ColumnExpressionOrStrLabelArgument[Any],
] = _NoArg.NO_ARG,
- *clauses: _ColumnExpressionArgument[Any],
+ *clauses: _ColumnExpressionOrStrLabelArgument[Any],
) -> SelfGenerativeSelect:
r"""Return a new selectable with the given list of ORDER BY
criteria applied.
def group_by(
self: SelfGenerativeSelect,
__first: Union[
- Literal[None, _NoArg.NO_ARG], _ColumnExpressionArgument[Any]
+ Literal[None, _NoArg.NO_ARG],
+ _ColumnExpressionOrStrLabelArgument[Any],
] = _NoArg.NO_ARG,
- *clauses: _ColumnExpressionArgument[Any],
+ *clauses: _ColumnExpressionOrStrLabelArgument[Any],
) -> SelfGenerativeSelect:
r"""Return a new selectable with the given list of GROUP BY
criterion applied.
from __future__ import annotations
+from sqlalchemy import asc
from sqlalchemy import Column
+from sqlalchemy import desc
from sqlalchemy import Integer
from sqlalchemy import MetaData
from sqlalchemy import select
from sqlalchemy.orm import DeclarativeBase
from sqlalchemy.orm import Mapped
from sqlalchemy.orm import mapped_column
+from sqlalchemy.orm import Session
class Base(DeclarativeBase):
stmt = stmt.where(e2)
+stmt2 = select(User.id).order_by("email").group_by("email")
+stmt2 = select(User.id).order_by("id", "email").group_by("email", "id")
+stmt2 = (
+ select(User.id).order_by(asc("id"), desc("email")).group_by("email", "id")
+)
+# EXPECTED_TYPE: Select[Tuple[int]]
+reveal_type(stmt2)
+
+stmt2 = select(User.id).order_by(User.id).group_by(User.email)
+stmt2 = (
+ select(User.id).order_by(User.id, User.email).group_by(User.email, User.id)
+)
+# EXPECTED_TYPE: Select[Tuple[int]]
+reveal_type(stmt2)
+
receives_str_col_expr(User.email)
receives_str_col_expr(User.email + "some expr")
receives_bool_col_expr(e2)
receives_bool_col_expr(e2.label("x"))
receives_bool_col_expr(user_table.c.email == "x")
+
+
+# query
+
+q1 = Session().query(User.id).order_by("email").group_by("email")
+q1 = Session().query(User.id).order_by("id", "email").group_by("email", "id")
+# EXPECTED_TYPE: RowReturningQuery[Tuple[int]]
+reveal_type(q1)
+
+q1 = Session().query(User.id).order_by(User.id).group_by(User.email)
+q1 = (
+ Session()
+ .query(User.id)
+ .order_by(User.id, User.email)
+ .group_by(User.email, User.id)
+)
+# EXPECTED_TYPE: RowReturningQuery[Tuple[int]]
+reveal_type(q1)