diff --git a/synapse/storage/_base.py b/synapse/storage/_base.py
index e0d97f440b..a6e2e0e2ef 100644
--- a/synapse/storage/_base.py
+++ b/synapse/storage/_base.py
@@ -440,14 +440,29 @@ class SQLBaseStore(object):
)
def _get_events_txn(self, txn, event_ids):
- events = []
- for e_id in event_ids:
- ev = self._get_event_txn(txn, e_id)
+ if not event_ids:
+ return []
- if ev:
- events.append(ev)
+ if len(event_ids) > 50:
+ events = []
+ n = 50
+ for e_ids in [event_ids[i:i + n] for i in range(0, len(event_ids), n)]:
+ events.extend(self._get_events_txn(txn, e_ids))
+ return events
- return events
+ where_clause = " OR ".join(["e.event_id = ?" for _ in event_ids])
+
+ sql = (
+ "SELECT internal_metadata, json, r.event_id FROM event_json as e "
+ "LEFT JOIN redactions as r ON e.event_id = r.redacts "
+ "WHERE %s"
+ ) % (where_clause,)
+
+ txn.execute(sql, event_ids)
+
+ res = txn.fetchall()
+
+ return [self._get_event_from_row_txn(txn, *r) for r in res]
def _get_event_txn(self, txn, event_id, check_redacted=True,
get_prev_content=True):
@@ -467,6 +482,13 @@ class SQLBaseStore(object):
internal_metadata, js, redacted = res
+ return self._get_event_from_row_txn(
+ txn, internal_metadata, js, redacted, check_redacted=check_redacted,
+ get_prev_content=get_prev_content,
+ )
+
+ def _get_event_from_row_txn(self, txn, internal_metadata, js, redacted,
+ check_redacted=True, get_prev_content=True):
d = json.loads(js)
internal_metadata = json.loads(internal_metadata)
diff --git a/synapse/storage/roommember.py b/synapse/storage/roommember.py
index 05b275663e..4e416c50b1 100644
--- a/synapse/storage/roommember.py
+++ b/synapse/storage/roommember.py
@@ -183,20 +183,14 @@ class RoomMemberStore(SQLBaseStore):
)
def _get_members_query_txn(self, txn, where_clause, where_values):
- del_sql = (
- "SELECT event_id FROM redactions WHERE redacts = e.event_id "
- "LIMIT 1"
- )
-
sql = (
- "SELECT e.*, (%(redacted)s) AS redacted FROM events as e "
+ "SELECT e.* FROM events as e "
"INNER JOIN room_memberships as m "
"ON e.event_id = m.event_id "
"INNER JOIN current_state_events as c "
"ON m.event_id = c.event_id "
"WHERE %(where)s "
) % {
- "redacted": del_sql,
"where": where_clause,
}
diff --git a/synapse/storage/state.py b/synapse/storage/state.py
index afe3e5edea..ab80909712 100644
--- a/synapse/storage/state.py
+++ b/synapse/storage/state.py
@@ -62,14 +62,7 @@ class StateStore(SQLBaseStore):
keyvalues={"state_group": group},
retcol="event_id",
)
- state = []
- for state_id in state_ids:
- s = self._get_events_txn(
- txn,
- [state_id],
- )
- if s:
- state.extend(s)
+ state = self._get_events_txn(txn, state_ids)
res[group] = state
|