Skip to content

Commit 303b424

Browse files
authored
feat(multi): add sort order for chain metrics (#1635)
* feat: add sort order for chain metrics * fmt
1 parent 4fd8b26 commit 303b424

6 files changed

Lines changed: 49 additions & 10 deletions

File tree

multichain-aggregator/multichain-aggregator-logic/src/services/cluster.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ use crate::{
3232
domains::{Domain, DomainInfo, ProtocolInfo},
3333
hashes::{Hash, HashType},
3434
interop_messages::{ExtendedInteropMessage, MessageDirection},
35+
order_direction::OrderDirection,
3536
portfolio::AddressPortfolio,
3637
search_results::{QuickSearchResult, Redirect},
3738
tokens::{AggregatedToken, TokenListUpdate, TokenType},
@@ -158,6 +159,7 @@ impl Cluster {
158159
pub async fn list_chains(
159160
&self,
160161
sort_metric: Option<ChainMetricKind>,
162+
order_direction: Option<OrderDirection>,
161163
) -> Result<Vec<Chain>, ServiceError> {
162164
let chain_ids = self.active_chain_ids().await?.into_iter().collect();
163165

@@ -167,7 +169,9 @@ impl Cluster {
167169
.map(|c| c.into())
168170
.collect::<Vec<Chain>>();
169171

170-
let metrics = self.list_chain_metrics(sort_metric).await?;
172+
let metrics = self
173+
.list_chain_metrics(sort_metric, order_direction)
174+
.await?;
171175
let order_map = metrics
172176
.iter()
173177
.enumerate()
@@ -182,6 +186,7 @@ impl Cluster {
182186
pub async fn list_chain_metrics(
183187
&self,
184188
sort_metric: Option<ChainMetricKind>,
189+
order_direction: Option<OrderDirection>,
185190
) -> Result<Vec<ChainMetrics>, ServiceError> {
186191
let chain_ids = self.active_chain_ids().await?;
187192
let key = format!("{}:chain_metrics", self.name);
@@ -196,12 +201,19 @@ impl Cluster {
196201
let mut metrics = maybe_cache_lookup!(self.caches.chain_metrics.as_ref(), key, get)?;
197202

198203
let sort_metric = sort_metric.unwrap_or_default();
204+
let desc = order_direction.unwrap_or_default() == OrderDirection::Desc;
199205
metrics.sort_by(|left, right| {
200206
let ordering = match (
201207
left.metric_value_for_sorting(sort_metric),
202208
right.metric_value_for_sorting(sort_metric),
203209
) {
204-
(Some(l), Some(r)) => r.total_cmp(&l),
210+
(Some(l), Some(r)) => {
211+
if desc {
212+
r.total_cmp(&l)
213+
} else {
214+
l.total_cmp(&r)
215+
}
216+
}
205217
(Some(_), None) => Ordering::Less,
206218
(None, Some(_)) => Ordering::Greater,
207219
(None, None) => Ordering::Equal,

multichain-aggregator/multichain-aggregator-logic/src/types/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ pub mod domains;
1212
pub mod hashes;
1313
pub mod interop_message_transfers;
1414
pub mod interop_messages;
15+
pub mod order_direction;
1516
pub mod poor_reputation_tokens;
1617
pub mod portfolio;
1718
pub mod sea_orm_wrappers;
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/// Sort order for list endpoints (e.g. "asc" or "desc").
2+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, strum::Display, strum::EnumString)]
3+
#[strum(serialize_all = "snake_case")]
4+
pub enum OrderDirection {
5+
Asc,
6+
#[default]
7+
Desc,
8+
}

multichain-aggregator/multichain-aggregator-proto/proto/v1/cluster-explorer.proto

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,9 @@ message ListClusterChainsRequest {
8787
string cluster_id = 1;
8888
// Metric used to sort chains. Supported values: active_accounts, daily_transactions,
8989
// new_addresses, tps. Defaults to active_accounts.
90-
optional string sort_by = 2;
90+
optional string sort = 2;
91+
// Sort order: "asc" or "desc". Defaults to "desc" (higher values first).
92+
optional string order = 3;
9193
}
9294

9395
message ListClusterChainsResponse {
@@ -112,7 +114,9 @@ message ListChainMetricsRequest {
112114
string cluster_id = 1;
113115
// Metric used to sort chain metrics. Supported values: active_accounts, daily_transactions,
114116
// new_addresses, tps. Defaults to active_accounts.
115-
optional string sort_by = 2;
117+
optional string sort = 2;
118+
// Sort order: "asc" or "desc". Defaults to "desc" (higher values first).
119+
optional string order = 3;
116120
}
117121

118122
message ListChainMetricsResponse {

multichain-aggregator/multichain-aggregator-proto/swagger/v1/multichain-aggregator.swagger.yaml

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -292,13 +292,18 @@ paths:
292292
in: path
293293
required: true
294294
type: string
295-
- name: sort_by
295+
- name: sort
296296
description: |-
297297
Metric used to sort chain metrics. Supported values: active_accounts, daily_transactions,
298298
new_addresses, tps. Defaults to active_accounts.
299299
in: query
300300
required: false
301301
type: string
302+
- name: order
303+
description: 'Sort order: "asc" or "desc". Defaults to "desc" (higher values first).'
304+
in: query
305+
required: false
306+
type: string
302307
tags:
303308
- ClusterExplorerService
304309
/api/v1/clusters/{cluster_id}/chains:
@@ -318,13 +323,18 @@ paths:
318323
in: path
319324
required: true
320325
type: string
321-
- name: sort_by
326+
- name: sort
322327
description: |-
323328
Metric used to sort chains. Supported values: active_accounts, daily_transactions,
324329
new_addresses, tps. Defaults to active_accounts.
325330
in: query
326331
required: false
327332
type: string
333+
- name: order
334+
description: 'Sort order: "asc" or "desc". Defaults to "desc" (higher values first).'
335+
in: query
336+
required: false
337+
type: string
328338
tags:
329339
- ClusterExplorerService
330340
/api/v1/clusters/{cluster_id}/domain-protocols:

multichain-aggregator/multichain-aggregator-server/src/services/cluster_explorer.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,10 @@ impl ClusterExplorerService for ClusterExplorer {
4747
) -> Result<Response<ListClusterChainsResponse>, Status> {
4848
let inner = request.into_inner();
4949

50-
let sort_metric = inner.sort_by.map(parse_query).transpose()?;
50+
let sort_metric = inner.sort.map(parse_query).transpose()?;
51+
let order_direction = inner.order.map(parse_query).transpose()?;
5152
let cluster = self.try_get_cluster(&inner.cluster_id)?;
52-
let chains = cluster.list_chains(sort_metric).await?;
53+
let chains = cluster.list_chains(sort_metric, order_direction).await?;
5354

5455
let items = chains
5556
.into_iter()
@@ -65,9 +66,12 @@ impl ClusterExplorerService for ClusterExplorer {
6566
) -> Result<Response<ListChainMetricsResponse>, Status> {
6667
let inner = request.into_inner();
6768

68-
let sort_metric = inner.sort_by.map(parse_query).transpose()?;
69+
let sort_metric = inner.sort.map(parse_query).transpose()?;
70+
let order_direction = inner.order.map(parse_query).transpose()?;
6971
let cluster = self.try_get_cluster(&inner.cluster_id)?;
70-
let metrics = cluster.list_chain_metrics(sort_metric).await?;
72+
let metrics = cluster
73+
.list_chain_metrics(sort_metric, order_direction)
74+
.await?;
7175

7276
let items = metrics.into_iter().map(|m| m.into()).collect();
7377

0 commit comments

Comments
 (0)