mirror of
https://github.com/flibusta-apps/book_library_server.git
synced 2025-12-06 15:15:36 +01:00
Add translator endpoints
This commit is contained in:
@@ -19,6 +19,7 @@ class TRGMSearchService(Generic[T]):
|
||||
SELECT_RELATED: Optional[Union[list[str], str]] = None
|
||||
PREFETCH_RELATED: Optional[Union[list[str], str]] = None
|
||||
GET_OBJECT_IDS_QUERY: Optional[str] = None
|
||||
CUSTOM_CACHE_PREFIX: Optional[str] = None
|
||||
CACHE_TTL = 60 * 60
|
||||
|
||||
@classmethod
|
||||
@@ -66,9 +67,14 @@ class TRGMSearchService(Generic[T]):
|
||||
|
||||
return row["array"]
|
||||
|
||||
@classmethod
|
||||
@property
|
||||
def cache_prefix(cls) -> str:
|
||||
return cls.CUSTOM_CACHE_PREFIX or cls.model.__class__.__name__
|
||||
|
||||
@classmethod
|
||||
def get_cache_key(cls, query_data: str, allowed_langs: list[str]) -> str:
|
||||
model_class_name = cls.model.__class__.__name__
|
||||
model_class_name = cls.cache_prefix
|
||||
allowed_langs_part = ",".join(allowed_langs)
|
||||
return f"{model_class_name}_{query_data}_{allowed_langs_part}"
|
||||
|
||||
|
||||
52
fastapi_book_server/app/services/translator.py
Normal file
52
fastapi_book_server/app/services/translator.py
Normal file
@@ -0,0 +1,52 @@
|
||||
from app.models import Author
|
||||
from app.services.common import TRGMSearchService
|
||||
|
||||
|
||||
GET_OBJECT_IDS_QUERY = """
|
||||
SELECT ARRAY(
|
||||
WITH filtered_authors AS (
|
||||
SELECT
|
||||
id,
|
||||
GREATEST(
|
||||
similarity(
|
||||
(last_name || ' ' || first_name || ' ' || middle_name),
|
||||
:query
|
||||
),
|
||||
similarity((last_name || ' ' || first_name), :query),
|
||||
similarity((last_name), :query)
|
||||
) as sml,
|
||||
(
|
||||
SELECT count(*) FROM translations
|
||||
LEFT JOIN books
|
||||
ON (books.id = book AND
|
||||
books.is_deleted = 'f' AND
|
||||
books.lang = ANY(:langs ::text[]))
|
||||
WHERE author = authors.id
|
||||
) as books_count
|
||||
FROM authors
|
||||
WHERE (
|
||||
(last_name || ' ' || first_name || ' ' || middle_name) % :query OR
|
||||
(last_name || ' ' || first_name) % :query OR
|
||||
(last_name) % :query
|
||||
) AND
|
||||
EXISTS (
|
||||
SELECT * FROM translations
|
||||
LEFT JOIN books
|
||||
ON (books.id = book AND
|
||||
books.is_deleted = 'f' AND
|
||||
books.lang = ANY(:langs ::text[]))
|
||||
WHERE author = authors.id
|
||||
)
|
||||
)
|
||||
SELECT fauthors.id FROM filtered_authors as fauthors
|
||||
ORDER BY fauthors.sml DESC, fauthors.books_count DESC
|
||||
LIMIT 210
|
||||
);
|
||||
"""
|
||||
|
||||
|
||||
class TranslatorTGRMSearchService(TRGMSearchService):
|
||||
MODEL_CLASS = Author
|
||||
CUSTOM_CACHE_PREFIX = "translator"
|
||||
PREFETCH_RELATED = ["source", "annotations"]
|
||||
GET_OBJECT_IDS_QUERY = GET_OBJECT_IDS_QUERY
|
||||
Reference in New Issue
Block a user