tracks lexicons and how many times they appeared on the jetstream

refactor(server): use either instead of boxed iter

ptr.pet 925dbc95 7cd979b3

verified
Changed files
+9 -11
server
src
db
+9 -11
server/src/db/mod.rs
···
};
use fjall::{Config, Keyspace, Partition, PartitionCreateOptions, Slice};
-
use itertools::Itertools;
+
use itertools::{Either, Itertools};
use ordered_varint::Variable;
use rkyv::{Archive, Deserialize, Serialize, rancor::Error};
use smol_str::SmolStr;
···
Ok(written)
}
}
-
-
type BoxedIter<T> = Box<dyn Iterator<Item = T>>;
// counts is nsid -> NsidCounts
// hits is tree per nsid: varint start time + varint end time -> block of hits
···
.filter(|k| k.deref() != "_counts")
}
-
pub fn get_hits_debug(&self, nsid: &str) -> BoxedIter<AppResult<(Slice, Slice)>> {
-
self.maybe_run_in_nsid_tree(nsid, |handle| -> BoxedIter<AppResult<(Slice, Slice)>> {
-
Box::new(
+
pub fn get_hits_debug(&self, nsid: &str) -> impl Iterator<Item = AppResult<(Slice, Slice)>> {
+
self.maybe_run_in_nsid_tree(nsid, |handle| {
+
Either::Left(
handle
.tree
.iter()
···
.map(|res| res.map_err(AppError::from)),
)
})
-
.unwrap_or_else(|| Box::new(std::iter::empty()))
+
.unwrap_or_else(|| Either::Right(std::iter::empty()))
}
pub fn get_hits(
&self,
nsid: &str,
range: impl RangeBounds<u64> + std::fmt::Debug,
-
) -> BoxedIter<AppResult<Item>> {
+
) -> impl Iterator<Item = AppResult<Item>> {
let start = range
.start_bound()
.cloned()
···
Bound::Unbounded => u64::MAX,
};
-
self.maybe_run_in_nsid_tree(nsid, move |handle| -> BoxedIter<AppResult<Item>> {
+
self.maybe_run_in_nsid_tree(nsid, move |handle| {
let map_block = move |(key, val)| {
let mut key_reader = Cursor::new(key);
let start_timestamp = key_reader.read_varint::<u64>()?;
···
Ok(items)
};
-
Box::new(
+
Either::Left(
handle
.tree
.range(TimestampRange { start, end })
···
.flatten(),
)
})
-
.unwrap_or_else(|| Box::new(std::iter::empty()))
+
.unwrap_or_else(|| Either::Right(std::iter::empty()))
}
pub fn tracking_since(&self) -> AppResult<u64> {