use criterium::rusqlite::assembler::*;
use criterium::BooleanCriterium;
use criterium::DirectMatch;
use criterium::NumberCriterium;
use criterium::StringCriterium;
use serde::{Serialize,Deserialize};
use crate::content::LinkLocality;
use crate::database::SummarySchema;
use crate::database::fields::*;
use crate::summary::LinkSummary;
use crate::summary::LinkType;
use super::UrlCriterium;
#[derive(Clone,Debug,Serialize,Deserialize)]
#[serde(rename_all="snake_case")]
pub enum LinkSummaryCriterium {
Text(StringCriterium),
Url(UrlCriterium),
RelNofollow(BooleanCriterium),
RelMe(BooleanCriterium),
RelTag(BooleanCriterium),
LinkDestinationType(NumberCriterium<LinkType>),
LinkLocality(NumberCriterium<LinkLocality>),
HtmlTagName(StringCriterium),
ContainsHeadline(BooleanCriterium),
}
impl AssembleRusqliteQuery<SummarySchema, ()> for LinkSummaryCriterium {
fn assemble_rusqlite_query(
&self,
assembly_context: &AssemblyContext,
_context: &(),
) -> InvertableRusqliteQuery<SummarySchema> {
match self {
Self::Text(c) => {
c.assemble_query(assembly_context, &LinkSummaryField::Text.into())
},
Self::Url(c) => {
c.assemble_rusqlite_query_with_fragment(
&assembly_context.prefix_with("link_url_"),
assembly_context,
&LinkSummaryField::LinkToFragment.into()
).inner_join(
None,
UrlField::UrlId.into(),
Some(assembly_context.prefix()),
LinkSummaryField::LinkToUrl.into()
)
},
Self::RelNofollow(c) => {
c.assemble_query(assembly_context, &LinkSummaryField::RelNofollow.into())
},
Self::RelMe(c) => {
c.assemble_query(assembly_context, &LinkSummaryField::RelMe.into())
},
Self::RelTag(c) => {
c.assemble_query(assembly_context, &LinkSummaryField::RelTag.into())
},
Self::LinkDestinationType(c) => {
c.assemble_query(assembly_context, &LinkSummaryField::DestinationType.into())
},
Self::LinkLocality(c) => {
c.assemble_query(assembly_context, &LinkSummaryField::LinkLocality.into())
},
Self::HtmlTagName(c) => {
c.assemble_query(assembly_context, &LinkSummaryField::HtmlTagName.into())
},
Self::ContainsHeadline(c) => {
c.assemble_query(assembly_context, &LinkSummaryField::ContainsHeadline.into())
},
}
}
}
impl DirectMatch<LinkSummary> for LinkSummaryCriterium {
type Output = bool;
fn criterium_match(&self, data: &LinkSummary) -> bool {
match self {
Self::Text(c) => {
c.criterium_match(&data.text.as_ref())
},
Self::Url(c) => {
c.criterium_match(&data.url)
},
Self::RelNofollow(c) => {
c.criterium_match(&data.rel_nofollow)
},
Self::RelMe(c) => {
c.criterium_match(&data.rel_me)
},
Self::RelTag(c) => {
c.criterium_match(&data.rel_tag)
},
Self::LinkDestinationType(c) => {
c.criterium_match(&data.link_destination_type)
},
Self::LinkLocality(c) => {
c.criterium_match(&data.link_locality)
},
Self::HtmlTagName(c) => {
c.criterium_match(&data.html_tag_name.as_ref())
},
Self::ContainsHeadline(c) => {
c.criterium_match(&data.contains_headline)
},
}
}
}