mirror of
https://github.com/flibusta-apps/book_library_server.git
synced 2025-12-06 15:15:36 +01:00
Update random objects getter
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
from app.models import Author
|
||||
|
||||
from app.services.common import TRGMSearchService
|
||||
from app.services.common import TRGMSearchService, GetRandomService
|
||||
|
||||
|
||||
GET_OBJECT_IDS_QUERY = """
|
||||
@@ -41,3 +41,7 @@ class AuthorTGRMSearchService(TRGMSearchService):
|
||||
MODEL_CLASS = Author
|
||||
PREFETCH_RELATED = ["source", "annotations"]
|
||||
GET_OBJECT_IDS_QUERY = GET_OBJECT_IDS_QUERY
|
||||
|
||||
|
||||
class GetRandomAuthorService(GetRandomService):
|
||||
MODEL_CLASS = Author
|
||||
|
||||
@@ -4,7 +4,7 @@ from fastapi import HTTPException, status
|
||||
|
||||
from app.models import Book as BookDB, Author as AuthorDB
|
||||
|
||||
from app.services.common import TRGMSearchService
|
||||
from app.services.common import TRGMSearchService, GetRandomService
|
||||
from app.serializers.book import CreateBook, CreateRemoteBook
|
||||
|
||||
|
||||
@@ -76,3 +76,7 @@ class BookCreator:
|
||||
return await cls._create_book(data)
|
||||
if isinstance(data, CreateRemoteBook):
|
||||
return await cls._create_remote_book(data)
|
||||
|
||||
|
||||
class GetRandomBookService(GetRandomService):
|
||||
MODEL_CLASS = BookDB
|
||||
|
||||
@@ -122,3 +122,31 @@ class TRGMSearchService(Generic[T]):
|
||||
total=total,
|
||||
params=params
|
||||
)
|
||||
|
||||
|
||||
GET_RANDOM_OBJECT_ID_QUERY = """
|
||||
SELECT id FROM {table}
|
||||
WHERE id >= RANDOM() * (SELECT MAX(id) FROM {table})
|
||||
ORDER BY id LIMIT 1;
|
||||
"""
|
||||
|
||||
|
||||
class GetRandomService(Generic[T]):
|
||||
MODEL_CLASS: Optional[T] = None
|
||||
|
||||
@classmethod
|
||||
@property
|
||||
def model(cls) -> T:
|
||||
assert cls.MODEL_CLASS is not None, f"MODEL in {cls.__name__} don't set!"
|
||||
return cls.MODEL_CLASS
|
||||
|
||||
@classmethod
|
||||
@property
|
||||
def database(cls) -> Database:
|
||||
return cls.model.Meta.database
|
||||
|
||||
@classmethod
|
||||
async def get_random_id(cls) -> int:
|
||||
table_name = cls.model.Meta.tablename
|
||||
query = GET_RANDOM_OBJECT_ID_QUERY.format(table=table_name)
|
||||
return await cls.database.fetch_val(query)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
from app.models import Sequence
|
||||
|
||||
from app.services.common import TRGMSearchService
|
||||
from app.services.common import TRGMSearchService, GetRandomService
|
||||
|
||||
|
||||
GET_OBJECT_IDS_QUERY = """
|
||||
@@ -33,3 +33,7 @@ class SequenceTGRMSearchService(TRGMSearchService):
|
||||
MODEL_CLASS = Sequence
|
||||
PREFETCH_RELATED = ["source"]
|
||||
GET_OBJECT_IDS_QUERY = GET_OBJECT_IDS_QUERY
|
||||
|
||||
|
||||
class GetRandomSequenceService(GetRandomService):
|
||||
MODEL_CLASS = Sequence
|
||||
|
||||
Reference in New Issue
Block a user