Struct terminus_store::store::StoreLayerBuilder
source · pub struct StoreLayerBuilder { /* private fields */ }
Expand description
A wrapper over a SimpleLayerBuilder, providing a thread-safe sharable interface.
The SimpleLayerBuilder requires one to have a mutable reference to the underlying LayerBuilder, and on commit it will be consumed. This builder only requires an immutable reference, and uses a futures-aware read-write lock to synchronize access to it between threads. Also, rather than consuming itself on commit, this wrapper will simply mark itself as having committed, returning errors on further calls.
Implementations§
source§impl StoreLayerBuilder
impl StoreLayerBuilder
pub fn with_builder<R, F: FnOnce(&mut Box<dyn LayerBuilder>) -> R>( &self, f: F ) -> Result<R, Error>
sourcepub fn parent(&self) -> Option<Arc<dyn Layer>>
pub fn parent(&self) -> Option<Arc<dyn Layer>>
Returns the parent layer this builder is building on top of, if any.
If there’s no parent, this returns None.
sourcepub fn add_value_triple(&self, triple: ValueTriple) -> Result<(), Error>
pub fn add_value_triple(&self, triple: ValueTriple) -> Result<(), Error>
Add a string triple.
Examples found in repository?
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
async fn process_commands(store_path: &str, graph: &str) -> io::Result<()> {
let store = open_directory_store(store_path);
let graph = store
.open(graph)
.await?
.expect(&format!("expected graph {} to exist", graph));
// There are two types of builders. One creates a new base layer,
// which has no parent. The other creates a child layer, which has
// another layer as its parent.
let builder = match graph.head().await? {
Some(layer) => layer.open_write().await?,
None => store.create_base_layer().await?,
};
let mut stdin = io::BufReader::new(io::stdin()).lines();
while let Some(line) = stdin.next_line().await? {
let segment = line.trim();
if segment.len() == 0 {
continue;
}
let command = parse_command(segment).await?;
// add all the input data into the builder.
// The builder keeps an in-memory list of added and removed
// triples. If the same triple is added and removed on the
// same builder, it is a no-op. This is even the case when it
// is then later re-added on the same builder.
//
// Since no io is happening, adding triples to the builder is
// not a future.
match command {
Command::Add(triple) => builder.add_value_triple(triple)?,
Command::Remove(triple) => builder.remove_value_triple(triple)?,
}
}
// When commit is called, the builder writes its data to
// persistent storage.
let layer = builder.commit().await?;
// While a layer exists now, it's not yet attached to anything,
// and is therefore unusable unless you know the exact identifier
// of the layer itself. To make this the graph data, we have to
// set the grap head to this layer.
graph.set_head(&layer).await?;
println!(
"Added: {}, removed: {}",
layer.triple_layer_addition_count().await?,
layer.triple_layer_removal_count().await?
);
Ok(())
}
sourcepub fn remove_value_triple(&self, triple: ValueTriple) -> Result<(), Error>
pub fn remove_value_triple(&self, triple: ValueTriple) -> Result<(), Error>
Remove a string triple.
Examples found in repository?
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
async fn process_commands(store_path: &str, graph: &str) -> io::Result<()> {
let store = open_directory_store(store_path);
let graph = store
.open(graph)
.await?
.expect(&format!("expected graph {} to exist", graph));
// There are two types of builders. One creates a new base layer,
// which has no parent. The other creates a child layer, which has
// another layer as its parent.
let builder = match graph.head().await? {
Some(layer) => layer.open_write().await?,
None => store.create_base_layer().await?,
};
let mut stdin = io::BufReader::new(io::stdin()).lines();
while let Some(line) = stdin.next_line().await? {
let segment = line.trim();
if segment.len() == 0 {
continue;
}
let command = parse_command(segment).await?;
// add all the input data into the builder.
// The builder keeps an in-memory list of added and removed
// triples. If the same triple is added and removed on the
// same builder, it is a no-op. This is even the case when it
// is then later re-added on the same builder.
//
// Since no io is happening, adding triples to the builder is
// not a future.
match command {
Command::Add(triple) => builder.add_value_triple(triple)?,
Command::Remove(triple) => builder.remove_value_triple(triple)?,
}
}
// When commit is called, the builder writes its data to
// persistent storage.
let layer = builder.commit().await?;
// While a layer exists now, it's not yet attached to anything,
// and is therefore unusable unless you know the exact identifier
// of the layer itself. To make this the graph data, we have to
// set the grap head to this layer.
graph.set_head(&layer).await?;
println!(
"Added: {}, removed: {}",
layer.triple_layer_addition_count().await?,
layer.triple_layer_removal_count().await?
);
Ok(())
}
sourcepub fn committed(&self) -> bool
pub fn committed(&self) -> bool
Returns true if this layer has been committed, and false otherwise.
sourcepub async fn commit_no_load(&self) -> Result<()>
pub async fn commit_no_load(&self) -> Result<()>
Commit the layer to storage without loading the resulting layer.
sourcepub async fn commit(&self) -> Result<StoreLayer>
pub async fn commit(&self) -> Result<StoreLayer>
Commit the layer to storage.
Examples found in repository?
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
async fn process_commands(store_path: &str, graph: &str) -> io::Result<()> {
let store = open_directory_store(store_path);
let graph = store
.open(graph)
.await?
.expect(&format!("expected graph {} to exist", graph));
// There are two types of builders. One creates a new base layer,
// which has no parent. The other creates a child layer, which has
// another layer as its parent.
let builder = match graph.head().await? {
Some(layer) => layer.open_write().await?,
None => store.create_base_layer().await?,
};
let mut stdin = io::BufReader::new(io::stdin()).lines();
while let Some(line) = stdin.next_line().await? {
let segment = line.trim();
if segment.len() == 0 {
continue;
}
let command = parse_command(segment).await?;
// add all the input data into the builder.
// The builder keeps an in-memory list of added and removed
// triples. If the same triple is added and removed on the
// same builder, it is a no-op. This is even the case when it
// is then later re-added on the same builder.
//
// Since no io is happening, adding triples to the builder is
// not a future.
match command {
Command::Add(triple) => builder.add_value_triple(triple)?,
Command::Remove(triple) => builder.remove_value_triple(triple)?,
}
}
// When commit is called, the builder writes its data to
// persistent storage.
let layer = builder.commit().await?;
// While a layer exists now, it's not yet attached to anything,
// and is therefore unusable unless you know the exact identifier
// of the layer itself. To make this the graph data, we have to
// set the grap head to this layer.
graph.set_head(&layer).await?;
println!(
"Added: {}, removed: {}",
layer.triple_layer_addition_count().await?,
layer.triple_layer_removal_count().await?
);
Ok(())
}
sourcepub async fn apply_delta(&self, delta: &StoreLayer) -> Result<(), Error>
pub async fn apply_delta(&self, delta: &StoreLayer) -> Result<(), Error>
Apply all triples added and removed by a layer to this builder.
This is a way to ‘cherry-pick’ a layer on top of another layer, without caring about its history.
sourcepub fn apply_diff(&self, other: &StoreLayer) -> Result<(), Error>
pub fn apply_diff(&self, other: &StoreLayer) -> Result<(), Error>
Apply the changes required to change our parent layer into the given layer.
Trait Implementations§
source§impl Clone for StoreLayerBuilder
impl Clone for StoreLayerBuilder
source§fn clone(&self) -> StoreLayerBuilder
fn clone(&self) -> StoreLayerBuilder
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreAuto Trait Implementations§
impl !RefUnwindSafe for StoreLayerBuilder
impl Send for StoreLayerBuilder
impl Sync for StoreLayerBuilder
impl Unpin for StoreLayerBuilder
impl !UnwindSafe for StoreLayerBuilder
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> CheckedAs for T
impl<T> CheckedAs for T
source§fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
source§impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
source§fn checked_cast_from(src: Src) -> Option<Dst>
fn checked_cast_from(src: Src) -> Option<Dst>
source§impl<T> FmtForward for T
impl<T> FmtForward for T
source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> OverflowingAs for T
impl<T> OverflowingAs for T
source§fn overflowing_as<Dst>(self) -> (Dst, bool)where
T: OverflowingCast<Dst>,
fn overflowing_as<Dst>(self) -> (Dst, bool)where
T: OverflowingCast<Dst>,
source§impl<Src, Dst> OverflowingCastFrom<Src> for Dstwhere
Src: OverflowingCast<Dst>,
impl<Src, Dst> OverflowingCastFrom<Src> for Dstwhere
Src: OverflowingCast<Dst>,
source§fn overflowing_cast_from(src: Src) -> (Dst, bool)
fn overflowing_cast_from(src: Src) -> (Dst, bool)
source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moresource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moresource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R ) -> R
source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.source§impl<T> Pointable for T
impl<T> Pointable for T
source§impl<T> SaturatingAs for T
impl<T> SaturatingAs for T
source§fn saturating_as<Dst>(self) -> Dstwhere
T: SaturatingCast<Dst>,
fn saturating_as<Dst>(self) -> Dstwhere
T: SaturatingCast<Dst>,
source§impl<Src, Dst> SaturatingCastFrom<Src> for Dstwhere
Src: SaturatingCast<Dst>,
impl<Src, Dst> SaturatingCastFrom<Src> for Dstwhere
Src: SaturatingCast<Dst>,
source§fn saturating_cast_from(src: Src) -> Dst
fn saturating_cast_from(src: Src) -> Dst
source§impl<T> Tap for T
impl<T> Tap for T
source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read moresource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read moresource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read moresource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read moresource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read moresource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read moresource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.