1use std::io;
4
5use bytes::Bytes;
6pub use tdb_succinct::storage::{
7 AdjacencyListFiles, AdjacencyListMaps, BitIndexFiles, BitIndexMaps, DictionaryFiles,
8 DictionaryMaps, FileLoad, FileStore, SyncableFile, TypedDictionaryFiles, TypedDictionaryMaps,
9};
10
11#[derive(Clone)]
12pub struct IdMapMaps {
13 pub node_value_idmap_maps: Option<BitIndexMaps>,
14 pub predicate_idmap_maps: Option<BitIndexMaps>,
15}
16
17#[derive(Clone)]
18pub struct IdMapFiles<F: 'static + FileLoad + FileStore> {
19 pub node_value_idmap_files: BitIndexFiles<F>,
20 pub predicate_idmap_files: BitIndexFiles<F>,
21}
22
23impl<F: 'static + FileLoad + FileStore> IdMapFiles<F> {
24 pub async fn map_all(&self) -> io::Result<IdMapMaps> {
25 let node_value_idmap_maps = self.node_value_idmap_files.map_all_if_exists().await?;
26 let predicate_idmap_maps = self.predicate_idmap_files.map_all_if_exists().await?;
27
28 Ok(IdMapMaps {
29 node_value_idmap_maps,
30 predicate_idmap_maps,
31 })
32 }
33}
34
35#[derive(Clone)]
37pub enum LayerFiles<F: 'static + FileLoad + FileStore + Clone> {
38 Base(BaseLayerFiles<F>),
39 Child(ChildLayerFiles<F>),
40}
41
42impl<F: 'static + FileLoad + FileStore + Clone> LayerFiles<F> {
43 pub fn node_dictionary_files(&self) -> &DictionaryFiles<F> {
44 match self {
45 Self::Base(b) => &b.node_dictionary_files,
46 Self::Child(c) => &c.node_dictionary_files,
47 }
48 }
49
50 pub fn predicate_dictionary_files(&self) -> &DictionaryFiles<F> {
51 match self {
52 Self::Base(b) => &b.predicate_dictionary_files,
53 Self::Child(c) => &c.predicate_dictionary_files,
54 }
55 }
56
57 pub fn value_dictionary_files(&self) -> &TypedDictionaryFiles<F> {
58 match self {
59 Self::Base(b) => &b.value_dictionary_files,
60 Self::Child(c) => &c.value_dictionary_files,
61 }
62 }
63
64 pub fn into_base(self) -> BaseLayerFiles<F> {
65 match self {
66 Self::Base(b) => b,
67 _ => panic!("layer files are not for base"),
68 }
69 }
70
71 pub fn into_child(self) -> ChildLayerFiles<F> {
72 match self {
73 Self::Child(c) => c,
74 _ => panic!("layer files are not for child"),
75 }
76 }
77}
78
79#[derive(Clone)]
80pub struct BaseLayerFiles<F: 'static + FileLoad + FileStore> {
81 pub node_dictionary_files: DictionaryFiles<F>,
82 pub predicate_dictionary_files: DictionaryFiles<F>,
83 pub value_dictionary_files: TypedDictionaryFiles<F>,
84
85 pub id_map_files: IdMapFiles<F>,
86
87 pub subjects_file: F,
88 pub objects_file: F,
89
90 pub s_p_adjacency_list_files: AdjacencyListFiles<F>,
91 pub sp_o_adjacency_list_files: AdjacencyListFiles<F>,
92
93 pub o_ps_adjacency_list_files: AdjacencyListFiles<F>,
94
95 pub predicate_wavelet_tree_files: BitIndexFiles<F>,
96}
97
98#[derive(Clone)]
99pub struct BaseLayerMaps {
100 pub node_dictionary_maps: DictionaryMaps,
101 pub predicate_dictionary_maps: DictionaryMaps,
102 pub value_dictionary_maps: TypedDictionaryMaps,
103
104 pub id_map_maps: IdMapMaps,
105
106 pub subjects_map: Option<Bytes>,
107 pub objects_map: Option<Bytes>,
108
109 pub s_p_adjacency_list_maps: AdjacencyListMaps,
110 pub sp_o_adjacency_list_maps: AdjacencyListMaps,
111
112 pub o_ps_adjacency_list_maps: AdjacencyListMaps,
113
114 pub predicate_wavelet_tree_maps: BitIndexMaps,
115}
116
117impl<F: FileLoad + FileStore> BaseLayerFiles<F> {
118 pub async fn map_all(&self) -> io::Result<BaseLayerMaps> {
119 let node_dictionary_maps = self.node_dictionary_files.map_all().await?;
120 let predicate_dictionary_maps = self.predicate_dictionary_files.map_all().await?;
121 let value_dictionary_maps = self.value_dictionary_files.map_all().await?;
122
123 let id_map_maps = self.id_map_files.map_all().await?;
124
125 let subjects_map = self.subjects_file.map_if_exists().await?;
126 let objects_map = self.objects_file.map_if_exists().await?;
127
128 let s_p_adjacency_list_maps = self.s_p_adjacency_list_files.map_all().await?;
129 let sp_o_adjacency_list_maps = self.sp_o_adjacency_list_files.map_all().await?;
130 let o_ps_adjacency_list_maps = self.o_ps_adjacency_list_files.map_all().await?;
131
132 let predicate_wavelet_tree_maps = self.predicate_wavelet_tree_files.map_all().await?;
133
134 Ok(BaseLayerMaps {
135 node_dictionary_maps,
136 predicate_dictionary_maps,
137 value_dictionary_maps,
138
139 id_map_maps,
140
141 subjects_map,
142 objects_map,
143
144 s_p_adjacency_list_maps,
145 sp_o_adjacency_list_maps,
146 o_ps_adjacency_list_maps,
147
148 predicate_wavelet_tree_maps,
149 })
150 }
151}
152
153#[derive(Clone)]
154pub struct ChildLayerFiles<F: 'static + FileLoad + FileStore + Clone + Send + Sync> {
155 pub node_dictionary_files: DictionaryFiles<F>,
156 pub predicate_dictionary_files: DictionaryFiles<F>,
157 pub value_dictionary_files: TypedDictionaryFiles<F>,
158
159 pub id_map_files: IdMapFiles<F>,
160
161 pub pos_subjects_file: F,
162 pub pos_objects_file: F,
163 pub neg_subjects_file: F,
164 pub neg_objects_file: F,
165
166 pub pos_s_p_adjacency_list_files: AdjacencyListFiles<F>,
167 pub pos_sp_o_adjacency_list_files: AdjacencyListFiles<F>,
168 pub pos_o_ps_adjacency_list_files: AdjacencyListFiles<F>,
169 pub neg_s_p_adjacency_list_files: AdjacencyListFiles<F>,
170 pub neg_sp_o_adjacency_list_files: AdjacencyListFiles<F>,
171 pub neg_o_ps_adjacency_list_files: AdjacencyListFiles<F>,
172
173 pub pos_predicate_wavelet_tree_files: BitIndexFiles<F>,
174 pub neg_predicate_wavelet_tree_files: BitIndexFiles<F>,
175}
176
177#[derive(Clone)]
178pub struct ChildLayerMaps {
179 pub node_dictionary_maps: DictionaryMaps,
180 pub predicate_dictionary_maps: DictionaryMaps,
181 pub value_dictionary_maps: TypedDictionaryMaps,
182
183 pub id_map_maps: IdMapMaps,
184
185 pub pos_subjects_map: Bytes,
186 pub pos_objects_map: Bytes,
187 pub neg_subjects_map: Bytes,
188 pub neg_objects_map: Bytes,
189
190 pub pos_s_p_adjacency_list_maps: AdjacencyListMaps,
191 pub pos_sp_o_adjacency_list_maps: AdjacencyListMaps,
192 pub pos_o_ps_adjacency_list_maps: AdjacencyListMaps,
193 pub neg_s_p_adjacency_list_maps: AdjacencyListMaps,
194 pub neg_sp_o_adjacency_list_maps: AdjacencyListMaps,
195 pub neg_o_ps_adjacency_list_maps: AdjacencyListMaps,
196
197 pub pos_predicate_wavelet_tree_maps: BitIndexMaps,
198 pub neg_predicate_wavelet_tree_maps: BitIndexMaps,
199}
200
201impl<F: FileLoad + FileStore + Clone> ChildLayerFiles<F> {
202 pub async fn map_all(&self) -> io::Result<ChildLayerMaps> {
203 let node_dictionary_maps = self.node_dictionary_files.map_all().await?;
204 let predicate_dictionary_maps = self.predicate_dictionary_files.map_all().await?;
205 let value_dictionary_maps = self.value_dictionary_files.map_all().await?;
206
207 let id_map_maps = self.id_map_files.map_all().await?;
208
209 let pos_subjects_map = self.pos_subjects_file.map().await?;
210 let neg_subjects_map = self.neg_subjects_file.map().await?;
211 let pos_objects_map = self.pos_objects_file.map().await?;
212 let neg_objects_map = self.neg_objects_file.map().await?;
213
214 let pos_s_p_adjacency_list_maps = self.pos_s_p_adjacency_list_files.map_all().await?;
215 let pos_sp_o_adjacency_list_maps = self.pos_sp_o_adjacency_list_files.map_all().await?;
216 let pos_o_ps_adjacency_list_maps = self.pos_o_ps_adjacency_list_files.map_all().await?;
217
218 let neg_s_p_adjacency_list_maps = self.neg_s_p_adjacency_list_files.map_all().await?;
219 let neg_sp_o_adjacency_list_maps = self.neg_sp_o_adjacency_list_files.map_all().await?;
220 let neg_o_ps_adjacency_list_maps = self.neg_o_ps_adjacency_list_files.map_all().await?;
221
222 let pos_predicate_wavelet_tree_maps =
223 self.pos_predicate_wavelet_tree_files.map_all().await?;
224 let neg_predicate_wavelet_tree_maps =
225 self.neg_predicate_wavelet_tree_files.map_all().await?;
226
227 Ok(ChildLayerMaps {
228 node_dictionary_maps,
229 predicate_dictionary_maps,
230 value_dictionary_maps,
231
232 id_map_maps,
233
234 pos_subjects_map,
235 pos_objects_map,
236 neg_subjects_map,
237 neg_objects_map,
238
239 pos_s_p_adjacency_list_maps,
240 pos_sp_o_adjacency_list_maps,
241 pos_o_ps_adjacency_list_maps,
242 neg_s_p_adjacency_list_maps,
243 neg_sp_o_adjacency_list_maps,
244 neg_o_ps_adjacency_list_maps,
245
246 pos_predicate_wavelet_tree_maps,
247 neg_predicate_wavelet_tree_maps,
248 })
249 }
250}