From a90c8ad153aa2d3d8ad9f18864a05ac33c058d35 Mon Sep 17 00:00:00 2001 From: blowcowbeer Date: Tue, 12 Mar 2024 15:06:32 +0800 Subject: [PATCH] optimize v2 claims. --- explorer/src/service/api.rs | 2 +- explorer/src/service/v2/claim.rs | 29 ++++++++++++++++++----------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/explorer/src/service/api.rs b/explorer/src/service/api.rs index 1fc8b2f..5dd27fd 100644 --- a/explorer/src/service/api.rs +++ b/explorer/src/service/api.rs @@ -845,7 +845,7 @@ impl Api { #[oai(path = "/v2/staking/claims", method = "get", tag = "ApiTags::Staking")] async fn v2_get_claims( &self, - address: Query, + address: Query>, page: Query>, page_size: Query>, ) -> poem::Result { diff --git a/explorer/src/service/v2/claim.rs b/explorer/src/service/v2/claim.rs index 9bc96df..d91ebe5 100644 --- a/explorer/src/service/v2/claim.rs +++ b/explorer/src/service/v2/claim.rs @@ -96,25 +96,32 @@ pub struct V2ClaimsData { pub async fn v2_get_claims( api: &Api, - address: Query, + address: Query>, page: Query>, page_size: Query>, ) -> Result { let page = page.0.unwrap_or(1); let page_size = page_size.0.unwrap_or(10); let mut conn = api.storage.lock().await.acquire().await?; - let sql_count = format!( - "SELECT count(*) AS cnt FROM claims WHERE sender='{}'", - address.0.to_lowercase() - ); - let row_cnt = sqlx::query(sql_count.as_str()).fetch_one(&mut conn).await?; - let total: i64 = row_cnt.try_get("cnt")?; - let sql_query = format!( - "SELECT tx,block,sender,amount,height,timestamp,content FROM claims WHERE sender='{}' ORDER BY timestamp DESC LIMIT {} OFFSET {}", - address.0.to_lowercase(), page_size, (page-1)*page_size - ); + let (sql_count, sql_query) = if let Some(addr) = address.0 { + (format!( + "SELECT count(*) AS cnt FROM claims WHERE sender='{}'", + addr.to_lowercase() + ),format!( + "SELECT tx,block,sender,amount,height,timestamp,content FROM claims WHERE sender='{}' ORDER BY timestamp DESC LIMIT {} OFFSET {}", + addr.to_lowercase(), page_size, (page-1)*page_size + )) + } else { + ("SELECT count(*) AS cnt FROM claims".to_string(), + format!( + "SELECT tx,block,sender,amount,height,timestamp,content FROM claims ORDER BY timestamp DESC LIMIT {} OFFSET {}", + page_size, (page-1)*page_size + )) + }; + let row_cnt = sqlx::query(sql_count.as_str()).fetch_one(&mut conn).await?; + let total: i64 = row_cnt.try_get("cnt")?; let mut res: Vec = vec![]; let rows = sqlx::query(sql_query.as_str()).fetch_all(&mut conn).await?; for row in rows {