use super::{DEFAULT_ALPHA, FusionError};
pub const ALPHA_POLICY_VERSION: u16 = 2;
pub const LEXICAL_RULE_ALPHA: f64 = 0.4;
pub const RARE_DOCUMENT_FREQUENCY_THRESHOLD: u64 = 5;
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
pub enum FusionRule {
QuotedPhrase,
RareExactToken,
IdentifierToken,
}
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub struct RuleSignals {
pub quoted_phrase: bool,
pub rarest_exact_document_frequency: Option<u64>,
pub identifier_token: bool,
}
impl RuleSignals {
#[must_use]
pub const fn none() -> Self {
Self {
quoted_phrase: false,
rarest_exact_document_frequency: None,
identifier_token: false,
}
}
}
pub(crate) fn effective_alpha(
query: &super::HybridQuery,
) -> Result<(f64, Vec<FusionRule>), FusionError> {
if let Some(alpha) = query.alpha {
validate(alpha)?;
return Ok((alpha, Vec::new()));
}
validate(DEFAULT_ALPHA)?;
if !query.rules_enabled {
return Ok((DEFAULT_ALPHA, Vec::new()));
}
let mut applied = Vec::new();
if query.rule_signals.quoted_phrase {
applied.push(FusionRule::QuotedPhrase);
}
if query
.rule_signals
.rarest_exact_document_frequency
.is_some_and(|frequency| frequency <= RARE_DOCUMENT_FREQUENCY_THRESHOLD)
{
applied.push(FusionRule::RareExactToken);
}
if query.rule_signals.identifier_token {
applied.push(FusionRule::IdentifierToken);
}
if applied.is_empty() {
Ok((DEFAULT_ALPHA, applied))
} else {
Ok((LEXICAL_RULE_ALPHA, applied))
}
}
fn validate(alpha: f64) -> Result<(), FusionError> {
if alpha.is_finite() && (0.0..=1.0).contains(&alpha) {
Ok(())
} else {
Err(FusionError::InvalidAlpha(alpha))
}
}