diff --git a/backend-rust/.sqlx/query-2eaeb1383c2b23096e399e75d66e4dc6b06af35f982b8a70d87adecde3a96942.json b/backend-rust/.sqlx/query-2eaeb1383c2b23096e399e75d66e4dc6b06af35f982b8a70d87adecde3a96942.json new file mode 100644 index 00000000..7a3e8583 --- /dev/null +++ b/backend-rust/.sqlx/query-2eaeb1383c2b23096e399e75d66e4dc6b06af35f982b8a70d87adecde3a96942.json @@ -0,0 +1,73 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n event_index_per_contract,\n contract_events.transaction_index,\n trace_element_index,\n contract_events.block_height AS event_block_height,\n transactions.hash as transaction_hash,\n transactions.events,\n accounts.address as creator,\n blocks.slot_time as block_slot_time,\n blocks.height as block_height\n FROM contract_events\n JOIN transactions\n ON contract_events.block_height = transactions.block_height\n AND contract_events.transaction_index = transactions.index\n JOIN accounts\n ON transactions.sender_index = accounts.index\n JOIN blocks\n ON contract_events.block_height = blocks.height\n WHERE contract_events.contract_index = $1 AND contract_events.contract_sub_index = $2\n AND event_index_per_contract < $4\n ORDER BY event_index_per_contract DESC\n LIMIT $3\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "event_index_per_contract", + "type_info": "Int8" + }, + { + "ordinal": 1, + "name": "transaction_index", + "type_info": "Int8" + }, + { + "ordinal": 2, + "name": "trace_element_index", + "type_info": "Int8" + }, + { + "ordinal": 3, + "name": "event_block_height", + "type_info": "Int8" + }, + { + "ordinal": 4, + "name": "transaction_hash", + "type_info": "Bpchar" + }, + { + "ordinal": 5, + "name": "events", + "type_info": "Jsonb" + }, + { + "ordinal": 6, + "name": "creator", + "type_info": "Varchar" + }, + { + "ordinal": 7, + "name": "block_slot_time", + "type_info": "Timestamptz" + }, + { + "ordinal": 8, + "name": "block_height", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [ + "Int8", + "Int8", + "Int8", + "Int8" + ] + }, + "nullable": [ + false, + false, + false, + false, + false, + true, + false, + false, + false + ] + }, + "hash": "2eaeb1383c2b23096e399e75d66e4dc6b06af35f982b8a70d87adecde3a96942" +} diff --git a/backend-rust/.sqlx/query-80c9dbcf9005651c95c0dd535272b1c88ad8b7e2aa75f8398b805c80b4bdd273.json b/backend-rust/.sqlx/query-80c9dbcf9005651c95c0dd535272b1c88ad8b7e2aa75f8398b805c80b4bdd273.json deleted file mode 100644 index 9595d074..00000000 --- a/backend-rust/.sqlx/query-80c9dbcf9005651c95c0dd535272b1c88ad8b7e2aa75f8398b805c80b4bdd273.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT * FROM (\n SELECT\n event_index_per_contract,\n contract_events.transaction_index,\n trace_element_index,\n contract_events.block_height AS event_block_height,\n transactions.hash as transaction_hash,\n transactions.events,\n accounts.address as creator,\n blocks.slot_time as block_slot_time,\n blocks.height as block_height\n FROM contract_events\n JOIN transactions\n ON contract_events.block_height = transactions.block_height\n AND contract_events.transaction_index = transactions.index\n JOIN accounts\n ON transactions.sender_index = accounts.index\n JOIN blocks\n ON contract_events.block_height = blocks.height\n WHERE contract_events.contract_index = $1 AND contract_events.contract_sub_index = $2\n AND event_index_per_contract >= $4\n LIMIT $3\n ) AS contract_data\n ORDER BY event_index_per_contract DESC\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "event_index_per_contract", - "type_info": "Int8" - }, - { - "ordinal": 1, - "name": "transaction_index", - "type_info": "Int8" - }, - { - "ordinal": 2, - "name": "trace_element_index", - "type_info": "Int8" - }, - { - "ordinal": 3, - "name": "event_block_height", - "type_info": "Int8" - }, - { - "ordinal": 4, - "name": "transaction_hash", - "type_info": "Bpchar" - }, - { - "ordinal": 5, - "name": "events", - "type_info": "Jsonb" - }, - { - "ordinal": 6, - "name": "creator", - "type_info": "Varchar" - }, - { - "ordinal": 7, - "name": "block_slot_time", - "type_info": "Timestamptz" - }, - { - "ordinal": 8, - "name": "block_height", - "type_info": "Int8" - } - ], - "parameters": { - "Left": [ - "Int8", - "Int8", - "Int8", - "Int8" - ] - }, - "nullable": [ - false, - false, - false, - false, - false, - true, - false, - false, - false - ] - }, - "hash": "80c9dbcf9005651c95c0dd535272b1c88ad8b7e2aa75f8398b805c80b4bdd273" -} diff --git a/backend-rust/CHANGELOG.md b/backend-rust/CHANGELOG.md index 7f35a2cb..0b0b5a3c 100644 --- a/backend-rust/CHANGELOG.md +++ b/backend-rust/CHANGELOG.md @@ -30,6 +30,7 @@ Database schema version: 2 - Issue making `avgFinalizationTime` field of `Query::block_metrics` always return `null`. - Next and previous page on contracts. - Issue making `Query::block_metrics` included a bucket for a period in the future. +- Contract events order fixed ## [0.1.19] - 2025-01-30 diff --git a/backend-rust/src/graphql_api/contract.rs b/backend-rust/src/graphql_api/contract.rs index 6e1d2774..f170e36f 100644 --- a/backend-rust/src/graphql_api/contract.rs +++ b/backend-rust/src/graphql_api/contract.rs @@ -226,17 +226,28 @@ impl Contract { let skip = skip.unwrap_or(0); let take = take.unwrap_or(config.contract_events_collection_limit); + let total_contract_events_count: u64 = sqlx::query_scalar!( + "SELECT + COUNT(*) + FROM contract_events + WHERE contract_index = $1 AND contract_sub_index = $2", + self.contract_address_index.0 as i64, + self.contract_address_sub_index.0 as i64 + ) + .fetch_one(pool) + .await? + .unwrap_or(0) + .try_into()?; // If `skip` is 0 and at least one event is taken, include the // `init_transaction_event`. - let include_initial_event = skip == 0 && take > 0; + let include_initial_event = + skip <= total_contract_events_count && skip + take >= total_contract_events_count; // Adjust the `take` and `skip` values considering if the // `init_transaction_event` is requested to be included or not. - let take_without_initial_event = take.saturating_sub(include_initial_event as u64); - let skip_without_initial_event = skip.saturating_sub(1); // Limit the number of events to be fetched from the `contract_events` table. let limit = std::cmp::min( - take_without_initial_event, + take, config.contract_events_collection_limit.saturating_sub(include_initial_event as u64), ); @@ -246,7 +257,6 @@ impl Contract { // Get the events from the `contract_events` table. let mut rows = sqlx::query!( " - SELECT * FROM ( SELECT event_index_per_contract, contract_events.transaction_index, @@ -267,15 +277,14 @@ impl Contract { ON contract_events.block_height = blocks.height WHERE contract_events.contract_index = $1 AND contract_events.contract_sub_index = \ $2 - AND event_index_per_contract >= $4 - LIMIT $3 - ) AS contract_data + AND event_index_per_contract < $4 ORDER BY event_index_per_contract DESC + LIMIT $3 ", self.contract_address_index.0 as i64, self.contract_address_sub_index.0 as i64, limit as i64 + 1, - skip_without_initial_event as i64 + total_contract_events_count as i64 - skip as i64 ) .fetch_all(pool) .await?; @@ -397,19 +406,6 @@ impl Contract { contract_events.push(initial_event); } - let total_contract_events_count: u64 = sqlx::query_scalar!( - "SELECT - COUNT(*) - FROM contract_events - WHERE contract_index = $1 AND contract_sub_index = $2", - self.contract_address_index.0 as i64, - self.contract_address_sub_index.0 as i64 - ) - .fetch_one(pool) - .await? - .unwrap_or(0) - .try_into()?; - Ok(ContractEventsCollectionSegment { page_info: CollectionSegmentInfo { has_next_page,