use criterium::DirectMatch;
use criterium::NumberCriterium;
use criterium::rusqlite::assembler::*;
use serde::{Serialize,Deserialize};
use crate::criterium::EntityGenerationCriterium;
use crate::database::SummarySchema;
use crate::database::fields::*;
use crate::summary::DuplicateSummary;
use crate::time::UtcTimestamp;
#[derive(Clone,Debug,Serialize,Deserialize)]
#[serde(rename_all="snake_case")]
pub enum DuplicateSummaryCriterium {
Subject(EntityGenerationCriterium),
DuplicateOf(EntityGenerationCriterium),
DuplicateStatusStart(NumberCriterium<UtcTimestamp>),
DuplicateStatusEnd(NumberCriterium<UtcTimestamp>),
}
impl AssembleRusqliteQuery<SummarySchema, ()> for DuplicateSummaryCriterium {
fn assemble_rusqlite_query(
&self,
assembly_context: &AssemblyContext,
_context: &(),
) -> InvertableRusqliteQuery<SummarySchema> {
match self {
Self::Subject(c) =>
c.assemble_rusqlite_query(
&assembly_context.prefix_with("subject_"),
&()
).inner_join(
None,
EntityGenerationField::EntityGenerationId.into(),
Some(assembly_context.prefix()),
DuplicateSummaryField::SubjectEntityGenerationId.into(),
),
Self::DuplicateOf(c) =>
c.assemble_rusqlite_query(
&assembly_context.prefix_with("duplicate_of_"),
&()
).inner_join(
None,
EntityGenerationField::EntityGenerationId.into(),
Some(assembly_context.prefix()),
DuplicateSummaryField::DuplicateOfEntityGenerationId.into()
),
Self::DuplicateStatusStart(c) =>
c.assemble_query(
assembly_context,
&DuplicateSummaryField::DuplicateStatusStartUnixUtc.into()
),
Self::DuplicateStatusEnd(c) =>
c.assemble_query(
assembly_context,
&DuplicateSummaryField::DuplicateStatusEndUnixUtc.into()
),
}
}
}
impl DirectMatch<DuplicateSummary> for DuplicateSummaryCriterium {
type Output = Option<bool>;
fn criterium_match(&self, data: &DuplicateSummary) -> Option<bool> {
match self {
Self::Subject(c) =>
c.criterium_match(&data.subject_entity_generation),
Self::DuplicateOf(c) =>
c.criterium_match(&data.duplicate_of_entity_generation),
Self::DuplicateStatusStart(c) =>
c.criterium_match(&data.duplicate_status_start).into(),
Self::DuplicateStatusEnd(c) =>
c.criterium_match(&data.duplicate_status_end).into(),
}
}
}