Skip to main content

terminus_store/layer/internal/
subject_iterator.rs

1use crate::layer::*;
2use std::cmp::Ordering;
3use std::convert::TryInto;
4use tdb_succinct::*;
5use thiserror::Error;
6
7#[derive(Clone)]
8pub struct InternalLayerTripleSubjectIterator {
9    subjects: Option<MonotonicLogArray>,
10    s_p_adjacency_list: AdjacencyList,
11    sp_o_adjacency_list: AdjacencyList,
12    s_position: u64,
13    s_p_position: u64,
14    sp_o_position: u64,
15    peeked: Option<IdTriple>,
16}
17
18impl InternalLayerTripleSubjectIterator {
19    pub fn new(
20        subjects: Option<MonotonicLogArray>,
21        s_p_adjacency_list: AdjacencyList,
22        sp_o_adjacency_list: AdjacencyList,
23    ) -> Self {
24        Self {
25            subjects,
26            s_p_adjacency_list,
27            sp_o_adjacency_list,
28            s_position: 0,
29            s_p_position: 0,
30            sp_o_position: 0,
31            peeked: None,
32        }
33    }
34
35    pub fn seek_subject(mut self, subject: u64) -> Self {
36        self.seek_subject_ref(subject);
37
38        self
39    }
40
41    pub fn seek_subject_ref(&mut self, subject: u64) {
42        self.peeked = None;
43        if subject == 0 {
44            self.s_position = 0;
45            self.s_p_position = 0;
46            self.sp_o_position = 0;
47
48            return;
49        }
50
51        self.s_position = match self.subjects.as_ref() {
52            None => subject - 1,
53            Some(subjects) => subjects.nearest_index_of(subject) as u64,
54        };
55
56        if self.s_position >= self.s_p_adjacency_list.left_count() as u64 {
57            self.s_p_position = self.s_p_adjacency_list.right_count() as u64;
58            self.sp_o_position = self.sp_o_adjacency_list.right_count() as u64;
59        } else {
60            self.s_p_position = self.s_p_adjacency_list.offset_for(self.s_position + 1);
61            self.sp_o_position = self.sp_o_adjacency_list.offset_for(self.s_p_position + 1);
62        }
63    }
64
65    pub fn seek_subject_predicate(mut self, subject: u64, predicate: u64) -> Self {
66        self.seek_subject_predicate_ref(subject, predicate);
67
68        self
69    }
70
71    pub fn seek_subject_predicate_ref(&mut self, subject: u64, predicate: u64) {
72        if predicate == 0 {
73            // equivalent to seeking subject
74            self.seek_subject_ref(subject);
75            return;
76        }
77
78        self.peeked = None;
79        if subject == 0 {
80            self.s_position = 0;
81            self.s_p_position = 0;
82            self.sp_o_position = 0;
83
84            return;
85        }
86
87        self.s_position = match self.subjects.as_ref() {
88            None => subject - 1,
89            Some(subjects) => subjects.nearest_index_of(subject) as u64,
90        };
91
92        if self.s_position >= self.s_p_adjacency_list.left_count() as u64 {
93            self.s_p_position = self.s_p_adjacency_list.right_count() as u64;
94            self.sp_o_position = self.sp_o_adjacency_list.right_count() as u64;
95        } else {
96            let mut s_p_position = self.s_p_adjacency_list.offset_for(self.s_position + 1);
97            while self.s_p_adjacency_list.num_at_pos(s_p_position) < predicate {
98                s_p_position += 1;
99
100                if self.s_p_adjacency_list.bit_at_pos(s_p_position - 1) {
101                    // we just moved past the end for this subject, without finding the predicate.
102                    // so this is where we have to stop
103                    self.s_position += 1;
104                    break;
105                }
106            }
107            self.s_p_position = s_p_position;
108            self.sp_o_position = self.sp_o_adjacency_list.offset_for(self.s_p_position + 1);
109        }
110    }
111
112    pub fn seek_s_p_pos(&mut self, pos: u64) {
113        self.peeked = None;
114
115        self.s_p_position = pos;
116        self.s_position = self.s_p_adjacency_list.left_at_pos(pos) - 1;
117        self.sp_o_position = self.sp_o_adjacency_list.offset_for(self.s_p_position + 1);
118    }
119
120    pub fn peek(&mut self) -> Option<&IdTriple> {
121        self.peeked = self.next();
122
123        self.peeked.as_ref()
124    }
125}
126
127impl Iterator for InternalLayerTripleSubjectIterator {
128    type Item = IdTriple;
129
130    fn next(&mut self) -> Option<IdTriple> {
131        if self.peeked.is_some() {
132            let peeked = self.peeked;
133            self.peeked = None;
134
135            return peeked;
136        }
137        loop {
138            if self.sp_o_position >= self.sp_o_adjacency_list.right_count() as u64 {
139                return None;
140            } else {
141                let s_pos = self.s_position;
142
143                let s_p_bit = self.s_p_adjacency_list.bit_at_pos(self.s_p_position);
144                let predicate = self.s_p_adjacency_list.num_at_pos(self.s_p_position);
145                if predicate == 0 {
146                    if s_p_bit {
147                        self.s_position += 1;
148                    }
149                    self.s_p_position += 1;
150                    self.sp_o_position += 1;
151                    continue;
152                }
153
154                let sp_o_bit = self.sp_o_adjacency_list.bit_at_pos(self.sp_o_position);
155                let object = self.sp_o_adjacency_list.num_at_pos(self.sp_o_position);
156                if sp_o_bit {
157                    self.s_p_position += 1;
158                    if s_p_bit {
159                        self.s_position += 1;
160                    }
161                }
162                self.sp_o_position += 1;
163
164                if object == 0 {
165                    continue;
166                }
167
168                let subject = match self.subjects.as_ref() {
169                    Some(subjects) => subjects.entry(s_pos.try_into().unwrap()),
170                    None => s_pos + 1,
171                };
172
173                return Some(IdTriple::new(subject, predicate, object));
174            }
175        }
176    }
177}
178
179#[derive(Clone)]
180pub struct OptInternalLayerTripleSubjectIterator(pub Option<InternalLayerTripleSubjectIterator>);
181
182impl OptInternalLayerTripleSubjectIterator {
183    pub fn seek_subject_ref(&mut self, subject: u64) {
184        if let Some(i) = self.0.as_mut() {
185            i.seek_subject_ref(subject)
186        };
187    }
188
189    pub fn seek_subject(self, subject: u64) -> Self {
190        OptInternalLayerTripleSubjectIterator(self.0.map(|i| i.seek_subject(subject)))
191    }
192
193    pub fn seek_subject_predicate_ref(&mut self, subject: u64, predicate: u64) {
194        if let Some(i) = self.0.as_mut() {
195            i.seek_subject_predicate_ref(subject, predicate)
196        };
197    }
198
199    pub fn seek_subject_predicate(self, subject: u64, predicate: u64) -> Self {
200        OptInternalLayerTripleSubjectIterator(
201            self.0.map(|i| i.seek_subject_predicate(subject, predicate)),
202        )
203    }
204
205    pub fn peek(&mut self) -> Option<&IdTriple> {
206        self.0.as_mut().and_then(|i| i.peek())
207    }
208}
209
210impl Iterator for OptInternalLayerTripleSubjectIterator {
211    type Item = IdTriple;
212
213    fn next(&mut self) -> Option<IdTriple> {
214        self.0.as_mut().and_then(|i| i.next())
215    }
216}
217
218#[derive(Clone)]
219pub struct InternalTripleSubjectIterator {
220    positives: Vec<OptInternalLayerTripleSubjectIterator>,
221    negatives: Vec<OptInternalLayerTripleSubjectIterator>,
222}
223
224impl InternalTripleSubjectIterator {
225    pub fn from_layer(layer: &InternalLayer) -> Self {
226        let stack_size = layer.layer_stack_size();
227        let mut positives = Vec::with_capacity(stack_size);
228        let mut negatives = Vec::with_capacity(stack_size);
229
230        positives.push(layer.internal_triple_additions());
231        negatives.push(layer.internal_triple_removals());
232
233        let mut layer_opt = layer.immediate_parent();
234
235        while layer_opt.is_some() {
236            positives.push(layer_opt.unwrap().internal_triple_additions());
237            negatives.push(layer_opt.unwrap().internal_triple_removals());
238
239            layer_opt = layer_opt.unwrap().immediate_parent();
240        }
241
242        Self {
243            positives,
244            negatives,
245        }
246    }
247
248    pub fn seek_subject(mut self, subject: u64) -> Self {
249        for p in self.positives.iter_mut() {
250            p.seek_subject_ref(subject);
251        }
252
253        for n in self.negatives.iter_mut() {
254            n.seek_subject_ref(subject);
255        }
256
257        self
258    }
259
260    pub fn seek_subject_predicate(mut self, subject: u64, predicate: u64) -> Self {
261        for p in self.positives.iter_mut() {
262            p.seek_subject_predicate_ref(subject, predicate);
263        }
264
265        for n in self.negatives.iter_mut() {
266            n.seek_subject_predicate_ref(subject, predicate);
267        }
268
269        self
270    }
271}
272
273impl Iterator for InternalTripleSubjectIterator {
274    type Item = IdTriple;
275
276    fn next(&mut self) -> Option<IdTriple> {
277        'outer: loop {
278            // find the lowest triple.
279            // if that triple appears multiple times, we want the most recent one, which should be the one appearing the earliest in the positives list.
280            let lowest_index = self
281                .positives
282                .iter_mut()
283                .map(|p| p.peek())
284                .enumerate()
285                .filter(|(_, elt)| elt.is_some())
286                .min_by_key(|(_, elt)| elt.unwrap())
287                .map(|(index, _)| index);
288
289            match lowest_index {
290                None => return None,
291                Some(lowest_index) => {
292                    let lowest = self.positives[lowest_index].next().unwrap();
293                    // check all negative layers below the lowest_index for a removal
294                    // if there's a removal, we continue after advancing. if not, it is the result.
295                    // we can be sure that there's only one removal, or we'd have found another addition.
296                    for iter in self.negatives[0..lowest_index].iter_mut() {
297                        if iter.peek() == Some(&lowest) {
298                            iter.next().unwrap();
299                            continue 'outer;
300                        }
301                    }
302
303                    return Some(lowest);
304                }
305            }
306        }
307    }
308}
309
310#[derive(Clone)]
311pub struct InternalTripleStackIterator {
312    positives: Vec<OptInternalLayerTripleSubjectIterator>,
313    negatives: Vec<OptInternalLayerTripleSubjectIterator>,
314}
315
316#[derive(Error, Debug)]
317pub enum LayerStackError {
318    #[error("provided parent was not found")]
319    ParentNotFound,
320}
321
322#[derive(Debug, Clone, Copy, PartialOrd, Ord, PartialEq, Eq)]
323pub enum TripleChange {
324    Addition,
325    Removal,
326}
327
328impl InternalTripleStackIterator {
329    pub fn from_layer_stack(
330        layer: &InternalLayer,
331        parent_id: [u32; 5],
332    ) -> Result<Self, LayerStackError> {
333        let stack_size = layer.layer_stack_size();
334        let mut positives = Vec::with_capacity(stack_size);
335        let mut negatives = Vec::with_capacity(stack_size);
336        positives.push(layer.internal_triple_additions());
337        negatives.push(layer.internal_triple_removals());
338
339        let mut layer_opt = layer.immediate_parent();
340
341        while layer_opt.is_some() && layer_opt.unwrap().name() != parent_id {
342            positives.push(layer_opt.unwrap().internal_triple_additions());
343            negatives.push(layer_opt.unwrap().internal_triple_removals());
344
345            layer_opt = layer_opt.unwrap().immediate_parent();
346        }
347
348        if layer_opt.is_none() || layer_opt.unwrap().name() != parent_id {
349            return Err(LayerStackError::ParentNotFound);
350        }
351
352        positives.shrink_to_fit();
353        negatives.shrink_to_fit();
354
355        Ok(Self {
356            positives,
357            negatives,
358        })
359    }
360
361    pub fn from_parts(
362        positives: Vec<OptInternalLayerTripleSubjectIterator>,
363        negatives: Vec<OptInternalLayerTripleSubjectIterator>,
364    ) -> Self {
365        Self {
366            positives,
367            negatives,
368        }
369    }
370
371    pub fn merge<I: IntoIterator<Item = InternalTripleStackIterator>>(stacks: I) -> Self {
372        let mut positives = Vec::new();
373        let mut negatives = Vec::new();
374
375        for stack in stacks.into_iter() {
376            positives.extend(stack.positives);
377            negatives.extend(stack.negatives);
378        }
379
380        Self {
381            positives,
382            negatives,
383        }
384    }
385}
386
387impl Iterator for InternalTripleStackIterator {
388    type Item = (TripleChange, IdTriple);
389
390    fn next(&mut self) -> Option<(TripleChange, IdTriple)> {
391        'outer: loop {
392            let lowest_pos_index = self
393                .positives
394                .iter_mut()
395                .map(|p| p.peek())
396                .enumerate()
397                .filter(|(_, elt)| elt.is_some())
398                .min_by_key(|(_, elt)| elt.unwrap())
399                .map(|(index, _)| index);
400
401            let lowest_neg_index = self
402                .negatives
403                .iter_mut()
404                .map(|p| p.peek())
405                .enumerate()
406                .filter(|(_, elt)| elt.is_some())
407                .min_by_key(|(_, elt)| elt.unwrap())
408                .map(|(index, _)| index);
409
410            match (lowest_pos_index, lowest_neg_index) {
411                (None, None) => return None,
412                (Some(lowest_pos_index), None) => {
413                    return Some((
414                        TripleChange::Addition,
415                        self.positives[lowest_pos_index].next().unwrap(),
416                    ))
417                }
418                (None, Some(lowest_neg_index)) => {
419                    return Some((
420                        TripleChange::Removal,
421                        self.negatives[lowest_neg_index].next().unwrap(),
422                    ))
423                }
424                (Some(lowest_pos_index), Some(lowest_neg_index)) => {
425                    let lowest_pos = self.positives[lowest_pos_index].peek().unwrap();
426                    let lowest_neg = self.negatives[lowest_neg_index].peek().unwrap();
427                    match lowest_pos.cmp(&lowest_neg) {
428                        Ordering::Less => {
429                            // next change is an addition, and there's no matching removal
430                            return Some((
431                                TripleChange::Addition,
432                                self.positives[lowest_pos_index].next().unwrap(),
433                            ));
434                        }
435                        Ordering::Greater => {
436                            // next change is a removal, and there's no mathcinga ddition
437                            return Some((
438                                TripleChange::Removal,
439                                self.negatives[lowest_neg_index].next().unwrap(),
440                            ));
441                        }
442                        Ordering::Equal => {
443                            // we found both an addition and a removal for the same triple. They cancel eachother.
444                            self.positives[lowest_pos_index].next().unwrap();
445                            self.negatives[lowest_neg_index].next().unwrap();
446                            continue 'outer;
447                        }
448                    }
449                }
450            }
451        }
452    }
453}
454
455#[cfg(test)]
456mod tests {
457    use crate::layer::base::base_tests::*;
458    use crate::layer::child::child_tests::*;
459    use crate::layer::*;
460    use tdb_succinct::TdbDataType;
461
462    use std::sync::Arc;
463
464    #[tokio::test]
465    async fn base_triple_iterator() {
466        let base_layer: InternalLayer = example_base_layer().await.into();
467
468        let triples: Vec<_> = base_layer.internal_triple_additions().collect();
469        let expected = vec![
470            IdTriple::new(1, 1, 1),
471            IdTriple::new(2, 1, 1),
472            IdTriple::new(2, 1, 3),
473            IdTriple::new(2, 3, 6),
474            IdTriple::new(3, 2, 5),
475            IdTriple::new(3, 3, 6),
476            IdTriple::new(4, 3, 6),
477        ];
478
479        assert_eq!(expected, triples);
480    }
481
482    #[tokio::test]
483    async fn base_triple_removal_iterator() {
484        let base_layer: InternalLayer = example_base_layer().await.into();
485
486        let triples: Vec<_> = base_layer.internal_triple_removals().collect();
487        assert!(triples.is_empty());
488    }
489
490    #[tokio::test]
491    async fn base_stubs_triple_iterator() {
492        let files = base_layer_files();
493
494        let mut builder = BaseLayerFileBuilder::from_files(&files).await.unwrap();
495
496        let nodes = vec!["aaaaa", "baa", "bbbbb", "ccccc", "mooo"];
497        let predicates = vec!["abcde", "fghij", "klmno", "lll"];
498        let values = vec!["chicken", "cow", "dog", "pig", "zebra"];
499
500        builder.add_nodes(nodes.into_iter().map(|s| s.to_string()));
501        builder.add_predicates(predicates.into_iter().map(|s| s.to_string()));
502        builder.add_values(values.into_iter().map(|s| String::make_entry(&s)));
503        let mut builder = builder.into_phase2().await.unwrap();
504        builder.add_triple(1, 1, 1).await.unwrap();
505        builder.add_triple(3, 2, 5).await.unwrap();
506        builder.add_triple(5, 3, 6).await.unwrap();
507        builder.finalize().await.unwrap();
508
509        let layer = BaseLayer::load_from_files([1, 2, 3, 4, 5], &files)
510            .await
511            .unwrap();
512
513        let triples: Vec<_> = layer.internal_triple_additions().collect();
514
515        let expected = vec![
516            IdTriple::new(1, 1, 1),
517            IdTriple::new(3, 2, 5),
518            IdTriple::new(5, 3, 6),
519        ];
520
521        assert_eq!(expected, triples);
522    }
523
524    async fn layer_for_seek_tests() -> InternalLayer {
525        let files = base_layer_files();
526
527        let mut builder = BaseLayerFileBuilder::from_files(&files).await.unwrap();
528
529        let nodes = vec!["aaaaa", "baa", "bbbbb", "ccccc", "mooo"];
530        let predicates = vec!["abcde", "fghij", "klmno", "lll"];
531        let values = vec!["chicken", "cow", "dog", "pig", "zebra"];
532
533        builder.add_nodes(nodes.into_iter().map(|s| s.to_string()));
534        builder.add_predicates(predicates.into_iter().map(|s| s.to_string()));
535        builder.add_values(values.into_iter().map(|s| String::make_entry(&s)));
536        let mut builder = builder.into_phase2().await.unwrap();
537        builder.add_triple(1, 1, 1).await.unwrap();
538        builder.add_triple(3, 2, 5).await.unwrap();
539        builder.add_triple(3, 3, 5).await.unwrap();
540        builder.add_triple(5, 3, 6).await.unwrap();
541        builder.finalize().await.unwrap();
542
543        BaseLayer::load_from_files([1, 2, 3, 4, 5], &files)
544            .await
545            .unwrap()
546    }
547
548    #[tokio::test]
549    async fn base_triple_iterator_seek_to_subject() {
550        let layer = layer_for_seek_tests().await;
551
552        let triples: Vec<_> = layer.internal_triple_additions().seek_subject(3).collect();
553
554        let expected = vec![
555            IdTriple::new(3, 2, 5),
556            IdTriple::new(3, 3, 5),
557            IdTriple::new(5, 3, 6),
558        ];
559
560        assert_eq!(expected, triples);
561    }
562
563    #[tokio::test]
564    async fn base_triple_iterator_seek_to_subject_nonexistent() {
565        let layer = layer_for_seek_tests().await;
566
567        let triples: Vec<_> = layer.internal_triple_additions().seek_subject(4).collect();
568
569        let expected = vec![IdTriple::new(5, 3, 6)];
570
571        assert_eq!(expected, triples);
572    }
573
574    #[tokio::test]
575    async fn base_triple_iterator_seek_to_subject_past_end() {
576        let layer = layer_for_seek_tests().await;
577
578        let triples: Vec<_> = layer.internal_triple_additions().seek_subject(7).collect();
579
580        assert!(triples.is_empty());
581    }
582
583    #[tokio::test]
584    async fn base_triple_iterator_seek_to_subject_0() {
585        let layer = layer_for_seek_tests().await;
586
587        let triples: Vec<_> = layer.internal_triple_additions().seek_subject(0).collect();
588
589        let expected = vec![
590            IdTriple::new(1, 1, 1),
591            IdTriple::new(3, 2, 5),
592            IdTriple::new(3, 3, 5),
593            IdTriple::new(5, 3, 6),
594        ];
595
596        assert_eq!(expected, triples);
597    }
598
599    #[tokio::test]
600    async fn base_triple_iterator_seek_to_subject_before_begin() {
601        let files = base_layer_files();
602
603        let mut builder = BaseLayerFileBuilder::from_files(&files).await.unwrap();
604
605        let nodes = vec!["aaaaa", "baa", "bbbbb", "ccccc", "mooo"];
606        let predicates = vec!["abcde", "fghij", "klmno", "lll"];
607        let values = vec!["chicken", "cow", "dog", "pig", "zebra"];
608
609        builder.add_nodes(nodes.into_iter().map(|s| s.to_string()));
610        builder.add_predicates(predicates.into_iter().map(|s| s.to_string()));
611        builder.add_values(values.into_iter().map(|s| String::make_entry(&s)));
612        let mut builder = builder.into_phase2().await.unwrap();
613        builder.add_triple(3, 2, 5).await.unwrap();
614        builder.add_triple(3, 3, 5).await.unwrap();
615        builder.add_triple(5, 3, 6).await.unwrap();
616        builder.finalize().await.unwrap();
617
618        let layer = BaseLayer::load_from_files([1, 2, 3, 4, 5], &files)
619            .await
620            .unwrap();
621
622        let triples: Vec<_> = layer.internal_triple_additions().seek_subject(2).collect();
623
624        let expected = vec![
625            IdTriple::new(3, 2, 5),
626            IdTriple::new(3, 3, 5),
627            IdTriple::new(5, 3, 6),
628        ];
629
630        assert_eq!(expected, triples);
631    }
632
633    async fn layer_for_seek_sp_tests() -> InternalLayer {
634        let files = base_layer_files();
635
636        let mut builder = BaseLayerFileBuilder::from_files(&files).await.unwrap();
637
638        let nodes = vec!["aaaaa", "baa", "bbbbb", "ccccc", "mooo"];
639        let predicates = vec!["abcde", "fghij", "klmno", "lll", "xyz", "yyy"];
640        let values = vec!["chicken", "cow", "dog", "pig", "zebra"];
641
642        builder.add_nodes(nodes.into_iter().map(|s| s.to_string()));
643        builder.add_predicates(predicates.into_iter().map(|s| s.to_string()));
644        builder.add_values(values.into_iter().map(|s| String::make_entry(&s)));
645        let mut builder = builder.into_phase2().await.unwrap();
646        builder.add_triple(1, 1, 1).await.unwrap();
647        builder.add_triple(3, 2, 4).await.unwrap();
648        builder.add_triple(3, 2, 5).await.unwrap();
649        builder.add_triple(3, 4, 2).await.unwrap();
650        builder.add_triple(3, 4, 3).await.unwrap();
651        builder.add_triple(3, 4, 5).await.unwrap();
652        builder.add_triple(5, 3, 6).await.unwrap();
653        builder.finalize().await.unwrap();
654
655        BaseLayer::load_from_files([1, 2, 3, 4, 5], &files)
656            .await
657            .unwrap()
658    }
659
660    #[tokio::test]
661    async fn base_triple_iterator_seek_to_subject_predicate() {
662        let layer = layer_for_seek_sp_tests().await;
663
664        let triples: Vec<_> = layer
665            .internal_triple_additions()
666            .seek_subject_predicate(3, 4)
667            .collect();
668
669        let expected = vec![
670            IdTriple::new(3, 4, 2),
671            IdTriple::new(3, 4, 3),
672            IdTriple::new(3, 4, 5),
673            IdTriple::new(5, 3, 6),
674        ];
675
676        assert_eq!(expected, triples);
677    }
678
679    #[tokio::test]
680    async fn base_triple_iterator_seek_to_subject_predicate_nonexistent() {
681        let layer = layer_for_seek_sp_tests().await;
682
683        let triples: Vec<_> = layer
684            .internal_triple_additions()
685            .seek_subject_predicate(3, 3)
686            .collect();
687
688        let expected = vec![
689            IdTriple::new(3, 4, 2),
690            IdTriple::new(3, 4, 3),
691            IdTriple::new(3, 4, 5),
692            IdTriple::new(5, 3, 6),
693        ];
694
695        assert_eq!(expected, triples);
696    }
697
698    #[tokio::test]
699    async fn base_triple_iterator_seek_to_subject_predicate_pred0() {
700        let layer = layer_for_seek_sp_tests().await;
701
702        let triples: Vec<_> = layer
703            .internal_triple_additions()
704            .seek_subject_predicate(3, 0)
705            .collect();
706
707        let expected = vec![
708            IdTriple::new(3, 2, 4),
709            IdTriple::new(3, 2, 5),
710            IdTriple::new(3, 4, 2),
711            IdTriple::new(3, 4, 3),
712            IdTriple::new(3, 4, 5),
713            IdTriple::new(5, 3, 6),
714        ];
715
716        assert_eq!(expected, triples);
717    }
718
719    #[tokio::test]
720    async fn base_triple_iterator_seek_to_subject_predicate_sub0() {
721        let layer = layer_for_seek_sp_tests().await;
722
723        let triples: Vec<_> = layer
724            .internal_triple_additions()
725            .seek_subject_predicate(0, 2)
726            .collect();
727
728        let expected = vec![
729            IdTriple::new(1, 1, 1),
730            IdTriple::new(3, 2, 4),
731            IdTriple::new(3, 2, 5),
732            IdTriple::new(3, 4, 2),
733            IdTriple::new(3, 4, 3),
734            IdTriple::new(3, 4, 5),
735            IdTriple::new(5, 3, 6),
736        ];
737
738        assert_eq!(expected, triples);
739    }
740
741    #[tokio::test]
742    async fn base_triple_iterator_seek_to_subject_predicate_pred_before() {
743        let layer = layer_for_seek_sp_tests().await;
744
745        let triples: Vec<_> = layer
746            .internal_triple_additions()
747            .seek_subject_predicate(3, 1)
748            .collect();
749
750        let expected = vec![
751            IdTriple::new(3, 2, 4),
752            IdTriple::new(3, 2, 5),
753            IdTriple::new(3, 4, 2),
754            IdTriple::new(3, 4, 3),
755            IdTriple::new(3, 4, 5),
756            IdTriple::new(5, 3, 6),
757        ];
758
759        assert_eq!(expected, triples);
760    }
761
762    #[tokio::test]
763    async fn base_triple_iterator_seek_to_subject_predicate_pred_past_end_of_subject() {
764        let layer = layer_for_seek_sp_tests().await;
765
766        let triples: Vec<_> = layer
767            .internal_triple_additions()
768            .seek_subject_predicate(3, 6)
769            .collect();
770
771        let expected = vec![IdTriple::new(5, 3, 6)];
772
773        assert_eq!(expected, triples);
774    }
775
776    #[tokio::test]
777    async fn base_triple_iterator_seek_to_subject_predicate_pred_past_end() {
778        let layer = layer_for_seek_sp_tests().await;
779
780        let triples: Vec<_> = layer
781            .internal_triple_additions()
782            .seek_subject_predicate(5, 4)
783            .collect();
784
785        assert!(triples.is_empty());
786    }
787
788    #[tokio::test]
789    async fn base_triple_iterator_additions_for_subject() {
790        let layer = layer_for_seek_tests().await;
791
792        let triples: Vec<_> = layer.internal_triple_additions_s(3).collect();
793
794        let expected = vec![IdTriple::new(3, 2, 5), IdTriple::new(3, 3, 5)];
795
796        assert_eq!(expected, triples);
797    }
798
799    #[tokio::test]
800    async fn base_triple_iterator_additions_for_subject_predicate() {
801        let layer = layer_for_seek_sp_tests().await;
802
803        let expected = vec![
804            IdTriple::new(3, 4, 2),
805            IdTriple::new(3, 4, 3),
806            IdTriple::new(3, 4, 5),
807        ];
808
809        let triples: Vec<_> = layer.internal_triple_additions_sp(3, 4).collect();
810
811        assert_eq!(expected, triples);
812    }
813
814    async fn child_layer() -> InternalLayer {
815        let base_layer = example_base_layer().await;
816        let parent: Arc<InternalLayer> = Arc::new(base_layer.into());
817
818        let child_files = child_layer_files();
819
820        let child_builder = ChildLayerFileBuilder::from_files(parent.clone(), &child_files)
821            .await
822            .unwrap();
823        let mut builder = child_builder.into_phase2().await.unwrap();
824        builder.add_triple(1, 2, 3).await.unwrap();
825        builder.add_triple(3, 3, 4).await.unwrap();
826        builder.add_triple(3, 5, 6).await.unwrap();
827        builder.remove_triple(1, 1, 1).await.unwrap();
828        builder.remove_triple(2, 1, 3).await.unwrap();
829        builder.remove_triple(4, 3, 6).await.unwrap();
830        builder.finalize().await.unwrap();
831
832        ChildLayer::load_from_files([5, 4, 3, 2, 1], parent, &child_files)
833            .await
834            .unwrap()
835            .into()
836    }
837
838    #[tokio::test]
839    async fn child_triple_addition_iterator() {
840        let layer = child_layer().await;
841
842        let triples: Vec<_> = layer.internal_triple_additions().collect();
843
844        let expected = vec![
845            IdTriple::new(1, 2, 3),
846            IdTriple::new(3, 3, 4),
847            IdTriple::new(3, 5, 6),
848        ];
849
850        assert_eq!(expected, triples);
851    }
852
853    #[tokio::test]
854    async fn child_triple_removal_iterator() {
855        let layer = child_layer().await;
856
857        let triples: Vec<_> = layer.internal_triple_removals().collect();
858
859        let expected = vec![
860            IdTriple::new(1, 1, 1),
861            IdTriple::new(2, 1, 3),
862            IdTriple::new(4, 3, 6),
863        ];
864
865        assert_eq!(expected, triples);
866    }
867
868    use crate::storage::memory::*;
869    use crate::storage::LayerStore;
870    #[tokio::test]
871    async fn combined_iterator_for_subject() {
872        let store = MemoryLayerStore::new();
873        let mut builder = store.create_base_layer().await.unwrap();
874        let base_name = builder.name();
875
876        builder.add_value_triple(ValueTriple::new_string_value("cow", "says", "moo"));
877        builder.add_value_triple(ValueTriple::new_string_value("duck", "says", "quack"));
878        builder.add_value_triple(ValueTriple::new_node("cow", "likes", "duck"));
879        builder.add_value_triple(ValueTriple::new_node("duck", "hates", "cow"));
880        builder.commit_boxed().await.unwrap();
881
882        builder = store.create_child_layer(base_name).await.unwrap();
883        let child1_name = builder.name();
884
885        builder.add_value_triple(ValueTriple::new_string_value("horse", "says", "neigh"));
886        builder.add_value_triple(ValueTriple::new_node("horse", "likes", "horse"));
887        builder.commit_boxed().await.unwrap();
888
889        builder = store.create_child_layer(child1_name).await.unwrap();
890        let child2_name = builder.name();
891
892        builder.remove_value_triple(ValueTriple::new_node("duck", "hates", "cow"));
893        builder.add_value_triple(ValueTriple::new_node("duck", "likes", "cow"));
894        builder.commit_boxed().await.unwrap();
895
896        builder = store.create_child_layer(child2_name).await.unwrap();
897        let child3_name = builder.name();
898
899        builder.remove_value_triple(ValueTriple::new_node("duck", "likes", "cow"));
900        builder.add_value_triple(ValueTriple::new_node("duck", "hates", "cow"));
901        builder.commit_boxed().await.unwrap();
902
903        builder = store.create_child_layer(child3_name).await.unwrap();
904        let child4_name = builder.name();
905
906        builder.remove_value_triple(ValueTriple::new_node("duck", "hates", "cow"));
907        builder.add_value_triple(ValueTriple::new_node("duck", "likes", "cow"));
908        builder.commit_boxed().await.unwrap();
909
910        let layer = store.get_layer(child4_name).await.unwrap().unwrap();
911
912        let subject_id = layer.subject_id("duck").unwrap();
913        let triples: Vec<_> = layer
914            .triples_s(subject_id)
915            .map(|t| layer.id_triple_to_string(&t).unwrap())
916            .collect();
917
918        let expected = vec![
919            ValueTriple::new_node("duck", "likes", "cow"),
920            ValueTriple::new_string_value("duck", "says", "quack"),
921        ];
922
923        assert_eq!(expected, triples);
924    }
925
926    #[tokio::test]
927    async fn combined_iterator_for_subject_predicate() {
928        let store = MemoryLayerStore::new();
929        let mut builder = store.create_base_layer().await.unwrap();
930        let base_name = builder.name();
931
932        builder.add_value_triple(ValueTriple::new_string_value("cow", "says", "moo"));
933        builder.add_value_triple(ValueTriple::new_string_value("duck", "says", "quack"));
934        builder.add_value_triple(ValueTriple::new_node("cow", "likes", "duck"));
935        builder.add_value_triple(ValueTriple::new_node("duck", "hates", "cow"));
936        builder.commit_boxed().await.unwrap();
937
938        builder = store.create_child_layer(base_name).await.unwrap();
939        let child1_name = builder.name();
940
941        builder.add_value_triple(ValueTriple::new_string_value("horse", "says", "neigh"));
942        builder.add_value_triple(ValueTriple::new_node("horse", "likes", "horse"));
943        builder.commit_boxed().await.unwrap();
944
945        builder = store.create_child_layer(child1_name).await.unwrap();
946        let child2_name = builder.name();
947
948        builder.remove_value_triple(ValueTriple::new_node("duck", "hates", "cow"));
949        builder.add_value_triple(ValueTriple::new_node("duck", "likes", "cow"));
950        builder.add_value_triple(ValueTriple::new_node("duck", "likes", "horse"));
951        builder.commit_boxed().await.unwrap();
952
953        builder = store.create_child_layer(child2_name).await.unwrap();
954        let child3_name = builder.name();
955
956        builder.remove_value_triple(ValueTriple::new_node("duck", "likes", "cow"));
957        builder.add_value_triple(ValueTriple::new_node("duck", "hates", "cow"));
958        builder.add_value_triple(ValueTriple::new_node("duck", "likes", "pig"));
959        builder.commit_boxed().await.unwrap();
960
961        builder = store.create_child_layer(child3_name).await.unwrap();
962        let child4_name = builder.name();
963
964        builder.remove_value_triple(ValueTriple::new_node("duck", "hates", "cow"));
965        builder.remove_value_triple(ValueTriple::new_node("duck", "likes", "horse"));
966        builder.add_value_triple(ValueTriple::new_node("duck", "likes", "cow"));
967        builder.add_value_triple(ValueTriple::new_node("duck", "likes", "rabbit"));
968        builder.commit_boxed().await.unwrap();
969
970        let layer = store.get_layer(child4_name).await.unwrap().unwrap();
971
972        let subject_id = layer.subject_id("duck").unwrap();
973        let predicate_id = layer.predicate_id("likes").unwrap();
974        let triples: Vec<_> = layer
975            .triples_sp(subject_id, predicate_id)
976            .map(|t| layer.id_triple_to_string(&t).unwrap())
977            .collect();
978
979        let expected = vec![
980            ValueTriple::new_node("duck", "likes", "cow"),
981            ValueTriple::new_node("duck", "likes", "pig"),
982            ValueTriple::new_node("duck", "likes", "rabbit"),
983        ];
984
985        assert_eq!(expected, triples);
986    }
987
988    async fn create_stack_for_partial_tests() -> ([u32; 5], Arc<InternalLayer>) {
989        let store = MemoryLayerStore::new();
990        let mut builder = store.create_base_layer().await.unwrap();
991        let base_name = builder.name();
992
993        builder.add_value_triple(ValueTriple::new_string_value("cow", "says", "moo"));
994        builder.add_value_triple(ValueTriple::new_string_value("sheep", "says", "baa"));
995        builder.add_value_triple(ValueTriple::new_string_value("duck", "says", "quack"));
996        builder.add_value_triple(ValueTriple::new_node("cow", "likes", "duck"));
997        builder.add_value_triple(ValueTriple::new_node("duck", "hates", "cow"));
998        builder.commit_boxed().await.unwrap();
999
1000        builder = store.create_child_layer(base_name).await.unwrap();
1001        let child1_name = builder.name();
1002
1003        builder.add_value_triple(ValueTriple::new_string_value("horse", "says", "woof"));
1004        builder.add_value_triple(ValueTriple::new_node("horse", "likes", "horse"));
1005        builder.commit_boxed().await.unwrap();
1006
1007        builder = store.create_child_layer(child1_name).await.unwrap();
1008        let child2_name = builder.name();
1009
1010        builder.remove_value_triple(ValueTriple::new_string_value("horse", "says", "woof"));
1011        builder.remove_value_triple(ValueTriple::new_string_value("sheep", "says", "baa"));
1012
1013        builder.add_value_triple(ValueTriple::new_string_value("horse", "says", "quack"));
1014        builder.add_value_triple(ValueTriple::new_string_value("rabbit", "says", "sniff"));
1015        builder.commit_boxed().await.unwrap();
1016
1017        builder = store.create_child_layer(child2_name).await.unwrap();
1018        let child3_name = builder.name();
1019
1020        builder.remove_value_triple(ValueTriple::new_node("duck", "hates", "cow"));
1021        builder.remove_value_triple(ValueTriple::new_string_value("horse", "says", "quack"));
1022
1023        builder.add_value_triple(ValueTriple::new_node("duck", "likes", "cow"));
1024        builder.add_value_triple(ValueTriple::new_string_value("horse", "says", "neigh"));
1025        builder.commit_boxed().await.unwrap();
1026
1027        (
1028            child1_name,
1029            store.get_layer(child3_name).await.unwrap().unwrap(),
1030        )
1031    }
1032
1033    #[tokio::test]
1034    async fn iterate_partial_stack() {
1035        let (parent_id, layer) = create_stack_for_partial_tests().await;
1036
1037        let iterator = InternalTripleStackIterator::from_layer_stack(&*layer, parent_id).unwrap();
1038        let changes: Vec<_> = iterator
1039            .map(|t| (t.0, layer.id_triple_to_string(&t.1).unwrap()))
1040            .collect();
1041
1042        let additions: Vec<_> = changes
1043            .clone()
1044            .into_iter()
1045            .filter(|(sort, _)| *sort == TripleChange::Addition)
1046            .map(|(_, t)| t)
1047            .collect();
1048
1049        let removals: Vec<_> = changes
1050            .into_iter()
1051            .filter(|(sort, _)| *sort == TripleChange::Removal)
1052            .map(|(_, t)| t)
1053            .collect();
1054
1055        let expected_additions = vec![
1056            ValueTriple::new_node("duck", "likes", "cow"),
1057            ValueTriple::new_string_value("horse", "says", "neigh"),
1058            ValueTriple::new_string_value("rabbit", "says", "sniff"),
1059        ];
1060
1061        let expected_removals = vec![
1062            ValueTriple::new_node("duck", "hates", "cow"),
1063            ValueTriple::new_string_value("sheep", "says", "baa"),
1064            ValueTriple::new_string_value("horse", "says", "woof"),
1065        ];
1066
1067        assert_eq!(expected_additions, additions);
1068        assert_eq!(expected_removals, removals);
1069    }
1070}