unobtanium 3.0.0

Opinioated Web search engine library with crawler and viewer companion.
Documentation
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 {
	/// Match the Link label text
	Text(StringCriterium),
	/// Match the URL the link is pointing to
	Url(UrlCriterium),
	/// Whether the link had a `rel="nofollow"`
	RelNofollow(BooleanCriterium),
	/// Whether the link had a `rel="me"`
	RelMe(BooleanCriterium),
	/// Whether the link had a `rel="tag"`
	RelTag(BooleanCriterium),
	/// Of which type the link destionation is
	LinkDestinationType(NumberCriterium<LinkType>),
	//LocationSignature(todo),
	/// How far the link reaches
	LinkLocality(NumberCriterium<LinkLocality>),
	/// Which kind of html tag ended up being this link element
	HtmlTagName(StringCriterium),
	/// Wheter a headline element was found within this link element
	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::LocationSignature(c) => {
			//},
			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::LocationSignature(c) => {
			//	c.criterium_match(&data.location_signature)
			//},
			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)
			},
	    }
	}
}