The Pagination class is a tool for managing paginated rows from the database.
It can be imported from fluid.db
:
from fluid.db import Pagination, Search
Bases: NamedTuple
create(
*order_by_fields,
cursor="",
limit=0,
filters=None,
search=None,
desc=False
)
Source code in fluid/db/pagination.py
| @classmethod
def create(
cls,
*order_by_fields: str,
cursor: str = "",
limit: int = 0,
filters: dict[str, Any] | None = None,
search: Search | None = None,
desc: bool = False,
) -> Pagination:
if limit < 0:
raise ValidationError("limit must be greater than or equal to 0")
if cursor:
if limit > 0:
raise ValidationError("limit cannot be provided with cursor")
if filters:
raise ValidationError("filters cannot be provided with cursor")
if search and search.search_text:
raise ValidationError("search text cannot be provided with cursor")
decoded_cursor = Cursor.decode(cursor, order_by_fields)
limit = decoded_cursor.limit
filters = decoded_cursor.filters
if search:
search = search._replace(search_text=decoded_cursor.search_text)
else:
decoded_cursor = None
limit = min(
limit or settings.DEFAULT_PAGINATION_LIMIT,
settings.DEFAULT_PAGINATION_MAX_LIMIT,
)
return cls(
order_by_fields=order_by_fields,
cursor=decoded_cursor,
limit=limit,
filters=filters or {},
search=search,
desc=desc,
)
|
execute(db, table, *, conn=None)
Source code in fluid/db/pagination.py
| async def execute(
self,
db: CrudDB,
table: FromClause,
*,
conn: AsyncConnection | None = None,
) -> tuple[Sequence[Row], str]:
sql_query = self.query(db, table)
async with db.ensure_connection(conn) as conn:
result = await conn.execute(sql_query)
data = result.all()
cursor = ""
if len(data) > self.limit:
cursor = self._encode_cursor(data[-1])
data = data[:-1]
return data, cursor
|
Source code in fluid/db/pagination.py
| def query(self, db: CrudDB, table: FromClause) -> Select:
sql_query = cast(
Select,
db.get_query(table, table.select(), params=self.filters),
)
if self.search:
sql_query = db.search_query(
table,
sql_query,
self.search.search_fields,
self.search.search_text,
)
start_clause = self._start_clause(table)
if start_clause is not None:
sql_query = sql_query.where(start_clause)
columns = db.order_by_columns(table, self.order_by_fields_sign)
return sql_query.order_by(*columns).limit(self.limit + 1)
|
fluid.db.Search
Bases: NamedTuple
search_fields
instance-attribute
search_text
instance-attribute