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 serde::{Serialize,Deserialize};

use crate::criterium::DocumentDescriptionCriterium;
use crate::criterium::MimeCriterium;
use crate::database::SummarySchema;
use crate::database::fields::*;

use crate::summary::FileSummary;

#[derive(Clone,Debug,Serialize,Deserialize)]
#[serde(rename_all="snake_case")]
pub enum FileSummaryCriterium {
	/// Match the files mimetype
	Mime(MimeCriterium),
	/// Match the files size, this is i64 for compatibility reasons
	FileSize(NumberCriterium<i64>),
	/// Match the document description
	Description(DocumentDescriptionCriterium),
}

impl AssembleRusqliteQuery<SummarySchema, ()> for FileSummaryCriterium {
	fn assemble_rusqlite_query(
		&self,
		assembly_context: &AssemblyContext,
		_context: &(),
	) -> InvertableRusqliteQuery<SummarySchema> {
	    match self {
			Self::Mime(c) => c.assemble_rusqlite_query(
				&assembly_context.prefix_with("file_summary_"),
				assembly_context.prefix(),
				&FileSummaryField::MimetypeId.into(),
			),
		    Self::FileSize(c) => c.assemble_query(
				assembly_context,
				&FileSummaryField::FileSize.into()
		    ),
		    Self::Description(c) => c.assemble_rusqlite_query(assembly_context, &())
			    .inner_join(
				    None,
				    DocumentDescriptionField::EntityGenerationId.into(),
				    None,
				    FileSummaryField::EntityGenerationId.into(),
			    ),
	    } 
	}
}

impl DirectMatch<FileSummary> for FileSummaryCriterium {

	type Output =  bool;
	
	fn criterium_match(&self, data: &FileSummary) -> bool {
	    match self {
		    Self::Mime(c) => c.criterium_match(&data.mime_type),
		    Self::FileSize(c) => c.criterium_match(&data.size.map(|n| n as i64)),
		    Self::Description(c) => c.criterium_match(&data.description),
	    }
	}
}