unobtanium 3.0.0

Opinioated Web search engine library with crawler and viewer companion.
Documentation
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;

/// Matches a [DuplicateSummary]. Best used with the database.
///
/// The [DirectMatch] on the duplicate summary can only compare the Uuid
/// for the subject and duplicate_od fields, IsNewest will always match,
/// everything else will always not match.
#[derive(Clone,Debug,Serialize,Deserialize)]
#[serde(rename_all="snake_case")]
pub enum DuplicateSummaryCriterium {
	/// Match the Subject of the duplicate summary,
	/// the entity generation that is duplicated
	Subject(EntityGenerationCriterium),
	
	/// Match the EntityGeneration the Subject is a duplicate of
	DuplicateOf(EntityGenerationCriterium),

	/// The first time the duplicate was detected
	DuplicateStatusStart(NumberCriterium<UtcTimestamp>),

	/// The time the duplicate status was confirmed to be over.
	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(),
	    }
	}
}