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 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 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 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 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 return Some((
431 TripleChange::Addition,
432 self.positives[lowest_pos_index].next().unwrap(),
433 ));
434 }
435 Ordering::Greater => {
436 return Some((
438 TripleChange::Removal,
439 self.negatives[lowest_neg_index].next().unwrap(),
440 ));
441 }
442 Ordering::Equal => {
443 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}