use anyhow::{Context, Result};
use tracing::{debug, info, instrument};
use super::scope::{ForkLocalIndexKind, ForkScope};
use crate::backend::branching::ForkBranching;
#[instrument(skip(scope, branching), fields(label = %label, column = %column, kind = ?kind))]
pub async fn build_fork_local_index(
scope: &ForkScope,
branching: &dyn ForkBranching,
label: &str,
column: &str,
kind: ForkLocalIndexKind,
) -> Result<()> {
let dataset_name = format!("vertices_{label}");
let lookup_branch = || -> Result<String> {
scope.branch_for(&dataset_name).ok_or_else(|| {
anyhow::anyhow!(
"fork-local index build for ({label}, {column}, {kind:?}): \
fork has no branch for {dataset_name}; write some rows to the fork first"
)
})
};
match kind {
ForkLocalIndexKind::VidUid => {
debug!(
fork_id = %scope.fork_id(),
"VidUid fork-local 'index' is a planner marker; no Lance build needed"
);
}
ForkLocalIndexKind::Sparse => {
debug!(
fork_id = %scope.fork_id(),
"Sparse fork-local 'index' is a planner marker; retrieval is a brute-force branch scan"
);
}
ForkLocalIndexKind::ScalarBtree | ForkLocalIndexKind::Sorted => {
let branch = lookup_branch()?;
let index_name = format!("fork_{}_{column}_btree", scope.fork_id());
branching
.create_scalar_index_on_branch(&dataset_name, &branch, column, &index_name)
.await
.with_context(|| {
format!(
"build fork-local scalar index on {dataset_name}@{branch} column={column}"
)
})?;
info!(
fork_id = %scope.fork_id(),
dataset = %dataset_name,
branch = %branch,
column = %column,
"fork-local scalar/sorted index built"
);
}
ForkLocalIndexKind::Vector => {
let branch = lookup_branch()?;
let index_name = format!("fork_{}_{column}_vec", scope.fork_id());
branching
.create_vector_index_on_branch(&dataset_name, &branch, column, &index_name)
.await
.with_context(|| {
format!(
"build fork-local vector index on {dataset_name}@{branch} column={column}"
)
})?;
info!(
fork_id = %scope.fork_id(),
dataset = %dataset_name,
branch = %branch,
column = %column,
"fork-local vector index built (Phase 5b)"
);
}
ForkLocalIndexKind::FullText => {
let branch = lookup_branch()?;
let index_name = format!("fork_{}_{column}_fts", scope.fork_id());
debug!(
fork_id = %scope.fork_id(),
column = %column,
"fork-local FTS index uses the default analyzer (custom analyzers are not \
propagated to fork-local indexes yet)"
);
let tokenizer = uni_common::core::schema::TokenizerConfig::Standard;
branching
.create_fts_index_on_branch(&dataset_name, &branch, column, &index_name, &tokenizer)
.await
.with_context(|| {
format!("build fork-local FTS index on {dataset_name}@{branch} column={column}")
})?;
info!(
fork_id = %scope.fork_id(),
dataset = %dataset_name,
branch = %branch,
column = %column,
"fork-local FTS index built (Phase 5b)"
);
}
}
scope.register_fork_local_index(label, column, kind);
Ok(())
}