from sqlalchemy import ForeignKey, Index, Integer, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column, relationship from fooder.domain.base import Base, CommonMixin from fooder.domain.product import Product from fooder.domain.user import User class UserProductUsage(Base, CommonMixin): """Counts how many processed entries a user has for a product. Used to sort products by usage frequency.""" __table_args__ = ( UniqueConstraint("user_id", "product_id"), # Covers outerjoin on (product_id, user_id) in list_for_user Index("ix_userproductusage_product_user", "product_id", "user_id"), ) product_id: Mapped[int] = mapped_column(Integer, ForeignKey("product.id")) product: Mapped[Product] = relationship(lazy="selectin") user_id: Mapped[int] = mapped_column(Integer, ForeignKey("user.id"), index=True) user: Mapped[User] = relationship(lazy="selectin") count: Mapped[int]