From 9db1a76d70f9950adf02aa016b65eda405b9358f Mon Sep 17 00:00:00 2001 From: Bulat Kurbanov Date: Thu, 26 Jan 2023 17:12:49 +0100 Subject: [PATCH] Fix query hashing --- fastapi_book_server/app/services/common.py | 8 ++++++-- fastapi_book_server/app/utils/orjson_default.py | 9 +++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 fastapi_book_server/app/utils/orjson_default.py diff --git a/fastapi_book_server/app/services/common.py b/fastapi_book_server/app/services/common.py index 7449639..945721d 100644 --- a/fastapi_book_server/app/services/common.py +++ b/fastapi_book_server/app/services/common.py @@ -1,6 +1,7 @@ import abc import asyncio from concurrent.futures import ThreadPoolExecutor +import hashlib from random import choice from typing import Generic, Optional, TypedDict, TypeVar, Union @@ -8,10 +9,12 @@ from databases import Database from fastapi_pagination.api import resolve_params from fastapi_pagination.bases import AbstractParams, RawParams import meilisearch +import orjson from ormar import Model, QuerySet from redis import asyncio as aioredis from sqlalchemy import Table +from app.utils.orjson_default import default as orjson_default from app.utils.pagination import CustomPage, Page from core.config import env_config @@ -47,8 +50,9 @@ class BaseService(Generic[MODEL, QUERY], abc.ABC): return cls.CUSTOM_MODEL_CACHE_NAME or cls.model.Meta.tablename @staticmethod - def _get_query_hash(query: QUERY) -> int: - return hash(frozenset(query.items())) + def _get_query_hash(query: QUERY) -> str: + json_value = orjson.dumps(query, orjson_default, option=orjson.OPT_SORT_KEYS) + return hashlib.md5(json_value).hexdigest() @classmethod def get_cache_key(cls, query: QUERY) -> str: diff --git a/fastapi_book_server/app/utils/orjson_default.py b/fastapi_book_server/app/utils/orjson_default.py new file mode 100644 index 0000000..2fc3efe --- /dev/null +++ b/fastapi_book_server/app/utils/orjson_default.py @@ -0,0 +1,9 @@ +from typing import Any + + +def default(value: Any): + if isinstance(value, frozenset): + list_value = list(value) + return "-".join(sorted(list_value)) + + return value