vecdb/variants/lazy/from2/
mod.rs1use 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}