use super::*;
use super::readonly::ReadonlyRefgetStore;
use std::fmt::{Display, Formatter};
use std::path::Path;
use anyhow::Result;
use std::fs::create_dir_all;
use crate::digest::{SequenceCollection, SequenceCollectionMetadata, SequenceRecord};
#[derive(Debug)]
pub struct RefgetStore {
pub(crate) inner: ReadonlyRefgetStore,
}
impl std::ops::Deref for RefgetStore {
type Target = ReadonlyRefgetStore;
fn deref(&self) -> &ReadonlyRefgetStore {
&self.inner
}
}
impl Display for RefgetStore {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.inner)
}
}
impl RefgetStore {
pub fn store_exists<P: AsRef<Path>>(path: P) -> bool {
ReadonlyRefgetStore::store_exists(path)
}
pub fn on_disk<P: AsRef<Path>>(cache_path: P) -> Result<Self> {
let cache_path = cache_path.as_ref();
let index_path = cache_path.join("rgstore.json");
if index_path.exists() {
Self::open_local(cache_path)
} else {
let mode = StorageMode::Encoded;
create_dir_all(cache_path)?;
let mut inner = ReadonlyRefgetStore::new(mode);
inner.local_path = Some(cache_path.to_path_buf());
inner.seqdata_path_template = Some(DEFAULT_SEQDATA_PATH_TEMPLATE.to_string());
inner.persist_to_disk = true;
create_dir_all(cache_path.join("sequences"))?;
create_dir_all(cache_path.join("collections"))?;
create_dir_all(cache_path.join("fhr"))?;
Ok(Self { inner })
}
}
pub fn in_memory() -> Self {
Self {
inner: ReadonlyRefgetStore::new(StorageMode::Encoded),
}
}
pub fn open_local<P: AsRef<Path>>(path: P) -> Result<Self> {
Ok(Self {
inner: ReadonlyRefgetStore::open_local(path)?,
})
}
pub fn open_remote<P: AsRef<Path>, S: AsRef<str>>(
cache_path: P,
remote_url: S,
) -> Result<Self> {
Ok(Self {
inner: ReadonlyRefgetStore::open_remote(cache_path, remote_url)?,
})
}
pub fn into_readonly(self) -> ReadonlyRefgetStore {
self.inner
}
pub fn load_all_collections(&mut self) -> Result<()> {
self.inner.load_all_collections()
}
pub fn load_all_sequences(&mut self) -> Result<()> {
self.inner.load_all_sequences()
}
pub fn load_collection(&mut self, digest: &str) -> Result<()> {
self.inner.load_collection(digest)
}
pub fn load_sequence(&mut self, digest: &str) -> Result<()> {
self.inner.load_sequence(digest)
}
pub fn get_collection(&mut self, digest: &str) -> Result<SequenceCollection> {
if let Ok(coll) = self.inner.get_collection(digest) {
return Ok(coll);
}
self.inner.load_collection(digest)?;
self.inner.get_collection(digest)
}
pub fn get_collection_level2(&mut self, digest: &str) -> Result<crate::digest::CollectionLevel2> {
if let Ok(lvl2) = self.inner.get_collection_level2(digest) {
return Ok(lvl2);
}
self.inner.load_collection(digest)?;
self.inner.get_collection_level2(digest)
}
pub fn compare(&mut self, digest_a: &str, digest_b: &str) -> Result<crate::digest::SeqColComparison> {
if !self.inner.is_collection_loaded(digest_a) {
self.inner.load_collection(digest_a)?;
}
if !self.inner.is_collection_loaded(digest_b) {
self.inner.load_collection(digest_b)?;
}
self.inner.compare(digest_a, digest_b)
}
pub fn get_attribute(
&mut self,
attr_name: &str,
attr_digest: &str,
) -> Result<Option<serde_json::Value>> {
let collections = self.inner.find_collections_by_attribute(attr_name, attr_digest)?;
if collections.is_empty() {
return Ok(None);
}
if !self.inner.is_collection_loaded(&collections[0]) {
self.inner.load_collection(&collections[0])?;
}
self.inner.get_attribute(attr_name, attr_digest)
}
pub fn set_quiet(&mut self, quiet: bool) {
self.inner.set_quiet(quiet);
}
pub fn set_encoding_mode(&mut self, new_mode: StorageMode) {
self.inner.set_encoding_mode(new_mode);
}
pub fn enable_encoding(&mut self) {
self.inner.enable_encoding();
}
pub fn disable_encoding(&mut self) {
self.inner.disable_encoding();
}
pub fn enable_persistence<P: AsRef<Path>>(&mut self, path: P) -> Result<()> {
self.inner.enable_persistence(path)
}
pub fn disable_persistence(&mut self) {
self.inner.disable_persistence();
}
pub fn add_sequence<T: Into<Option<DigestKey>>>(
&mut self,
sequence_record: SequenceRecord,
collection_digest: T,
force: bool,
) -> Result<()> {
self.inner.add_sequence(sequence_record, collection_digest, force)
}
pub fn add_sequence_collection(&mut self, collection: SequenceCollection) -> Result<()> {
self.inner.add_sequence_collection(collection)
}
pub fn add_sequence_collection_force(&mut self, collection: SequenceCollection) -> Result<()> {
self.inner.add_sequence_collection_force(collection)
}
pub fn add_sequence_collection_from_fasta<P: AsRef<Path>>(
&mut self,
file_path: P,
opts: FastaImportOptions<'_>,
) -> Result<(SequenceCollectionMetadata, bool)> {
self.inner.add_sequence_collection_from_fasta(file_path, opts)
}
pub fn add_sequence_record(&mut self, sr: SequenceRecord, force: bool) -> Result<()> {
self.inner.add_sequence_record(sr, force)
}
pub fn remove_collection(&mut self, digest: &str, remove_orphan_sequences: bool) -> Result<bool> {
self.inner.remove_collection(digest, remove_orphan_sequences)
}
pub fn import_collection_from_readonly(&mut self, source: &ReadonlyRefgetStore, digest: &str) -> Result<()> {
self.inner.import_collection(source, digest)
}
pub fn import_collection(&mut self, source: &mut RefgetStore, digest: &str) -> Result<()> {
if !source.inner.is_collection_loaded(digest) {
source.inner.load_collection(digest)?;
}
self.inner.import_collection(&source.inner, digest)
}
pub fn ensure_decoded<K: AsRef<[u8]>>(&mut self, seq_digest: K) -> Result<()> {
self.inner.ensure_decoded(seq_digest)
}
pub fn clear_decoded_cache(&mut self) {
self.inner.clear_decoded_cache();
}
pub fn clear(&mut self) {
self.inner.clear();
}
pub fn enable_ancillary_digests(&mut self) {
self.inner.enable_ancillary_digests();
}
pub fn disable_ancillary_digests(&mut self) {
self.inner.disable_ancillary_digests();
}
pub fn enable_attribute_index(&mut self) {
self.inner.enable_attribute_index();
}
pub fn disable_attribute_index(&mut self) {
self.inner.disable_attribute_index();
}
pub fn write(&self) -> Result<()> {
self.inner.write()
}
pub fn write_store_to_dir<P: AsRef<Path>>(
&self,
root_path: P,
seqdata_path_template: Option<&str>,
) -> Result<()> {
self.inner.write_store_to_dir(root_path, seqdata_path_template)
}
pub fn write_sequences_rgsi<P: AsRef<Path>>(&self, file_path: P) -> Result<()> {
self.inner.write_sequences_rgsi(file_path)
}
}