From 787455354a72dc62fa55343e9aa9ed78941ba8cf Mon Sep 17 00:00:00 2001 From: Mike Hukiewitz <70762838+MHHukiewitz@users.noreply.github.com> Date: Tue, 12 Dec 2023 15:35:10 +0100 Subject: [PATCH] Filter and sort objects (messages, posts, etc) by confirmation block ID #445 (#446) * Filter and sort objects (messages, posts, etc) by confirmation block ID #445 * fix or operator --- src/aleph/db/accessors/messages.py | 31 ++++++++++++++++++--------- src/aleph/web/controllers/messages.py | 19 ++++++++++++++++ 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/src/aleph/db/accessors/messages.py b/src/aleph/db/accessors/messages.py index 0f88caa86..6f7dcdd4a 100644 --- a/src/aleph/db/accessors/messages.py +++ b/src/aleph/db/accessors/messages.py @@ -55,6 +55,8 @@ def make_matching_messages_query( message_types: Optional[Sequence[MessageType]] = None, start_date: Optional[Union[float, dt.datetime]] = None, end_date: Optional[Union[float, dt.datetime]] = None, + start_block: Optional[int] = None, + end_block: Optional[int] = None, content_hashes: Optional[Sequence[ItemHash]] = None, content_types: Optional[Sequence[str]] = None, tags: Optional[Sequence[str]] = None, @@ -115,7 +117,7 @@ def make_matching_messages_query( order_by_columns: Tuple # For mypy to leave us alone until SQLA2 - if sort_by == SortBy.TX_TIME: + if sort_by == SortBy.TX_TIME or start_block or end_block: select_earliest_confirmation = ( select( message_confirmations.c.item_hash, @@ -129,17 +131,26 @@ def make_matching_messages_query( MessageDb.item_hash == select_earliest_confirmation.c.item_hash, isouter=True, ) - order_by_columns = ( - ( - nullsfirst(select_earliest_confirmation.c.earliest_confirmation.desc()), - MessageDb.time.desc(), + if start_block: + select_stmt = select_stmt.where( + select_earliest_confirmation.c.height.is_(None) | select_earliest_confirmation.c.height >= start_block ) - if sort_order == SortOrder.DESCENDING - else ( - nullslast(select_earliest_confirmation.c.earliest_confirmation.asc()), - MessageDb.time.asc(), + if end_block: + select_stmt = select_stmt.where( + select_earliest_confirmation.c.height < end_block + ) + if sort_by == SortBy.TX_TIME: + order_by_columns = ( + ( + nullsfirst(select_earliest_confirmation.c.earliest_confirmation.desc()), + MessageDb.time.desc(), + ) + if sort_order == SortOrder.DESCENDING + else ( + nullslast(select_earliest_confirmation.c.earliest_confirmation.asc()), + MessageDb.time.asc(), + ) ) - ) else: order_by_columns = ( ( diff --git a/src/aleph/web/controllers/messages.py b/src/aleph/web/controllers/messages.py index b25f84762..faf64b5f5 100644 --- a/src/aleph/web/controllers/messages.py +++ b/src/aleph/web/controllers/messages.py @@ -112,6 +112,10 @@ def validate_field_dependencies(cls, values): end_date = values.get("end_date") if start_date and end_date and (end_date < start_date): raise ValueError("end date cannot be lower than start date.") + start_block = values.get("start_block") + end_block = values.get("end_block") + if start_block and end_block and (end_block < start_block): + raise ValueError("end block cannot be lower than start block.") return values @validator( @@ -158,6 +162,21 @@ class MessageQueryParams(BaseMessageQueryParams): "a time field lower than this value will be returned.", ) + start_block: int = Field( + default=0, + ge=0, + alias="startBlock", + description="Start block number. If specified, only messages with " + "a block number greater or equal to this value will be returned.", + ) + end_block: int = Field( + default=0, + ge=0, + alias="endBlock", + description="End block number. If specified, only messages with " + "a block number lower than this value will be returned.", + ) + class WsMessageQueryParams(BaseMessageQueryParams): history: Optional[int] = Field(