zulip/zerver/lib/query_helpers.py

31 lines
788 B
Python

from typing import TypeVar
from django.db import models
from django.db.models import QuerySet
ModelT = TypeVar("ModelT", bound=models.Model)
RowT = TypeVar("RowT")
def query_for_ids(
query: QuerySet[ModelT, RowT],
user_ids: list[int],
field: str,
) -> QuerySet[ModelT, RowT]:
"""
This function optimizes searches of the form
`user_profile_id in (1, 2, 3, 4)` by quickly
building the where clauses. Profiling shows significant
speedups over the normal Django-based approach.
Use this very carefully! Also, the caller should
guard against empty lists of user_ids.
"""
assert user_ids
clause = f"{field} IN %s"
query = query.extra( # noqa: S610
where=[clause],
params=(tuple(user_ids),),
)
return query