use crate::backend::native::v2::{FreeSpaceManager, KvStore, StringTable};
use crate::backend::native::{EdgeStore, GraphFile, NodeStore};
use std::sync::{Arc, Mutex, RwLock};
mod edge_ops;
mod kv_ops;
mod node_ops;
mod transaction_ops;
pub struct DefaultReplayOperations {
pub(in crate::backend::native::v2::wal::recovery::replayer) graph_file: Arc<RwLock<GraphFile>>,
pub(in crate::backend::native::v2::wal::recovery::replayer) node_store:
Arc<Mutex<Option<NodeStore<'static>>>>,
pub(in crate::backend::native::v2::wal::recovery::replayer) edge_store:
Arc<Mutex<Option<EdgeStore<'static>>>>,
pub(in crate::backend::native::v2::wal::recovery::replayer) string_table:
Arc<Mutex<StringTable>>,
pub(in crate::backend::native::v2::wal::recovery::replayer) free_space_manager:
Arc<Mutex<Option<FreeSpaceManager>>>,
pub(in crate::backend::native::v2::wal::recovery::replayer) kv_store: Arc<Mutex<KvStore>>,
pub(in crate::backend::native::v2::wal::recovery::replayer) statistics:
Arc<crate::backend::native::v2::wal::recovery::replayer::types::ReplayStatistics>,
}
impl DefaultReplayOperations {
pub fn new(
graph_file: Arc<RwLock<GraphFile>>,
node_store: Arc<Mutex<Option<NodeStore<'static>>>>,
edge_store: Arc<Mutex<Option<EdgeStore<'static>>>>,
string_table: Arc<Mutex<StringTable>>,
free_space_manager: Arc<Mutex<Option<FreeSpaceManager>>>,
kv_store: Arc<Mutex<KvStore>>,
statistics: Arc<
crate::backend::native::v2::wal::recovery::replayer::types::ReplayStatistics,
>,
) -> Self {
Self {
graph_file,
node_store,
edge_store,
string_table,
free_space_manager,
kv_store,
statistics,
}
}
#[cfg(test)]
pub fn create_test_operations() -> Self {
use tempfile::NamedTempFile;
let temp_file = NamedTempFile::new().expect("Failed to create temp file");
let graph_file = GraphFile::create(temp_file.path()).expect("Failed to create GraphFile");
let graph_file = Arc::new(RwLock::new(graph_file));
let node_store: Arc<Mutex<Option<NodeStore<'static>>>> = Arc::new(Mutex::new(None));
let edge_store: Arc<Mutex<Option<EdgeStore<'static>>>> = Arc::new(Mutex::new(None));
let string_table = Arc::new(Mutex::new(StringTable::new()));
let mut free_space_mgr = crate::backend::native::v2::free_space::FreeSpaceManager::new(
crate::backend::native::v2::free_space::AllocationStrategy::FirstFit,
);
free_space_mgr.add_free_block(2048, 1024 * 1024);
let free_space_manager = Arc::new(Mutex::new(Some(free_space_mgr)));
let kv_store = Arc::new(Mutex::new(KvStore::new()));
let statistics = Arc::new(
crate::backend::native::v2::wal::recovery::replayer::types::ReplayStatistics::new(),
);
DefaultReplayOperations {
graph_file,
node_store,
edge_store,
string_table,
free_space_manager,
kv_store,
statistics,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_operations_creation() {
use tempfile::NamedTempFile;
let temp_file = NamedTempFile::new().expect("Failed to create temp file");
let graph_file = GraphFile::create(temp_file.path()).expect("Failed to create GraphFile");
let graph_file = Arc::new(RwLock::new(graph_file));
let node_store: Arc<Mutex<Option<NodeStore<'static>>>> = Arc::new(Mutex::new(None));
let edge_store: Arc<Mutex<Option<EdgeStore<'static>>>> = Arc::new(Mutex::new(None));
let string_table = Arc::new(Mutex::new(StringTable::new()));
let free_space_manager = Arc::new(Mutex::new(None));
let kv_store = Arc::new(Mutex::new(KvStore::new()));
let statistics = Arc::new(
crate::backend::native::v2::wal::recovery::replayer::types::ReplayStatistics::new(),
);
let ops = DefaultReplayOperations::new(
graph_file,
node_store,
edge_store,
string_table,
free_space_manager,
kv_store,
statistics,
);
assert_eq!(ops.statistics.total_operations(), 0);
}
}