use criterium::DirectMatch;
use criterium::number::NumberCriterium;
use criterium::rusqlite::assembler::*;
use serde::{Serialize,Deserialize};
use crate::criterium::DocumentDescriptionCriterium;
use crate::criterium::MimeCriterium;
use crate::database::SummarySchema;
use crate::database::fields::*;
use crate::summary::FileSummary;
#[derive(Clone,Debug,Serialize,Deserialize)]
#[serde(rename_all="snake_case")]
pub enum FileSummaryCriterium {
Mime(MimeCriterium),
FileSize(NumberCriterium<i64>),
Description(DocumentDescriptionCriterium),
}
impl AssembleRusqliteQuery<SummarySchema, ()> for FileSummaryCriterium {
fn assemble_rusqlite_query(
&self,
assembly_context: &AssemblyContext,
_context: &(),
) -> InvertableRusqliteQuery<SummarySchema> {
match self {
Self::Mime(c) => c.assemble_rusqlite_query(
&assembly_context.prefix_with("file_summary_"),
assembly_context.prefix(),
&FileSummaryField::MimetypeId.into(),
),
Self::FileSize(c) => c.assemble_query(
assembly_context,
&FileSummaryField::FileSize.into()
),
Self::Description(c) => c.assemble_rusqlite_query(assembly_context, &())
.inner_join(
None,
DocumentDescriptionField::EntityGenerationId.into(),
None,
FileSummaryField::EntityGenerationId.into(),
),
}
}
}
impl DirectMatch<FileSummary> for FileSummaryCriterium {
type Output = bool;
fn criterium_match(&self, data: &FileSummary) -> bool {
match self {
Self::Mime(c) => c.criterium_match(&data.mime_type),
Self::FileSize(c) => c.criterium_match(&data.size.map(|n| n as i64)),
Self::Description(c) => c.criterium_match(&data.description),
}
}
}