Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Improve the docstrings for the receipts store. #12581

Merged
merged 8 commits into from
Apr 28, 2022
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/12581.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Improve docstrings for the receipts store.
56 changes: 51 additions & 5 deletions synapse/storage/databases/main/receipts.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,21 +122,43 @@ async def get_users_with_read_receipts_in_room(self, room_id: str) -> Set[str]:
receipts = await self.get_receipts_for_room(room_id, ReceiptTypes.READ)
return {r["user_id"] for r in receipts}

@cached(num_args=2)
@cached()
async def get_receipts_for_room(
self, room_id: str, receipt_type: str
) -> List[Dict[str, Any]]:
"""
Fetch the event IDs for the latest receipt for all users in a room with the given receipt type.

Args:
room_id: The room ID to fetch the receipt for.
receipt_type: The receipt type to fetch.

Returns:
A list of dictionaries, one for each user ID. Each dictionary
contains a user ID and the event ID of that user's latest receipt.
"""
return await self.db_pool.simple_select_list(
table="receipts_linearized",
keyvalues={"room_id": room_id, "receipt_type": receipt_type},
retcols=("user_id", "event_id"),
desc="get_receipts_for_room",
)

@cached(num_args=3)
@cached()
async def get_last_receipt_event_id_for_user(
self, user_id: str, room_id: str, receipt_type: str
) -> Optional[str]:
"""
Fetch the event ID for the latest receipt in a room with the given receipt type.

Args:
user_id: The user to fetch receipts for.
room_id: The room ID to fetch the receipt for.
receipt_type: The receipt type to fetch.

Returns:
The event ID of the latest receipt, if one exists; otherwise `None`.
"""
return await self.db_pool.simple_select_one_onecol(
table="receipts_linearized",
keyvalues={
Expand All @@ -149,10 +171,23 @@ async def get_last_receipt_event_id_for_user(
allow_none=True,
)

@cached(num_args=2)
@cached()
async def get_receipts_for_user(
self, user_id: str, receipt_type: str
) -> Dict[str, str]:
"""
Fetch the event IDs for the latest receipt sent by the given user.
clokep marked this conversation as resolved.
Show resolved Hide resolved

Args:
user_id: The user to fetch receipts for.
receipt_type: The receipt types to fetch.

Returns:
A map of room ID to the event ID of the latest receipt for that room.
DMRobertson marked this conversation as resolved.
Show resolved Hide resolved

If the user has not sent a receipt to a room then it will not appear
in the returned dictionary.
"""
rows = await self.db_pool.simple_select_list(
table="receipts_linearized",
keyvalues={"user_id": user_id, "receipt_type": receipt_type},
Expand All @@ -165,6 +200,17 @@ async def get_receipts_for_user(
async def get_receipts_for_user_with_orderings(
self, user_id: str, receipt_type: str
) -> JsonDict:
"""
Fetch receipts for all rooms that the given user is joined to.

Args:
user_id: The user to fetch receipts for.
receipt_type: The receipt type to fetch.

Returns:
A map of room ID to the latest receipt information.
"""

def f(txn: LoggingTransaction) -> List[Tuple[str, str, int, int]]:
sql = (
"SELECT rl.room_id, rl.event_id,"
Expand Down Expand Up @@ -241,7 +287,7 @@ async def get_linearized_receipts_for_room(

return await self._get_linearized_receipts_for_room(room_id, to_key, from_key)

@cached(num_args=3, tree=True)
@cached(tree=True)
async def _get_linearized_receipts_for_room(
self, room_id: str, to_key: int, from_key: Optional[int] = None
) -> List[JsonDict]:
Expand Down Expand Up @@ -541,7 +587,7 @@ def insert_linearized_receipt_txn(
data: JsonDict,
stream_id: int,
) -> Optional[int]:
"""Inserts a read-receipt into the database if it's newer than the current RR
"""Inserts a receipt into the database if it's newer than the current one.

Returns:
None if the RR is older than the current RR
Expand Down