diff --git a/synapse/storage/events_worker.py b/synapse/storage/events_worker.py
index a8326f5296..c5fee97ac9 100644
--- a/synapse/storage/events_worker.py
+++ b/synapse/storage/events_worker.py
@@ -526,3 +526,42 @@ class EventsWorkerStore(SQLBaseStore):
return res
return self.runInteraction("get_rejection_reasons", f)
+
+ def get_event_for_timestamp(self, room_id, timestamp):
+ sql_template = """
+ SELECT event_id, origin_server_ts FROM events
+ WHERE
+ origin_server_ts %s ?
+ AND room_id = ?
+ ORDER BY origin_server_ts
+ LIMIT 1;
+ """
+
+ def f(txn):
+ txn.execute(sql_template % ("<=",), (timestamp, room_id))
+ row = txn.fetchone()
+ if row:
+ event_id_before, ts_before = row
+ else:
+ event_id_before, ts_before = None, None
+
+ txn.execute(sql_template % (">=",), (timestamp, room_id))
+ row = txn.fetchone()
+ if row:
+ event_id_after, ts_after = row
+ else:
+ event_id_after, ts_after = None, None
+
+ if event_id_before and event_id_after:
+ # Return the closest one
+ if (timestamp - ts_before) < (ts_after - timestamp):
+ return event_id_before
+ else:
+ return event_id_after
+
+ if event_id_before:
+ return event_id_before
+
+ return event_id_after
+
+ return self.runInteraction("get_event_for_timestamp", f)
|