Skip to content

Commit 9c0fdb8

Browse files
committed
chore(telethon): cache indexes, not their messages
1 parent cbe3663 commit 9c0fdb8

File tree

5 files changed

+59
-31
lines changed

5 files changed

+59
-31
lines changed

src/tgdb/infrastructure/telethon/in_telegram_heap.py

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,13 @@
1010
from tgdb.entities.relation.tuple import TID, Tuple
1111
from tgdb.entities.tools.assert_ import assert_
1212
from tgdb.infrastructure.heap_tuple_encoding import HeapTupleEncoding
13+
from tgdb.infrastructure.lazy_map import LazyMap
1314
from tgdb.infrastructure.telethon.client_pool import TelegramClientPool
14-
from tgdb.infrastructure.telethon.lazy_message_map import LazyMessageMap
15+
from tgdb.infrastructure.telethon.index import (
16+
MessageIndex,
17+
TupleIndex,
18+
message_index,
19+
)
1520

1621

1722
@dataclass(frozen=True)
@@ -27,7 +32,7 @@ class InTelegramHeap:
2732
_pool_to_delete: TelegramClientPool
2833
_heap_id: int
2934
_encoded_tuple_max_len: int
30-
_message_map: LazyMessageMap
35+
_index_map: LazyMap[TupleIndex, MessageIndex | None]
3136

3237
_page_len: ClassVar = 4000
3338

@@ -93,38 +98,42 @@ async def tuples_with_attribute(
9398
)
9499

95100
async def insert_idempotently(self, tuple: Tuple) -> None:
96-
message_ = await self._message_map[self._heap_id, tuple.tid]
101+
message_index_ = await self._index_map[self._heap_id, tuple.tid]
97102

98-
if message_ is not None:
103+
if message_index_ is not None:
99104
return
100105

101106
new_message = await self._pool_to_insert().send_message(
102107
self._heap_id, HeapTupleEncoding.encoded_tuple(tuple)
103108
)
104-
self._message_map[self._heap_id, tuple.tid] = new_message
109+
self._index_map[self._heap_id, tuple.tid] = message_index(new_message)
105110

106111
async def insert(self, tuple: Tuple) -> None:
107112
new_message = await self._pool_to_insert().send_message(
108113
self._heap_id, HeapTupleEncoding.encoded_tuple(tuple)
109114
)
110-
self._message_map[self._heap_id, tuple.tid] = new_message
115+
self._index_map[self._heap_id, tuple.tid] = message_index(new_message)
111116

112117
async def update(self, tuple: Tuple) -> None:
113-
message = await self._message_map[self._heap_id, tuple.tid]
118+
message_index = await self._index_map[self._heap_id, tuple.tid]
114119

115-
if message is None:
120+
if message_index is None:
116121
return
117122

118-
await self._pool_to_edit(message.sender_id).edit_message( # type: ignore[attr-defined]
119-
self._heap_id, message.id, HeapTupleEncoding.encoded_tuple(tuple)
123+
message_id, sender_id = message_index
124+
125+
await self._pool_to_edit(sender_id).edit_message(
126+
self._heap_id, message_id, HeapTupleEncoding.encoded_tuple(tuple)
120127
)
121128

122129
async def delete_tuple_with_tid(self, tid: TID) -> None:
123-
message = await self._message_map[self._heap_id, tid]
130+
message_index = await self._index_map[self._heap_id, tid]
124131

125-
if message is None:
132+
if message_index is None:
126133
return
127134

135+
message_id, _ = message_index
136+
128137
await self._pool_to_delete().delete_messages(
129-
self._heap_id, [message.id]
138+
self._heap_id, [message_id]
130139
)
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from telethon.tl.types import Message
2+
3+
from tgdb.entities.relation.tuple import TID
4+
5+
6+
type MessageID = int
7+
type SenderID = int
8+
type ChatID = int
9+
10+
type MessageIndex = tuple[MessageID, SenderID]
11+
type TupleIndex = tuple[ChatID, TID]
12+
13+
14+
def message_index(message: Message) -> MessageIndex:
15+
return message.id, message.sender_id # type: ignore[attr-defined]

src/tgdb/infrastructure/telethon/lazy_message_map.py renamed to src/tgdb/infrastructure/telethon/lazy_map.py

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,29 +7,31 @@
77
from tgdb.infrastructure.heap_tuple_encoding import HeapTupleEncoding
88
from tgdb.infrastructure.lazy_map import ExternalValue, LazyMap, NoExternalValue
99
from tgdb.infrastructure.telethon.client_pool import TelegramClientPool
10+
from tgdb.infrastructure.telethon.index import (
11+
MessageIndex,
12+
TupleIndex,
13+
message_index,
14+
)
1015

1116

12-
type ChatID = int
13-
type LazyMessageMap = LazyMap[tuple[ChatID, TID], Message]
17+
type MessageIndexLazyMap = LazyMap[TupleIndex, MessageIndex | None]
1418

1519

16-
def lazy_message_map(
20+
def message_index_lazy_map(
1721
pool: TelegramClientPool, cache_map_max_len: int
18-
) -> LazyMessageMap:
19-
async def tuple_message(
20-
chat_id_and_tid: tuple[ChatID, TID]
21-
) -> ExternalValue[Message]:
22-
chat_id, tid = chat_id_and_tid
22+
) -> LazyMap[TupleIndex, MessageIndex | None]:
23+
async def tuple_message(tuple_index: TupleIndex) -> MessageIndex | None:
24+
chat_id, tid = tuple_index
2325

2426
search = HeapTupleEncoding.id_of_encoded_tuple_with_tid(tid)
25-
2627
messages = cast(TotalList, await pool().get_messages(
2728
chat_id, search=search, limit=1
2829
))
2930

3031
if not messages:
31-
return NoExternalValue()
32+
return None
3233

33-
return cast(Message, messages[0])
34+
message = cast(Message, messages[0])
35+
return message_index(message)
3436

3537
return LazyMap(cache_map_max_len, tuple_message)

src/tgdb/main/common/di.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@
4545
)
4646
from tgdb.infrastructure.telethon.in_telegram_bytes import InTelegramBytes
4747
from tgdb.infrastructure.telethon.in_telegram_heap import InTelegramHeap
48-
from tgdb.infrastructure.telethon.lazy_message_map import (
49-
LazyMessageMap,
50-
lazy_message_map,
48+
from tgdb.infrastructure.telethon.lazy_map import (
49+
MessageIndexLazyMap,
50+
message_index_lazy_map,
5151
)
5252
from tgdb.infrastructure.typenv.envs import Envs
5353

@@ -119,16 +119,16 @@ def provide_lazy_message_map(
119119
self,
120120
user_bot_pool: UserBotPool,
121121
conf: Conf,
122-
) -> LazyMessageMap:
123-
return lazy_message_map(user_bot_pool, conf.message_cache.max_len)
122+
) -> MessageIndexLazyMap:
123+
return message_index_lazy_map(user_bot_pool, conf.message_cache.max_len)
124124

125125
@provide(scope=Scope.APP)
126126
def provide_in_telegram_heap(
127127
self,
128128
bot_pool: BotPool,
129129
user_bot_pool: UserBotPool,
130130
conf: Conf,
131-
lazy_message_map: LazyMessageMap,
131+
message_index_lazy_map: MessageIndexLazyMap,
132132
) -> InTelegramHeap:
133133
return InTelegramHeap(
134134
bot_pool,
@@ -137,7 +137,7 @@ def provide_in_telegram_heap(
137137
bot_pool,
138138
conf.heap.chat,
139139
InTelegramHeap.encoded_tuple_max_len(conf.heap.page.fullness),
140-
lazy_message_map,
140+
message_index_lazy_map,
141141
)
142142

143143
provide_tuples = provide(

src/tgdb/presentation/fastapi/common/app.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from dishka.integrations.fastapi import setup_dishka
88
from fastapi import APIRouter, FastAPI
99

10+
from tgdb.presentation.fastapi.common.error_handling import add_error_handling
1011
from tgdb.presentation.fastapi.common.tags import tags_metadata
1112

1213

@@ -57,5 +58,6 @@ async def app_from(container: AsyncContainer) -> FastAPI:
5758
app.include_router(router)
5859

5960
setup_dishka(container=container, app=app)
61+
add_error_handling(app)
6062

6163
return app

0 commit comments

Comments
 (0)