mod graph_builder;
mod index;
use super::Vault;
use crate::note::Note;
use graph_builder::GraphBuilder;
use petgraph::{
EdgeType, Graph,
graph::{DiGraph, UnGraph},
};
use std::marker::{Send, Sync};
impl<F> Vault<F>
where
F: Note,
{
#[cfg_attr(docsrs, doc(cfg(feature = "petgraph")))]
#[cfg_attr(feature = "tracing", tracing::instrument(skip(self), fields(path = %self.path.display(), count_notes = %self.notes.len())))]
fn get_graph<Ty>(&self) -> Result<Graph<&F, (), Ty>, F::Error>
where
Ty: EdgeType,
{
#[cfg(feature = "tracing")]
tracing::debug!("Building graph");
let graph_builder = GraphBuilder::new(self);
graph_builder.build()
}
#[cfg_attr(docsrs, doc(cfg(feature = "petgraph")))]
#[cfg_attr(docsrs, doc(cfg(feature = "rayon")))]
#[cfg(feature = "rayon")]
fn par_get_graph<Ty>(&self) -> Result<Graph<&F, (), Ty>, F::Error>
where
F: Send + Sync,
F::Error: Send,
Ty: EdgeType + Send,
{
#[cfg(feature = "tracing")]
tracing::debug!("Building graph with parallel");
let graph_builder = GraphBuilder::new(self);
graph_builder.par_build()
}
#[cfg_attr(docsrs, doc(cfg(feature = "petgraph")))]
#[cfg_attr(feature = "tracing", tracing::instrument(skip(self), fields(path = %self.path.display(), count_notes = %self.notes.len())))]
pub fn get_digraph(&self) -> Result<DiGraph<&F, ()>, F::Error> {
#[cfg(feature = "tracing")]
tracing::debug!("Building directed graph");
self.get_graph()
}
#[cfg_attr(docsrs, doc(cfg(feature = "petgraph")))]
#[cfg_attr(docsrs, doc(cfg(feature = "rayon")))]
#[cfg(feature = "rayon")]
#[cfg_attr(feature = "tracing", tracing::instrument(skip(self), fields(path = %self.path.display(), count_notes = %self.notes.len())))]
pub fn par_get_digraph(&self) -> Result<DiGraph<&F, ()>, F::Error>
where
F: Send + Sync,
F::Error: Send,
{
#[cfg(feature = "tracing")]
tracing::debug!("Building directed graph");
self.par_get_graph()
}
#[cfg_attr(docsrs, doc(cfg(feature = "petgraph")))]
#[cfg_attr(feature = "tracing", tracing::instrument(skip(self), fields(path = %self.path.display(), count_notes = %self.notes.len())))]
pub fn get_ungraph(&self) -> Result<UnGraph<&F, ()>, F::Error> {
#[cfg(feature = "tracing")]
tracing::debug!("Building undirected graph");
self.get_graph()
}
#[cfg_attr(docsrs, doc(cfg(feature = "petgraph")))]
#[cfg_attr(docsrs, doc(cfg(feature = "rayon")))]
#[cfg(feature = "rayon")]
#[cfg_attr(feature = "tracing", tracing::instrument(skip(self), fields(path = %self.path.display(), count_notes = %self.notes.len())))]
pub fn par_get_ungraph(&self) -> Result<UnGraph<&F, ()>, F::Error>
where
F: Send + Sync,
F::Error: Send,
{
#[cfg(feature = "tracing")]
tracing::debug!("Building undirected graph");
self.par_get_graph()
}
}
#[cfg(test)]
mod tests {
use crate::vault::vault_test::create_test_vault;
#[cfg_attr(feature = "tracing", tracing_test::traced_test)]
#[test]
#[cfg(feature = "petgraph")]
fn get_digraph() {
let (vault, _temp_dir, files) = create_test_vault().unwrap();
let graph = vault.get_digraph().unwrap();
assert_eq!(graph.edge_count(), 3);
assert_eq!(graph.node_count(), files.len());
}
#[cfg_attr(feature = "tracing", tracing_test::traced_test)]
#[test]
#[cfg(feature = "petgraph")]
#[cfg(feature = "rayon")]
fn par_get_digraph() {
let (vault, _temp_dir, files) = create_test_vault().unwrap();
let graph = vault.par_get_digraph().unwrap();
assert_eq!(graph.edge_count(), 3);
assert_eq!(graph.node_count(), files.len());
}
#[cfg_attr(feature = "tracing", tracing_test::traced_test)]
#[test]
#[cfg(feature = "petgraph")]
#[cfg(feature = "rayon")]
fn par_get_ungraph() {
let (vault, _temp_dir, files) = create_test_vault().unwrap();
let graph = vault.par_get_ungraph().unwrap();
assert_eq!(graph.edge_count(), 3);
assert_eq!(graph.node_count(), files.len());
}
}