Skip to main content

sui_indexer_alt_reader/
cp_sequence_numbers.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4use std::collections::HashMap;
5
6use async_graphql::dataloader::Loader;
7use diesel::ExpressionMethods;
8use diesel::QueryDsl;
9use sui_indexer_alt_schema::cp_sequence_numbers::StoredCpSequenceNumbers;
10use sui_indexer_alt_schema::schema::cp_sequence_numbers;
11
12use crate::error::Error;
13use crate::pg_reader::PgReader;
14
15/// Key for fetching information about checkpoint sequence numbers.
16#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
17pub struct CpSequenceNumberKey(pub u64);
18
19#[async_trait::async_trait]
20impl Loader<CpSequenceNumberKey> for PgReader {
21    type Value = StoredCpSequenceNumbers;
22    type Error = Error;
23
24    async fn load(
25        &self,
26        keys: &[CpSequenceNumberKey],
27    ) -> Result<HashMap<CpSequenceNumberKey, Self::Value>, Error> {
28        use cp_sequence_numbers::dsl as c;
29
30        if keys.is_empty() {
31            return Ok(HashMap::new());
32        }
33
34        let mut conn = self.connect().await?;
35
36        let ids: Vec<_> = keys.iter().map(|e| e.0 as i64).collect();
37        let epochs: Vec<StoredCpSequenceNumbers> = conn
38            .results(c::cp_sequence_numbers.filter(c::cp_sequence_number.eq_any(ids)))
39            .await?;
40
41        Ok(epochs
42            .into_iter()
43            .map(|c| (CpSequenceNumberKey(c.cp_sequence_number as u64), c))
44            .collect())
45    }
46}