from __future__ import annotations

from sqlalchemy import ForeignKey
from sqlalchemy import select
from sqlalchemy.orm import aliased
from sqlalchemy.orm import DeclarativeBase
from sqlalchemy.orm import Mapped
from sqlalchemy.orm import mapped_column
from sqlalchemy.orm import relationship
from sqlalchemy.orm import selectinload


class Base(DeclarativeBase):
    pass


class A(Base):
    __tablename__ = "a"

    id: Mapped[int] = mapped_column(primary_key=True)
    data: Mapped[str]
    bs: Mapped[list[B]] = relationship("B")


class B(Base):
    __tablename__ = "b"
    id: Mapped[int] = mapped_column(primary_key=True)
    a_id: Mapped[int] = mapped_column(ForeignKey("a.id"))
    data: Mapped[str]


def test_9669_and() -> None:
    select(A).options(selectinload(A.bs.and_(B.data == "some data")))


def test_9669_of_type() -> None:
    ba = aliased(B)
    select(A).options(selectinload(A.bs.of_type(ba)))

b8f9f03fa33cfb50cdf44c3ab4c9c09f5a08e914
<mask token>


class Base(DeclarativeBase):
    pass


class A(Base):
    __tablename__ = 'a'
    id: Mapped[int] = mapped_column(primary_key=True)
    data: Mapped[str]
    bs: Mapped[list[B]] = relationship('B')


class B(Base):
    __tablename__ = 'b'
    id: Mapped[int] = mapped_column(primary_key=True)
    a_id: Mapped[int] = mapped_column(ForeignKey('a.id'))
    data: Mapped[str]


<mask token>

<mask token>


class Base(DeclarativeBase):
    pass


class A(Base):
    __tablename__ = 'a'
    id: Mapped[int] = mapped_column(primary_key=True)
    data: Mapped[str]
    bs: Mapped[list[B]] = relationship('B')


class B(Base):
    __tablename__ = 'b'
    id: Mapped[int] = mapped_column(primary_key=True)
    a_id: Mapped[int] = mapped_column(ForeignKey('a.id'))
    data: Mapped[str]


def test_9669_and() ->None:
    select(A).options(selectinload(A.bs.and_(B.data == 'some data')))


<mask token>

<mask token>


class Base(DeclarativeBase):
    pass


class A(Base):
    __tablename__ = 'a'
    id: Mapped[int] = mapped_column(primary_key=True)
    data: Mapped[str]
    bs: Mapped[list[B]] = relationship('B')


class B(Base):
    __tablename__ = 'b'
    id: Mapped[int] = mapped_column(primary_key=True)
    a_id: Mapped[int] = mapped_column(ForeignKey('a.id'))
    data: Mapped[str]


def test_9669_and() ->None:
    select(A).options(selectinload(A.bs.and_(B.data == 'some data')))


def test_9669_of_type() ->None:
    ba = aliased(B)
    select(A).options(selectinload(A.bs.of_type(ba)))

from __future__ import annotations
from sqlalchemy import ForeignKey
from sqlalchemy import select
from sqlalchemy.orm import aliased
from sqlalchemy.orm import DeclarativeBase
from sqlalchemy.orm import Mapped
from sqlalchemy.orm import mapped_column
from sqlalchemy.orm import relationship
from sqlalchemy.orm import selectinload


class Base(DeclarativeBase):
    pass


class A(Base):
    __tablename__ = 'a'
    id: Mapped[int] = mapped_column(primary_key=True)
    data: Mapped[str]
    bs: Mapped[list[B]] = relationship('B')


class B(Base):
    __tablename__ = 'b'
    id: Mapped[int] = mapped_column(primary_key=True)
    a_id: Mapped[int] = mapped_column(ForeignKey('a.id'))
    data: Mapped[str]


def test_9669_and() ->None:
    select(A).options(selectinload(A.bs.and_(B.data == 'some data')))


def test_9669_of_type() ->None:
    ba = aliased(B)
    select(A).options(selectinload(A.bs.of_type(ba)))

from __future__ import annotations

from sqlalchemy import ForeignKey
from sqlalchemy import select
from sqlalchemy.orm import aliased
from sqlalchemy.orm import DeclarativeBase
from sqlalchemy.orm import Mapped
from sqlalchemy.orm import mapped_column
from sqlalchemy.orm import relationship
from sqlalchemy.orm import selectinload


class Base(DeclarativeBase):
    pass


class A(Base):
    __tablename__ = "a"

    id: Mapped[int] = mapped_column(primary_key=True)
    data: Mapped[str]
    bs: Mapped[list[B]] = relationship("B")


class B(Base):
    __tablename__ = "b"
    id: Mapped[int] = mapped_column(primary_key=True)
    a_id: Mapped[int] = mapped_column(ForeignKey("a.id"))
    data: Mapped[str]


def test_9669_and() -> None:
    select(A).options(selectinload(A.bs.and_(B.data == "some data")))


def test_9669_of_type() -> None:
    ba = aliased(B)
    select(A).options(selectinload(A.bs.of_type(ba)))
