iota_indexer/models/
address_metrics.rs1use std::collections::HashMap;
6
7use diesel::{prelude::*, sql_types::BigInt};
8use iota_json_rpc_types::AddressMetrics;
9
10use crate::schema::{active_addresses, address_metrics, addresses};
11
12#[derive(Clone, Debug, Queryable, Insertable)]
14#[diesel(table_name = addresses)]
15pub struct StoredAddress {
16 pub address: Vec<u8>,
17 pub first_appearance_tx: i64,
18 pub first_appearance_time: i64,
19 pub last_appearance_tx: i64,
20 pub last_appearance_time: i64,
21}
22
23#[derive(Clone, Debug, Queryable, Insertable)]
25#[diesel(table_name = active_addresses)]
26pub struct StoredActiveAddress {
27 pub address: Vec<u8>,
28 pub first_appearance_tx: i64,
29 pub first_appearance_time: i64,
30 pub last_appearance_tx: i64,
31 pub last_appearance_time: i64,
32}
33
34impl From<StoredAddress> for StoredActiveAddress {
35 fn from(address: StoredAddress) -> Self {
36 StoredActiveAddress {
37 address: address.address,
38 first_appearance_tx: address.first_appearance_tx,
39 first_appearance_time: address.first_appearance_time,
40 last_appearance_tx: address.last_appearance_tx,
41 last_appearance_time: address.last_appearance_time,
42 }
43 }
44}
45
46#[derive(Clone, Debug, Default, Queryable, Insertable, QueryableByName)]
47#[diesel(table_name = address_metrics)]
48pub struct StoredAddressMetrics {
49 #[diesel(sql_type = BigInt)]
50 pub checkpoint: i64,
51 #[diesel(sql_type = BigInt)]
52 pub epoch: i64,
53 #[diesel(sql_type = BigInt)]
54 pub timestamp_ms: i64,
55 #[diesel(sql_type = BigInt)]
56 pub cumulative_addresses: i64,
57 #[diesel(sql_type = BigInt)]
58 pub cumulative_active_addresses: i64,
59 #[diesel(sql_type = BigInt)]
60 pub daily_active_addresses: i64,
61}
62
63impl From<StoredAddressMetrics> for AddressMetrics {
64 fn from(metrics: StoredAddressMetrics) -> Self {
65 Self {
66 checkpoint: metrics.checkpoint as u64,
67 epoch: metrics.epoch as u64,
68 timestamp_ms: metrics.timestamp_ms as u64,
69 cumulative_addresses: metrics.cumulative_addresses as u64,
70 cumulative_active_addresses: metrics.cumulative_active_addresses as u64,
71 daily_active_addresses: metrics.daily_active_addresses as u64,
72 }
73 }
74}
75
76#[derive(Clone, Debug)]
77pub struct AddressInfoToCommit {
78 pub address: Vec<u8>,
79 pub tx_seq: i64,
80 pub timestamp_ms: i64,
81}
82
83pub fn dedup_addresses(addrs_to_commit: Vec<AddressInfoToCommit>) -> Vec<StoredAddress> {
84 let mut compressed_addr_map: HashMap<_, StoredAddress> = HashMap::new();
85 for addr_to_commit in addrs_to_commit {
86 let entry = compressed_addr_map
87 .entry(addr_to_commit.address.clone())
88 .or_insert_with(|| StoredAddress {
89 address: addr_to_commit.address.clone(),
90 first_appearance_time: addr_to_commit.timestamp_ms,
91 first_appearance_tx: addr_to_commit.tx_seq,
92 last_appearance_time: addr_to_commit.timestamp_ms,
93 last_appearance_tx: addr_to_commit.tx_seq,
94 });
95
96 if addr_to_commit.timestamp_ms < entry.first_appearance_time {
97 entry.first_appearance_time = addr_to_commit.timestamp_ms;
98 entry.first_appearance_tx = addr_to_commit.tx_seq;
99 }
100 if addr_to_commit.timestamp_ms > entry.last_appearance_time {
101 entry.last_appearance_time = addr_to_commit.timestamp_ms;
102 entry.last_appearance_tx = addr_to_commit.tx_seq;
103 }
104 }
105 compressed_addr_map.values().cloned().collect()
106}
107
108#[derive(Clone, Debug)]
109pub struct TxTimestampInfo {
110 pub tx_seq: i64,
111 pub timestamp_ms: i64,
112}