use std::io::{Read, Write};
use mqf::MQF;
use crate::Error;
use crate::index::sbt::{FromFactory, Node, Update, SBT};
use crate::index::storage::{ReadData, ReadDataError, ToWriter};
use crate::index::Comparable;
use crate::signature::{Signature, SigsTrait};
use crate::sketch::Sketch;
impl ToWriter for MQF {
fn to_writer<W>(&self, writer: &mut W) -> Result<(), Error>
where
W: Write,
{
let mut tmpfile = tempfile::NamedTempFile::new()?;
self.serialize(tmpfile.path()).unwrap();
let mut buffer = Vec::new();
tmpfile.read_to_end(&mut buffer)?;
writer.write_all(&buffer)?;
Ok(())
}
}
impl ReadData<MQF> for Node<MQF> {
fn data(&self) -> Result<&MQF, Error> {
if let Some(storage) = &self.storage {
Ok(self.data.get_or_create(|| {
let raw = storage.load(&self.filename).unwrap();
let mut tmpfile = tempfile::NamedTempFile::new().unwrap();
tmpfile.write_all(&raw[..]).unwrap();
MQF::deserialize(tmpfile.path()).unwrap()
}))
} else if let Some(data) = self.data.get() {
Ok(data)
} else {
Err(ReadDataError::LoadError.into())
}
}
}
impl<L: Sync> FromFactory<Node<MQF>> for SBT<Node<MQF>, L> {
fn factory(&self, _name: &str) -> Result<Node<MQF>, Error> {
unimplemented!()
}
}
impl Update<Node<MQF>> for Node<MQF> {
fn update(&self, _other: &mut Node<MQF>) -> Result<(), Error> {
unimplemented!();
}
}
impl Update<Node<MQF>> for Signature {
fn update(&self, _other: &mut Node<MQF>) -> Result<(), Error> {
unimplemented!();
}
}
impl Comparable<Node<MQF>> for Node<MQF> {
fn similarity(&self, other: &Node<MQF>) -> f64 {
let _ng: &MQF = self.data().unwrap();
let _ong: &MQF = other.data().unwrap();
unimplemented!();
}
fn containment(&self, other: &Node<MQF>) -> f64 {
let _ng: &MQF = self.data().unwrap();
let _ong: &MQF = other.data().unwrap();
unimplemented!();
}
}
impl Comparable<Signature> for Node<MQF> {
fn similarity(&self, other: &Signature) -> f64 {
let ng: &MQF = self.data().unwrap();
if let Sketch::MinHash(sig) = &other.signatures[0] {
if sig.size() == 0 {
return 0.0;
}
let matches: usize = sig
.mins
.iter()
.filter(|h| dbg!(ng.count_key(**h % u64::pow(2, 26))) > 0)
.count();
let min_n_below = self.metadata["min_n_below"] as f64;
matches as f64 / min_n_below
} else {
unimplemented!()
}
}
fn containment(&self, other: &Signature) -> f64 {
let ng: &MQF = self.data().unwrap();
if let Sketch::MinHash(sig) = &other.signatures[0] {
if sig.size() == 0 {
return 0.0;
}
let matches: usize = sig
.mins
.iter()
.filter(|h| ng.count_key(**h % u64::pow(2, 26)) > 0)
.count();
matches as f64 / sig.size() as f64
} else {
unimplemented!()
}
}
}
}