use std::ops::Deref;
use criterium::DirectMatch;
use criterium::rusqlite::assembler::*;
use criterium::StringCriterium;
use serde::{Serialize,Deserialize};
use crate::database::SummarySchema;
use crate::database::fields::*;
use crate::summary::TextPile;
use super::BlobCriterium;
#[derive(Clone,Debug,Serialize,Deserialize)]
#[serde(rename_all="snake_case")]
pub enum TextPileCriterium {
IsEmpty,
Text(StringCriterium),
SecondaryText(StringCriterium),
BigHeadlines(StringCriterium),
SmallHeadlines(StringCriterium),
CodeText(StringCriterium),
QuoteText(StringCriterium),
Blake2b512Digest(BlobCriterium),
}
impl AssembleRusqliteQuery<SummarySchema, ()> for TextPileCriterium {
fn assemble_rusqlite_query(
&self,
assembly_context: &AssemblyContext,
_context: &(),
) -> InvertableRusqliteQuery<SummarySchema> {
match self {
Self::IsEmpty => {
RusqliteQuery::from_static_sql(format!(
"(
{0}text_pile.text = '' AND
{0}text_pile.seondary_text = '' AND
{0}text_pile.big_headlines = '' AND
{0}text_pile.smll_headlines = '' AND
{0}text_pile.code_text = '' AND
{0}text_pile.quote_text = ''
)", assembly_context.prefix()
)).as_invertable()
},
Self::Text(c) => {
c.assemble_query(assembly_context, &TextPileField::Text.into())
},
Self::SecondaryText(c) => {
c.assemble_query(assembly_context, &TextPileField::SecondaryText.into())
},
Self::BigHeadlines(c) => {
c.assemble_query(assembly_context, &TextPileField::BigHeadlines.into())
},
Self::SmallHeadlines(c) => {
c.assemble_query(assembly_context, &TextPileField::SmallHeadlines.into())
},
Self::CodeText(c) => {
c.assemble_query(assembly_context, &TextPileField::CodeText.into())
},
Self::QuoteText(c) => {
c.assemble_query(assembly_context, &TextPileField::QuoteText.into())
},
Self::Blake2b512Digest(c) => {
c.assemble_query(assembly_context, &TextPileField::Blake2b512Digest.into())
},
}
}
}
impl DirectMatch<TextPile> for TextPileCriterium {
type Output = bool;
fn criterium_match(&self, data: &TextPile) -> bool {
match self {
Self::IsEmpty => {
data.is_empty()
},
Self::Text(c) => {
c.criterium_match(data.text.as_str())
},
Self::SecondaryText(c) => {
c.criterium_match(data.secondary_text.as_str())
},
Self::BigHeadlines(c) => {
c.criterium_match(data.big_headlines.as_str())
},
Self::SmallHeadlines(c) => {
c.criterium_match(data.small_headlines.as_str())
},
Self::CodeText(c) => {
c.criterium_match(data.code_text.as_str())
},
Self::QuoteText(c) => {
c.criterium_match(data.quote_text.as_str())
},
Self::Blake2b512Digest(c) => {
c.criterium_match(data.calculate_blake2b512_digest().deref())
},
}
}
}