use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum QueryIntent {
Factual,
Analytical,
Navigational,
Summary,
}
impl Default for QueryIntent {
fn default() -> Self {
Self::Factual
}
}
impl std::fmt::Display for QueryIntent {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
QueryIntent::Factual => write!(f, "factual"),
QueryIntent::Analytical => write!(f, "analytical"),
QueryIntent::Navigational => write!(f, "navigational"),
QueryIntent::Summary => write!(f, "summary"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Complexity {
Simple,
Moderate,
Complex,
}
impl Default for Complexity {
fn default() -> Self {
Self::Simple
}
}
impl std::fmt::Display for Complexity {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Complexity::Simple => write!(f, "simple"),
Complexity::Moderate => write!(f, "moderate"),
Complexity::Complex => write!(f, "complex"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SubQuery {
pub query: String,
pub intent: QueryIntent,
pub target_docs: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QueryPlan {
pub original: String,
pub intent: QueryIntent,
pub keywords: Vec<String>,
pub key_concepts: Vec<String>,
pub strategy_hint: String,
pub complexity: Complexity,
pub rewritten: Vec<String>,
pub sub_queries: Vec<SubQuery>,
}
impl QueryPlan {
pub fn default_for(query: &str, keywords: Vec<String>) -> Self {
Self {
original: query.to_string(),
intent: QueryIntent::Factual,
keywords,
key_concepts: Vec::new(),
strategy_hint: "focused".to_string(),
complexity: Complexity::Simple,
rewritten: Vec::new(),
sub_queries: Vec::new(),
}
}
}