use async_trait::async_trait;
use ulid::Ulid;
use crate::error::GradatumError;
use crate::identity::NoteId;
use crate::index::{FileChecksumEntry, NoteRecord};
use crate::scope::{OverrideScope, VaultId};
#[derive(Debug, Clone)]
pub struct SearchHitRaw {
pub note_id: NoteId,
pub bm25: f64,
pub status: String,
pub snippet: String,
pub section: String,
pub title: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct AuthorRow {
pub name: String,
pub note_count: u64,
}
#[derive(Debug, Clone, Default)]
pub struct Lineage {
pub parents: Vec<String>,
pub children: Vec<String>,
}
#[async_trait]
pub trait IndexStore: Send + Sync {
async fn search_fts(
&self,
vault_id: &VaultId,
query: &str,
limit: usize,
) -> Result<Vec<NoteId>, GradatumError>;
async fn search_fts_scored(
&self,
vault_id: &VaultId,
query: &str,
limit: usize,
include_downgraded: bool,
) -> Result<Vec<(NoteId, f64, String)>, GradatumError>;
async fn upsert_override_raw(
&self,
note_id: NoteId,
scope: &OverrideScope,
override_type: &str,
schema_version: u32,
payload_toml: &str,
) -> Result<(), GradatumError>;
async fn get_override_raw(
&self,
note_id: NoteId,
scope: &OverrideScope,
override_type: &str,
) -> Result<Option<(u32, String)>, GradatumError>;
async fn upsert_file_checksum(&self, entry: &FileChecksumEntry) -> Result<(), GradatumError>;
async fn list_file_checksums(&self) -> Result<Vec<FileChecksumEntry>, GradatumError>;
async fn get_note_created_and_indegree(
&self,
vault_id: &str,
note_id: &str,
) -> Result<(i64, u64), GradatumError>;
async fn search_fts_with_snippet(
&self,
vault_id: &VaultId,
query: &str,
limit: usize,
include_downgraded: bool,
section: Option<&str>,
locus: Option<&str>,
) -> Result<Vec<SearchHitRaw>, GradatumError>;
async fn title_lookup(
&self,
vault_id: &str,
title: &str,
) -> Result<Option<String>, GradatumError>;
async fn live_note_count(&self, vault_id: &str) -> Result<u64, GradatumError>;
async fn distinct_authors(&self, vault_id: &str) -> Result<Vec<AuthorRow>, GradatumError>;
async fn distinct_tags(&self, vault_id: &str) -> Result<Vec<(String, u64)>, GradatumError>;
async fn neighbors(
&self,
vault_id: &str,
note_id: &str,
depth: u8,
) -> Result<Vec<String>, GradatumError>;
async fn backlinks(&self, vault_id: &str, note_id: &str) -> Result<Vec<String>, GradatumError>;
async fn trace_lineage(&self, vault_id: &str, note_id: &str) -> Result<Lineage, GradatumError>;
async fn list_notes(
&self,
vault_id: &str,
section: Option<&str>,
limit: usize,
cursor: Option<&str>,
) -> Result<(Vec<NoteRecord>, u64), GradatumError>;
async fn total_body_size_bytes(&self, vault_id: &str) -> Result<u64, GradatumError>;
async fn upsert_link(
&self,
vault_id: &str,
src_note_id: &str,
dst_note_id: &str,
) -> Result<(), GradatumError>;
async fn get_titles_sections(
&self,
vault_id: &str,
ids: &[String],
) -> Result<std::collections::HashMap<String, (Option<String>, String)>, GradatumError>;
async fn get_trust(&self, id: &NoteId) -> Result<Option<f32>, GradatumError>;
async fn upsert_redirect(
&self,
slug: &str,
ulid: &Ulid,
renamed_at_ms: i64,
) -> Result<(), GradatumError>;
async fn resolve_redirect(&self, slug: &str) -> Result<Option<Ulid>, GradatumError>;
async fn search_fts_for_forget(
&self,
vault_id: &str,
query: &str,
limit: usize,
) -> Result<Vec<(String, String)>, GradatumError>;
async fn list_notes_by_locus_prefix(
&self,
vault_id: &str,
prefix: &str,
) -> Result<Vec<(String, String)>, GradatumError>;
async fn list_notes_by_agent(
&self,
agent_id: &str,
vaults: &[String],
) -> Result<Vec<(String, String)>, GradatumError>;
}