Filtres i ordres als resultats de cerca
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import datetime
|
||||
import time
|
||||
from collections.abc import Iterable, Iterator
|
||||
from sqlite3 import Connection
|
||||
@@ -13,7 +14,7 @@ from folkugat_web.model import search as search_model
|
||||
from folkugat_web.model import temes as model
|
||||
from folkugat_web.services.temes import properties as properties_service
|
||||
from folkugat_web.services.temes import query as query_service
|
||||
from folkugat_web.utils import FnChain
|
||||
from folkugat_web.utils import FnChain, identity
|
||||
|
||||
T = TypeVar("T")
|
||||
|
||||
@@ -69,6 +70,40 @@ def _sort_by_distance(qrs: Iterable[search_model.QueryResult[T]]) -> list[search
|
||||
return sorted(qrs, key=lambda qr: qr.distance)
|
||||
|
||||
|
||||
def _sort_by_times_played_fn(order: search_model.Order) -> Callable[[list[model.Tema]], list[model.Tema]]:
|
||||
reverse = order is search_model.Order.DESC
|
||||
|
||||
def _sort_by_times_played(temes: list[model.Tema]) -> list[model.Tema]:
|
||||
return sorted(temes, key=lambda tema: tema.stats.times_played if tema.stats else 0, reverse=reverse)
|
||||
|
||||
return _sort_by_times_played
|
||||
|
||||
|
||||
def _sort_by_last_played_fn(order: search_model.Order) -> Callable[[list[model.Tema]], list[model.Tema]]:
|
||||
reverse = order is search_model.Order.DESC
|
||||
|
||||
def _tune_last_played_key(tema: model.Tema) -> datetime.date:
|
||||
if not tema.stats or not tema.stats.sessions_played:
|
||||
return datetime.date.min
|
||||
else:
|
||||
return tema.stats.sessions_played[0].date
|
||||
|
||||
def _sort_by_last_played(temes: list[model.Tema]) -> list[model.Tema]:
|
||||
return sorted(temes, key=_tune_last_played_key, reverse=reverse)
|
||||
|
||||
return _sort_by_last_played
|
||||
|
||||
|
||||
def _build_sort_fn(order_params: search_model.OrderParams | None) -> Callable[[list[model.Tema]], list[model.Tema]]:
|
||||
if order_params is None:
|
||||
return identity
|
||||
match order_params.order_by:
|
||||
case search_model.OrderBy.TIMES_PLAYED:
|
||||
return _sort_by_times_played_fn(order=order_params.order)
|
||||
case search_model.OrderBy.LAST_PLAYED:
|
||||
return _sort_by_last_played_fn(order=order_params.order)
|
||||
|
||||
|
||||
def _query_results_to_temes(
|
||||
con: Connection
|
||||
) -> Callable[[Iterable[search_model.QueryResult[int]]], Iterator[model.Tema]]:
|
||||
@@ -105,6 +140,7 @@ def _apply_limit_offset(limit: int, offset: int) -> Callable[[Iterable[T]], list
|
||||
def busca_temes(
|
||||
query: str,
|
||||
properties: list[str],
|
||||
order_params: search_model.OrderParams | None = None,
|
||||
hidden: bool = False,
|
||||
limit: int = 10,
|
||||
offset: int = 0,
|
||||
@@ -124,6 +160,7 @@ def busca_temes(
|
||||
properties_service.add_properties_to_temes |
|
||||
_filter_properties(properties) |
|
||||
query_service.temes_compute_stats |
|
||||
_build_sort_fn(order_params=order_params) |
|
||||
_apply_limit_offset(limit=limit, offset=offset)
|
||||
).result()
|
||||
logger.info(f"Temes search time: { int((time.time() - t0) * 1000) } ms")
|
||||
|
||||
Reference in New Issue
Block a user