0
0
Fork 1
mirror of https://mau.dev/maunium/synapse.git synced 2024-11-05 14:18:55 +01:00

Batch fetch _get_state_groups_from_groups

This commit is contained in:
Erik Johnston 2016-02-10 13:24:42 +00:00
parent 24f00a6c33
commit 5189bfdef4

View file

@ -171,41 +171,43 @@ class StateStore(SQLBaseStore):
events = yield self._get_events(event_ids, get_prev_content=False) events = yield self._get_events(event_ids, get_prev_content=False)
defer.returnValue(events) defer.returnValue(events)
def _get_state_groups_from_groups(self, groups_and_types): def _get_state_groups_from_groups(self, groups, types):
"""Returns dictionary state_group -> state event ids """Returns dictionary state_group -> state event ids
Args:
groups_and_types (list): list of 2-tuple (`group`, `types`)
""" """
def f(txn): def f(txn, groups):
if types is not None:
where_clause = "AND (%s)" % (
" OR ".join(["(type = ? AND state_key = ?)"] * len(types)),
)
else:
where_clause = ""
sql = (
"SELECT state_group, event_id FROM state_groups_state WHERE"
" state_group IN (%s) %s" % (
",".join("?" for _ in groups),
where_clause,
)
)
args = list(groups)
if types is not None:
args.extend([i for typ in types for i in typ])
txn.execute(sql, args)
rows = self.cursor_to_dict(txn)
results = {} results = {}
for group, types in groups_and_types: for row in rows:
if types is not None: results.setdefault(row["state_group"], []).append(row["event_id"])
where_clause = "AND (%s)" % (
" OR ".join(["(type = ? AND state_key = ?)"] * len(types)),
)
else:
where_clause = ""
sql = (
"SELECT event_id FROM state_groups_state WHERE"
" state_group = ? %s"
) % (where_clause,)
args = [group]
if types is not None:
args.extend([i for typ in types for i in typ])
txn.execute(sql, args)
results[group] = [r[0] for r in txn.fetchall()]
return results return results
return self.runInteraction( chunks = [groups[i:i + 100] for i in xrange(0, len(groups), 100)]
"_get_state_groups_from_groups", for chunk in chunks:
f, return self.runInteraction(
) "_get_state_groups_from_groups",
f, chunk
)
@defer.inlineCallbacks @defer.inlineCallbacks
def get_state_for_events(self, event_ids, types): def get_state_for_events(self, event_ids, types):
@ -349,7 +351,7 @@ class StateStore(SQLBaseStore):
all events are returned. all events are returned.
""" """
results = {} results = {}
missing_groups_and_types = [] missing_groups = []
if types is not None: if types is not None:
for group in set(groups): for group in set(groups):
state_dict, missing_types, got_all = self._get_some_state_from_cache( state_dict, missing_types, got_all = self._get_some_state_from_cache(
@ -358,7 +360,7 @@ class StateStore(SQLBaseStore):
results[group] = state_dict results[group] = state_dict
if not got_all: if not got_all:
missing_groups_and_types.append((group, missing_types)) missing_groups.append(group)
else: else:
for group in set(groups): for group in set(groups):
state_dict, got_all = self._get_all_state_from_cache( state_dict, got_all = self._get_all_state_from_cache(
@ -367,9 +369,9 @@ class StateStore(SQLBaseStore):
results[group] = state_dict results[group] = state_dict
if not got_all: if not got_all:
missing_groups_and_types.append((group, None)) missing_groups.append(group)
if not missing_groups_and_types: if not missing_groups:
defer.returnValue({ defer.returnValue({
group: { group: {
type_tuple: event type_tuple: event
@ -383,7 +385,7 @@ class StateStore(SQLBaseStore):
cache_seq_num = self._state_group_cache.sequence cache_seq_num = self._state_group_cache.sequence
group_state_dict = yield self._get_state_groups_from_groups( group_state_dict = yield self._get_state_groups_from_groups(
missing_groups_and_types missing_groups, types
) )
state_events = yield self._get_events( state_events = yield self._get_events(