mirror of
https://github.com/csunny/DB-GPT.git
synced 2025-07-27 05:47:47 +00:00
44 lines
1.5 KiB
Python
44 lines
1.5 KiB
Python
from typing import Generic, List, TypeVar
|
|
|
|
from dbgpt._private.pydantic import BaseModel, ConfigDict, Field
|
|
|
|
T = TypeVar("T")
|
|
|
|
|
|
class PaginationResult(BaseModel, Generic[T]):
|
|
"""Pagination result"""
|
|
|
|
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
|
|
items: List[T] = Field(..., description="The items in the current page")
|
|
total_count: int = Field(..., description="Total number of items")
|
|
total_pages: int = Field(..., description="total number of pages")
|
|
page: int = Field(..., description="Current page number")
|
|
page_size: int = Field(..., description="Number of items per page")
|
|
|
|
@classmethod
|
|
def build_from_all(
|
|
cls, all_items: List[T], page: int, page_size: int
|
|
) -> "PaginationResult[T]":
|
|
"""Build a pagination result from all items"""
|
|
if page < 1:
|
|
page = 1
|
|
if page_size < 1:
|
|
page_size = 1
|
|
total_count = len(all_items)
|
|
total_pages = (
|
|
(total_count + page_size - 1) // page_size if total_count > 0 else 0
|
|
)
|
|
page = max(1, min(page, total_pages)) if total_pages > 0 else 0
|
|
start_index = (page - 1) * page_size if page > 0 else 0
|
|
end_index = min(start_index + page_size, total_count)
|
|
items = all_items[start_index:end_index]
|
|
|
|
return cls(
|
|
items=items,
|
|
total_count=total_count,
|
|
total_pages=total_pages,
|
|
page=page,
|
|
page_size=page_size,
|
|
)
|