sui_indexer_alt_reader/
cp_sequence_numbers.rs1use 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#[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}