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}