summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--synapse/storage/receipts.py18
1 files changed, 14 insertions, 4 deletions
diff --git a/synapse/storage/receipts.py b/synapse/storage/receipts.py
index 46c06e42b1..0ed9f45ecd 100644
--- a/synapse/storage/receipts.py
+++ b/synapse/storage/receipts.py
@@ -158,15 +158,25 @@ class ReceiptsStore(SQLBaseStore):
 
         results = {}
         for row in txn_results:
-            results.setdefault(row["room_id"], {
+            # We want a single event per room, since we want to batch the
+            # receipts by room, event and type.
+            room_event = results.setdefault(row["room_id"], {
                 "type": "m.receipt",
                 "room_id": row["room_id"],
                 "content": {},
-            })["content"].setdefault(
+            })
+
+            # The content is of the form:
+            # {"$foo:bar": { "read": { "@user:host": <receipt> }, .. }, .. }
+            event_id = room_event["content"].setdefault(
                 row["event_id"], {}
-            ).setdefault(
+            )
+
+            receipt_type = event_id.setdefault(
                 row["receipt_type"], {}
-            )[row["user_id"]] = json.loads(row["data"])
+            )
+
+            receipt_type[row["user_id"]] = json.loads(row["data"])
 
         results = {
             room_id: [results[room_id]] if room_id in results else []