Skip to content

Commit ee86193

Browse files
committed
Fix: Inconsistent pagination
- include item_hash as a tie-breaker
1 parent cc12640 commit ee86193

File tree

4 files changed

+40
-15
lines changed

4 files changed

+40
-15
lines changed

src/aleph/db/accessors/files.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -170,12 +170,16 @@ def get_address_files_for_api(
170170
if pagination:
171171
select_stmt = select_stmt.limit(pagination).offset((page - 1) * pagination)
172172

173-
order_by = (
174-
MessageFilePinDb.created.desc()
175-
if sort_order == SortOrder.DESCENDING
176-
else MessageFilePinDb.created.asc()
173+
order_by_columns = (
174+
MessageFilePinDb.created.desc(),
175+
(
176+
MessageFilePinDb.item_hash.asc()
177+
if sort_order == SortOrder.DESCENDING
178+
else MessageFilePinDb.created.asc()
179+
),
180+
MessageFilePinDb.item_hash.asc(),
177181
)
178-
select_stmt = select_stmt.order_by(order_by)
182+
select_stmt = select_stmt.order_by(*order_by_columns)
179183

180184
return session.execute(select_stmt).all()
181185

src/aleph/db/accessors/messages.py

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -144,29 +144,35 @@ def make_matching_messages_query(
144144
select_stmt = select_stmt.where(
145145
select_earliest_confirmation.c.height < end_block
146146
)
147+
148+
sort_by = SortBy.TX_TIME
147149
if sort_by == SortBy.TX_TIME:
148150
order_by_columns = (
149151
(
150152
nullsfirst(
151153
select_earliest_confirmation.c.earliest_confirmation.desc()
152154
),
153155
MessageDb.time.desc(),
156+
MessageDb.item_hash.asc(),
154157
)
155158
if sort_order == SortOrder.DESCENDING
156159
else (
157160
nullslast(
158161
select_earliest_confirmation.c.earliest_confirmation.asc()
159162
),
160163
MessageDb.time.asc(),
164+
MessageDb.item_hash.asc(),
161165
)
162166
)
163167
else:
164168
order_by_columns = (
169+
MessageDb.time.desc(),
165170
(
166-
MessageDb.time.desc()
171+
MessageDb.item_hash.asc()
167172
if sort_order == SortOrder.DESCENDING
168173
else MessageDb.time.asc()
169174
),
175+
MessageDb.item_hash.asc(),
170176
)
171177

172178
select_stmt = select_stmt.order_by(*order_by_columns).offset(
@@ -648,10 +654,19 @@ def make_matching_hashes_query(
648654
if status:
649655
select_stmt = select_stmt.where(MessageStatusDb.status == status)
650656

651-
if sort_order == SortOrder.ASCENDING:
652-
select_stmt = select_stmt.order_by(MessageStatusDb.reception_time.asc())
653-
else:
654-
select_stmt = select_stmt.order_by(MessageStatusDb.reception_time.desc())
657+
order_by_columns: Tuple = ()
658+
659+
order_by_columns = (
660+
MessageStatusDb.reception_time.asc(),
661+
(
662+
MessageStatusDb.item_hash.asc()
663+
if sort_order == SortOrder.ASCENDING
664+
else MessageStatusDb.reception_time.desc()
665+
),
666+
MessageStatusDb.item_hash.asc(),
667+
)
668+
669+
select_stmt = select_stmt.order_by(*order_by_columns)
655670

656671
select_stmt = select_stmt.offset((page - 1) * pagination)
657672

src/aleph/db/accessors/posts.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -262,22 +262,28 @@ def filter_post_select_stmt(
262262
select_earliest_confirmation.c.earliest_confirmation.desc()
263263
),
264264
select_merged_post_subquery.c.created.desc(),
265+
select_merged_post_subquery.c.item_hash.asc(),
265266
)
266267
if sort_order == SortOrder.DESCENDING
267268
else (
268269
nullslast(
269270
select_earliest_confirmation.c.earliest_confirmation.asc()
270271
),
271272
select_merged_post_subquery.c.created.asc(),
273+
select_merged_post_subquery.c.item_hash.asc(),
272274
)
273275
)
274276
else:
275277
order_by_columns = (
276278
(
277-
last_updated_column.desc()
278-
if sort_order == SortOrder.DESCENDING
279-
else last_updated_column.asc()
280-
),
279+
last_updated_column.desc(),
280+
select_merged_post_subquery.c.original_item_hash.asc(),
281+
)
282+
if sort_order == SortOrder.DESCENDING
283+
else (
284+
last_updated_column.asc(),
285+
select_merged_post_subquery.c.original_item_hash.asc(),
286+
)
281287
)
282288
select_stmt = select_stmt.order_by(*order_by_columns)
283289

src/aleph/web/controllers/accounts.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ async def get_account_files(request: web.Request) -> web.Response:
155155
address=address,
156156
total_size=total_size,
157157
files=[
158-
GetAccountFilesResponseItem.model_validate(file_pin)
158+
GetAccountFilesResponseItem.model_validate(dict(file_pin))
159159
for file_pin in file_pins
160160
],
161161
pagination_page=query_params.page,

0 commit comments

Comments
 (0)