sui_indexer_alt_reader/
tx_digests.rs1use std::collections::BTreeSet;
5use std::collections::HashMap;
6
7use async_graphql::dataloader::Loader;
8use diesel::ExpressionMethods;
9use diesel::QueryDsl;
10use sui_indexer_alt_schema::schema::tx_digests;
11use sui_indexer_alt_schema::transactions::StoredTxDigest;
12
13use crate::error::Error;
14use crate::pg_reader::PgReader;
15
16#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
18pub struct TxDigestKey(pub u64);
19
20#[async_trait::async_trait]
21impl Loader<TxDigestKey> for PgReader {
22 type Value = StoredTxDigest;
23 type Error = Error;
24
25 async fn load(&self, keys: &[TxDigestKey]) -> Result<HashMap<TxDigestKey, Self::Value>, Error> {
26 use tx_digests::dsl as d;
27
28 if keys.is_empty() {
29 return Ok(HashMap::new());
30 }
31
32 let mut conn = self.connect().await?;
33
34 let seqs: BTreeSet<_> = keys.iter().map(|d| d.0 as i64).collect();
35 let stored: Vec<StoredTxDigest> = conn
36 .results(d::tx_digests.filter(d::tx_sequence_number.eq_any(seqs)))
37 .await?;
38
39 Ok(stored
40 .into_iter()
41 .map(|stored| {
42 let key = TxDigestKey(stored.tx_sequence_number as u64);
43 (key, stored)
44 })
45 .collect())
46 }
47}