Skip to main content

sui_indexer_alt_reader/
tx_digests.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4use 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/// Key for fetching a transaction's digest by its sequence number.
17#[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}