use criterium::NumberCriterium;
use criterium::rusqlite::assembler::*;
use crate::criterium::OriginCriterium;
use crate::database::id::AgentId;
use crate::database::id::NumericDatabseId;
use crate::database::id::OriginId;
use crate::database::CrawlerSchema;
use crate::database::fields::*;
#[derive(Clone,Debug)]
pub enum CrawlCandidateCriterium {
OriginMatches(OriginCriterium),
OriginId(OriginId),
OriginIgnoredByAgent(AgentId),
UrlIgnoredByAgent(AgentId),
LastCrawlTime(NumberCriterium<i64>),
}
impl AssembleRusqliteQuery<CrawlerSchema, ()> for CrawlCandidateCriterium {
fn assemble_rusqlite_query(
&self,
assembly_context: &AssemblyContext,
_context: &()
) -> InvertableRusqliteQuery<CrawlerSchema> {
match self {
Self::OriginMatches(c) =>
c.assemble_rusqlite_query(&assembly_context.prefix_with("crawl_candidate_"), &())
.inner_join(
None,
OriginField::OriginId.into(),
None,
UrlField::OriginId.into(),
).inner_join(
None,
UrlField::UrlId.into(),
Some(assembly_context.prefix()), CrawlCandidateField::UrlId.into()
),
Self::OriginId(id) =>
NumberCriterium::Equals(id.number())
.assemble_query(
&assembly_context.prefix_with("crawl_candidate_"),
&UrlField::OriginId.into()
)
.inner_join(
None,
UrlField::UrlId.into(),
Some(assembly_context.prefix()), CrawlCandidateField::UrlId.into()
),
Self::OriginIgnoredByAgent(id) => {
let new_context = assembly_context.prefix_with("crawl_candidate_");
NumberCriterium::Equals(id.number())
.assemble_query(
&new_context.in_and_block(),
&TempIgnoreOriginField::OriginId.into()
)
.get_corrected_query()
.and(RusqliteQuery::test_if_null(
new_context.prefix(), &TempIgnoreOriginField::OriginId.into(), true
))
.left_join(
Some("ignore_origin"),
TempIgnoreOriginField::OriginId.into(),
None,
UrlField::OriginId.into(),
).inner_join(
None,
UrlField::UrlId.into(),
Some(assembly_context.prefix()), CrawlCandidateField::UrlId.into(),
).as_invertable()
},
Self::UrlIgnoredByAgent(id) => {
let inner_context = assembly_context.prefix_with("crawl_candidate_");
NumberCriterium::Equals(id.number())
.assemble_query(
&inner_context.in_and_block(),
&TempIgnoreUrlField::AgentId.into()
)
.get_corrected_query()
.and(RusqliteQuery::test_if_null(
inner_context.prefix(), &TempIgnoreUrlField::UrlId.into(), true))
.left_join(
Some("ignore_url"),
TempIgnoreUrlField::UrlId.into(),
Some(assembly_context.prefix()), CrawlCandidateField::UrlId.into()
).as_invertable()
},
Self::LastCrawlTime(number_criterium) => {
number_criterium.assemble_query(
assembly_context,
&CrawlCandidateField::LastCrawlTimeUnixUtc.into()
)
}
}
}
}
impl From<OriginCriterium> for CrawlCandidateCriterium {
fn from(c: OriginCriterium) -> Self {
Self::OriginMatches(c)
}
}