vecdb/variants/lazy/from2/
mod.rs

1use allocative::Allocative;
2
3use crate::{
4    AnyBoxedIterableVec, AnyCollectableVec, AnyIterableVec, AnyVec, BoxedVecIterator,
5    CollectableVec, StoredIndex, StoredRaw, VecIteratorExtended, Version,
6};
7
8mod iterator;
9
10pub use iterator::*;
11
12pub type ComputeFrom2<I, T, S1I, S1T, S2I, S2T> = for<'a> fn(
13    I,
14    &mut dyn VecIteratorExtended<I = S1I, T = S1T, Item = S1T>,
15    &mut dyn VecIteratorExtended<I = S2I, T = S2T, Item = S2T>,
16) -> Option<T>;
17
18#[derive(Clone, Allocative)]
19pub struct LazyVecFrom2<I, T, S1I, S1T, S2I, S2T>
20where
21    S1T: Clone,
22    S2T: Clone,
23{
24    name: String,
25    version: Version,
26    #[allocative(skip)]
27    source1: AnyBoxedIterableVec<S1I, S1T>,
28    #[allocative(skip)]
29    source2: AnyBoxedIterableVec<S2I, S2T>,
30    #[allocative(skip)]
31    compute: ComputeFrom2<I, T, S1I, S1T, S2I, S2T>,
32}
33
34impl<I, T, S1I, S1T, S2I, S2T> LazyVecFrom2<I, T, S1I, S1T, S2I, S2T>
35where
36    I: StoredIndex,
37    T: StoredRaw,
38    S1I: StoredIndex,
39    S1T: StoredRaw,
40    S2I: StoredIndex,
41    S2T: StoredRaw,
42{
43    pub fn init(
44        name: &str,
45        version: Version,
46        source1: AnyBoxedIterableVec<S1I, S1T>,
47        source2: AnyBoxedIterableVec<S2I, S2T>,
48        compute: ComputeFrom2<I, T, S1I, S1T, S2I, S2T>,
49    ) -> Self {
50        if ([
51            source1.index_type_to_string(),
52            source2.index_type_to_string(),
53        ])
54        .into_iter()
55        .filter(|t| *t == I::to_string())
56        .count()
57            == 0
58        {
59            panic!("At least one should have same index");
60        }
61
62        Self {
63            name: name.to_string(),
64            version,
65            source1,
66            source2,
67            compute,
68        }
69    }
70
71    fn version(&self) -> Version {
72        self.version
73    }
74}
75
76impl<'a, I, T, S1I, S1T, S2I, S2T> IntoIterator for &'a LazyVecFrom2<I, T, S1I, S1T, S2I, S2T>
77where
78    I: StoredIndex,
79    T: StoredRaw + 'a,
80    S1I: StoredIndex,
81    S1T: StoredRaw,
82    S2I: StoredIndex,
83    S2T: StoredRaw,
84{
85    type Item = T;
86    type IntoIter = LazyVecFrom2Iterator<'a, I, T, S1I, S1T, S2I, S2T>;
87
88    fn into_iter(self) -> Self::IntoIter {
89        LazyVecFrom2Iterator::new(self)
90    }
91}
92
93impl<I, T, S1I, S1T, S2I, S2T> AnyVec for LazyVecFrom2<I, T, S1I, S1T, S2I, S2T>
94where
95    I: StoredIndex,
96    T: StoredRaw,
97    S1I: StoredIndex,
98    S1T: StoredRaw,
99    S2I: StoredIndex,
100    S2T: StoredRaw,
101{
102    fn version(&self) -> Version {
103        self.version()
104    }
105
106    fn name(&self) -> &str {
107        self.name.as_str()
108    }
109
110    fn index_type_to_string(&self) -> &'static str {
111        I::to_string()
112    }
113
114    fn len(&self) -> usize {
115        let len1 = if self.source1.index_type_to_string() == I::to_string() {
116            self.source1.len()
117        } else {
118            usize::MAX
119        };
120        let len2 = if self.source2.index_type_to_string() == I::to_string() {
121            self.source2.len()
122        } else {
123            usize::MAX
124        };
125        len1.min(len2)
126    }
127
128    #[inline]
129    fn value_type_to_size_of(&self) -> usize {
130        size_of::<T>()
131    }
132
133    #[inline]
134    fn region_names(&self) -> Vec<String> {
135        vec![]
136    }
137}
138
139impl<I, T, S1I, S1T, S2I, S2T> AnyIterableVec<I, T> for LazyVecFrom2<I, T, S1I, S1T, S2I, S2T>
140where
141    I: StoredIndex,
142    T: StoredRaw,
143    S1I: StoredIndex,
144    S1T: StoredRaw,
145    S2I: StoredIndex,
146    S2T: StoredRaw,
147{
148    fn boxed_iter(&self) -> BoxedVecIterator<'_, I, T> {
149        Box::new(self.into_iter())
150    }
151}
152
153impl<I, T, S1I, S1T, S2I, S2T> AnyCollectableVec for LazyVecFrom2<I, T, S1I, S1T, S2I, S2T>
154where
155    I: StoredIndex,
156    T: StoredRaw,
157    S1I: StoredIndex,
158    S1T: StoredRaw,
159    S2I: StoredIndex,
160    S2T: StoredRaw,
161{
162    fn collect_range_json_bytes(&self, from: Option<usize>, to: Option<usize>) -> Vec<u8> {
163        CollectableVec::collect_range_json_bytes(self, from, to)
164    }
165
166    fn collect_range_string(&self, from: Option<usize>, to: Option<usize>) -> Vec<String> {
167        CollectableVec::collect_range_string(self, from, to)
168    }
169}