diff --git a/kermit-ds/src/lib.rs b/kermit-ds/src/lib.rs index 076b238..099fab7 100644 --- a/kermit-ds/src/lib.rs +++ b/kermit-ds/src/lib.rs @@ -1 +1,2 @@ +pub mod relation; pub mod relation_trie; diff --git a/kermit-ds/src/relation.rs b/kermit-ds/src/relation.rs new file mode 100644 index 0000000..d99b267 --- /dev/null +++ b/kermit-ds/src/relation.rs @@ -0,0 +1,9 @@ +pub trait Relation +where + KT: PartialOrd + PartialEq + Clone, +{ + fn cardinality(&self) -> usize; + fn insert(&mut self, tuple: Vec) -> bool; + fn insert_all(&mut self, tuples: Vec>) -> bool; + fn from_tuples(cardinality: usize, tuples: Vec>) -> Self; +} diff --git a/kermit-ds/src/relation_trie/mod.rs b/kermit-ds/src/relation_trie/mod.rs index f159410..827dcf2 100644 --- a/kermit-ds/src/relation_trie/mod.rs +++ b/kermit-ds/src/relation_trie/mod.rs @@ -7,7 +7,10 @@ pub mod variable_type; #[cfg(test)] mod tests { use { - crate::relation_trie::{node::TrieFields, trie::RelationTrie, trie_builder::TrieBuilder}, + crate::{ + relation::Relation, + relation_trie::{node::TrieFields, trie::RelationTrie, trie_builder::TrieBuilder}, + }, kermit_iters::{ linear::LinearIterator, trie::{TrieIterable, TrieIterator}, diff --git a/kermit-ds/src/relation_trie/node.rs b/kermit-ds/src/relation_trie/node.rs index 85aa5fc..4986850 100644 --- a/kermit-ds/src/relation_trie/node.rs +++ b/kermit-ds/src/relation_trie/node.rs @@ -74,9 +74,9 @@ where { fn children_mut(&mut self) -> &mut Vec>; - fn insert_internal(&mut self, tuple: Vec) { + fn insert_internal(&mut self, tuple: Vec) -> bool { if tuple.is_empty() { - return; + return true; } let mut current_children = self.children_mut(); @@ -108,6 +108,7 @@ where } } } + true } } diff --git a/kermit-ds/src/relation_trie/trie.rs b/kermit-ds/src/relation_trie/trie.rs index 22cd398..5fe2915 100644 --- a/kermit-ds/src/relation_trie/trie.rs +++ b/kermit-ds/src/relation_trie/trie.rs @@ -1,4 +1,7 @@ -use crate::relation_trie::node::{Internal, Node, TrieFields}; +use crate::{ + relation::Relation, + relation_trie::node::{Internal, Node, TrieFields}, +}; /// Trie data structure for relations. #[derive(Clone, Debug)] @@ -12,14 +15,38 @@ where children: Vec>, } +impl Relation for RelationTrie +where + KT: PartialOrd + PartialEq + Clone, +{ + fn cardinality(&self) -> usize { self.cardinality } + + fn insert(&mut self, tuple: Vec) -> bool { + if tuple.len() != self.cardinality { + panic!("Arity doesn't match."); + } + self.insert_internal(tuple) + } + + fn insert_all(&mut self, tuples: Vec>) -> bool { + for tuple in tuples { + if !self.insert(tuple) { + panic!("Failed to insert tuple.") + } + } + true + } + + fn from_tuples(cardinality: usize, tuples: Vec>) -> Self { + RelationTrie::from_mut_tuples(cardinality, tuples) + } +} + /// Trie implementation. impl RelationTrie where KT: PartialOrd + PartialEq + Clone, { - /// Cardinality of the trie's relations. - pub fn cardinality(&self) -> usize { self.cardinality } - /// Construct an empty Trie. /// /// # Panics @@ -40,7 +67,9 @@ where assert!(tuples.iter().all(|tuple| tuple.len() == cardinality)); let mut trie = RelationTrie::new(cardinality); for tuple in tuples { - trie.insert(tuple).unwrap(); + if !trie.insert(tuple) { + panic!("Failed to build from tuples."); + } } trie } @@ -66,15 +95,6 @@ where }); RelationTrie::from_tuples(cardinality, tuples) } - - /// Insert a tuple into the Trie. - pub fn insert(&mut self, tuple: Vec) -> Result<(), &'static str> { - if tuple.len() != self.cardinality { - return Err("Arity doesn't match."); - } - self.insert_internal(tuple); - Ok(()) - } } impl TrieFields for RelationTrie {