use std::collections::HashMap;
#[derive(Debug, Clone)]
pub struct GraphResult {
pub chunk_id: i64,
pub depth: usize,
pub path: Vec<i64>,
pub edge_type: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ImportDirection {
Incoming,
Outgoing,
}
#[derive(Clone)]
pub struct EmbeddingRecord {
pub blob_sha: String,
pub embedding: Vec<f32>,
pub model_version: String,
}
#[derive(Debug, Clone)]
pub struct EncodingRunRow {
pub id: i64,
pub started_at: String,
pub finished_at: Option<String>,
pub status: String,
pub total_chunks: i64,
pub chunks_completed: i64,
pub chunks_per_second: Option<f64>,
pub last_batch_at: Option<String>,
pub provider: Option<String>,
pub dimension: Option<i32>,
}
#[derive(Debug, Clone)]
pub struct HybridWeights {
pub fts_weight: f64,
pub vector_weight: f64,
}
impl Default for HybridWeights {
fn default() -> Self {
Self {
fts_weight: 0.3,
vector_weight: 0.7,
}
}
}
impl HybridWeights {
pub fn new(fts_weight: f64, vector_weight: f64) -> Self {
Self {
fts_weight,
vector_weight,
}
}
pub fn equal() -> Self {
Self {
fts_weight: 0.5,
vector_weight: 0.5,
}
}
pub fn fts_heavy() -> Self {
Self {
fts_weight: 0.7,
vector_weight: 0.3,
}
}
pub fn vector_heavy() -> Self {
Self::default()
}
}
#[derive(Debug, Clone)]
pub struct HybridResult {
pub chunk_id: i64,
pub score: f64,
pub fts_rank: Option<usize>,
pub vector_rank: Option<usize>,
pub source: String,
}
#[derive(Debug, Clone)]
pub struct SemanticRanking {
pub kind_multipliers: HashMap<String, f64>,
pub exact_match_boost: f64,
pub recency_weight: f64,
}
impl Default for SemanticRanking {
fn default() -> Self {
let mut kind_multipliers = HashMap::new();
kind_multipliers.insert("function".to_string(), 1.2);
kind_multipliers.insert("method".to_string(), 1.2);
kind_multipliers.insert("class".to_string(), 1.1);
kind_multipliers.insert("struct".to_string(), 1.1);
kind_multipliers.insert("interface".to_string(), 1.1);
kind_multipliers.insert("trait".to_string(), 1.1);
kind_multipliers.insert("enum".to_string(), 1.0);
kind_multipliers.insert("module".to_string(), 1.0);
kind_multipliers.insert("constant".to_string(), 0.9);
kind_multipliers.insert("variable".to_string(), 0.8);
kind_multipliers.insert("import".to_string(), 0.7);
Self {
kind_multipliers,
exact_match_boost: 1.5,
recency_weight: 0.1, }
}
}
impl SemanticRanking {
pub fn new(
kind_multipliers: HashMap<String, f64>,
exact_match_boost: f64,
recency_weight: f64,
) -> Self {
Self {
kind_multipliers,
exact_match_boost,
recency_weight,
}
}
pub fn identity() -> Self {
Self {
kind_multipliers: HashMap::new(),
exact_match_boost: 1.0,
recency_weight: 0.0,
}
}
}
#[derive(Debug, Clone)]
pub struct ChunkMetadata {
pub kind: String,
pub symbol_name: Option<String>,
pub recency_score: f64,
}
#[derive(Debug, Clone)]
pub struct RankedSearchHit {
pub chunk_id: i64,
pub score: f64,
pub fts_rank: Option<usize>,
pub vector_rank: Option<usize>,
pub kind: String,
pub symbol_name: Option<String>,
pub recency_score: f64,
pub source: String,
}