unobtanium 3.0.0

Opinioated Web search engine library with crawler and viewer companion.
Documentation
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 {
	/// Match the documents title
	Title(StringCriterium),
	/// Match the documents headline
	PrimaryHeadline(StringCriterium),
	/// Match the documents self given/derived description
	Description(StringCriterium),
	/// Match the documents primary languge taken from the `lang` attribute
	PrimaryLanguage(StringCriterium),
	/// When the document was published according to/derived from the document
	DatePublished(NumberCriterium<UtcTimestamp>),
	/// When the document was last updated according to/derived from the document
	DateLastUpdated(NumberCriterium<UtcTimestamp>),
	/// Match the documents indexiness, bigger number, more index page, less leave page
	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),
		}
	}
}