mirror of
https://mau.dev/maunium/synapse.git
synced 2024-10-01 01:36:05 -04:00
Reuse existing pagination code for context API
This commit is contained in:
parent
3e6d306e94
commit
696f532453
@ -42,7 +42,7 @@ from synapse.util.caches.descriptors import cached
|
|||||||
from synapse.types import RoomStreamToken
|
from synapse.types import RoomStreamToken
|
||||||
from synapse.util.caches.stream_change_cache import StreamChangeCache
|
from synapse.util.caches.stream_change_cache import StreamChangeCache
|
||||||
from synapse.util.logcontext import make_deferred_yieldable, run_in_background
|
from synapse.util.logcontext import make_deferred_yieldable, run_in_background
|
||||||
from synapse.storage.engines import PostgresEngine, Sqlite3Engine
|
from synapse.storage.engines import PostgresEngine
|
||||||
|
|
||||||
import abc
|
import abc
|
||||||
import logging
|
import logging
|
||||||
@ -595,88 +595,28 @@ class StreamWorkerStore(EventsWorkerStore, SQLBaseStore):
|
|||||||
retcols=["stream_ordering", "topological_ordering"],
|
retcols=["stream_ordering", "topological_ordering"],
|
||||||
)
|
)
|
||||||
|
|
||||||
token = RoomStreamToken(
|
# Paginating backwards includes the event at the token, but paginating
|
||||||
|
# forward doesn't.
|
||||||
|
before_token = RoomStreamToken(
|
||||||
|
results["topological_ordering"] - 1,
|
||||||
|
results["stream_ordering"],
|
||||||
|
)
|
||||||
|
|
||||||
|
after_token = RoomStreamToken(
|
||||||
results["topological_ordering"],
|
results["topological_ordering"],
|
||||||
results["stream_ordering"],
|
results["stream_ordering"],
|
||||||
)
|
)
|
||||||
|
|
||||||
if isinstance(self.database_engine, Sqlite3Engine):
|
rows, start_token = self.paginate_room_events_txn(
|
||||||
# SQLite3 doesn't optimise ``(x < a) OR (x = a AND y < b)``
|
txn, room_id, before_token, direction='b', limit=before_limit,
|
||||||
# So we give pass it to SQLite3 as the UNION ALL of the two queries.
|
)
|
||||||
|
|
||||||
query_before = (
|
|
||||||
"SELECT topological_ordering, stream_ordering, event_id FROM events"
|
|
||||||
" WHERE room_id = ? AND topological_ordering < ?"
|
|
||||||
" UNION ALL"
|
|
||||||
" SELECT topological_ordering, stream_ordering, event_id FROM events"
|
|
||||||
" WHERE room_id = ? AND topological_ordering = ? AND stream_ordering < ?"
|
|
||||||
" ORDER BY topological_ordering DESC, stream_ordering DESC LIMIT ?"
|
|
||||||
)
|
|
||||||
before_args = (
|
|
||||||
room_id, token.topological,
|
|
||||||
room_id, token.topological, token.stream,
|
|
||||||
before_limit,
|
|
||||||
)
|
|
||||||
|
|
||||||
query_after = (
|
|
||||||
"SELECT topological_ordering, stream_ordering, event_id FROM events"
|
|
||||||
" WHERE room_id = ? AND topological_ordering > ?"
|
|
||||||
" UNION ALL"
|
|
||||||
" SELECT topological_ordering, stream_ordering, event_id FROM events"
|
|
||||||
" WHERE room_id = ? AND topological_ordering = ? AND stream_ordering > ?"
|
|
||||||
" ORDER BY topological_ordering ASC, stream_ordering ASC LIMIT ?"
|
|
||||||
)
|
|
||||||
after_args = (
|
|
||||||
room_id, token.topological,
|
|
||||||
room_id, token.topological, token.stream,
|
|
||||||
after_limit,
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
query_before = (
|
|
||||||
"SELECT topological_ordering, stream_ordering, event_id FROM events"
|
|
||||||
" WHERE room_id = ? AND %s"
|
|
||||||
" ORDER BY topological_ordering DESC, stream_ordering DESC LIMIT ?"
|
|
||||||
) % (upper_bound(token, self.database_engine, inclusive=False),)
|
|
||||||
|
|
||||||
before_args = (room_id, before_limit)
|
|
||||||
|
|
||||||
query_after = (
|
|
||||||
"SELECT topological_ordering, stream_ordering, event_id FROM events"
|
|
||||||
" WHERE room_id = ? AND %s"
|
|
||||||
" ORDER BY topological_ordering ASC, stream_ordering ASC LIMIT ?"
|
|
||||||
) % (lower_bound(token, self.database_engine, inclusive=False),)
|
|
||||||
|
|
||||||
after_args = (room_id, after_limit)
|
|
||||||
|
|
||||||
txn.execute(query_before, before_args)
|
|
||||||
|
|
||||||
rows = self.cursor_to_dict(txn)
|
|
||||||
events_before = [r["event_id"] for r in rows]
|
events_before = [r["event_id"] for r in rows]
|
||||||
|
|
||||||
if rows:
|
rows, end_token = self.paginate_room_events_txn(
|
||||||
start_token = str(RoomStreamToken(
|
txn, room_id, after_token, direction='f', limit=after_limit,
|
||||||
rows[0]["topological_ordering"],
|
)
|
||||||
rows[0]["stream_ordering"] - 1,
|
|
||||||
))
|
|
||||||
else:
|
|
||||||
start_token = str(RoomStreamToken(
|
|
||||||
token.topological,
|
|
||||||
token.stream - 1,
|
|
||||||
))
|
|
||||||
|
|
||||||
txn.execute(query_after, after_args)
|
|
||||||
|
|
||||||
rows = self.cursor_to_dict(txn)
|
|
||||||
events_after = [r["event_id"] for r in rows]
|
events_after = [r["event_id"] for r in rows]
|
||||||
|
|
||||||
if rows:
|
|
||||||
end_token = str(RoomStreamToken(
|
|
||||||
rows[-1]["topological_ordering"],
|
|
||||||
rows[-1]["stream_ordering"],
|
|
||||||
))
|
|
||||||
else:
|
|
||||||
end_token = str(token)
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"before": {
|
"before": {
|
||||||
"event_ids": events_before,
|
"event_ids": events_before,
|
||||||
|
Loading…
Reference in New Issue
Block a user