use criterium::DirectMatch;
use criterium::number::NumberCriterium;
use criterium::rusqlite::assembler::*;
use criterium::string::StringCriterium;
use serde::{Serialize,Deserialize};
use crate::database::SummarySchema;
use crate::database::fields::*;
use crate::summary::DocumentDescription;
use crate::time::UtcTimestamp;
#[derive(Clone,Debug,Serialize,Deserialize)]
#[serde(rename_all="snake_case")]
pub enum DocumentDescriptionCriterium {
Title(StringCriterium),
PrimaryHeadline(StringCriterium),
Description(StringCriterium),
PrimaryLanguage(StringCriterium),
DatePublished(NumberCriterium<UtcTimestamp>),
DateLastUpdated(NumberCriterium<UtcTimestamp>),
Indexiness(NumberCriterium<i64>),
}
impl AssembleRusqliteQuery<SummarySchema, ()> for DocumentDescriptionCriterium {
fn assemble_rusqlite_query(
&self,
assembly_context: &AssemblyContext,
_context: &()
) -> InvertableRusqliteQuery<SummarySchema> {
match self {
Self::Title(c) =>
c.assemble_query(
assembly_context,
&DocumentDescriptionField::Title.into()
),
Self::PrimaryHeadline(c) =>
c.assemble_query(
assembly_context,
&DocumentDescriptionField::PrimaryHeadline.into()
),
Self::Description(c) =>
c.assemble_query(
assembly_context,
&DocumentDescriptionField::Description.into()
),
Self::PrimaryLanguage(c) =>
c.assemble_query(
assembly_context,
&DocumentDescriptionField::PrimaryLanguage.into()
),
Self::DatePublished(c) =>
c.assemble_query(
assembly_context,
&DocumentDescriptionField::TimeCreatedUnixUtc.into()
),
Self::DateLastUpdated(c) =>
c.assemble_query(
assembly_context,
&DocumentDescriptionField::TimeUpdatedUnixUtc.into()
),
Self::Indexiness(c) =>
c.assemble_query(
assembly_context,
&DocumentDescriptionField::Indexiness.into()
),
}
}
}
impl DirectMatch<DocumentDescription> for DocumentDescriptionCriterium {
type Output = bool;
fn criterium_match(&self, data: &DocumentDescription) -> bool {
match self {
Self::Title(c) =>
c.criterium_match(&data.title.as_ref()),
Self::PrimaryHeadline(c) =>
c.criterium_match(&data.primary_headline.as_ref()),
Self::Description(c) =>
c.criterium_match(&data.description.as_ref()),
Self::PrimaryLanguage(c) =>
c.criterium_match(&data.primary_language.as_ref()),
Self::DatePublished(c) =>
c.criterium_match(&data.date_published),
Self::DateLastUpdated(c) =>
c.criterium_match(&data.date_last_updated),
Self::Indexiness(c) =>
c.criterium_match(&data.indexiness),
}
}
}