use anyhow::{Context, Result};
use tracing::{debug, info, instrument};
use super::scope::{ForkLocalIndexKind, ForkScope};
#[instrument(skip(scope, base_uri), fields(label = %label, column = %column, kind = ?kind))]
pub async fn build_fork_local_index(
scope: &ForkScope,
base_uri: &str,
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"
)
})
};
let dataset_uri = || {
if base_uri.ends_with('/') {
format!("{base_uri}{dataset_name}.lance")
} else {
format!("{base_uri}/{dataset_name}.lance")
}
};
match kind {
ForkLocalIndexKind::VidUid => {
debug!(
fork_id = %scope.fork_id(),
"VidUid fork-local 'index' is a planner marker; no Lance build needed"
);
}
ForkLocalIndexKind::ScalarBtree | ForkLocalIndexKind::Sorted => {
let branch = lookup_branch()?;
let uri = dataset_uri();
let index_name = format!("fork_{}_{column}_btree", scope.fork_id());
crate::backend::lance_branch::create_scalar_index_on_branch(
&uri,
&branch,
column,
&index_name,
)
.await
.with_context(|| {
format!("build fork-local scalar index on {uri}@{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 uri = dataset_uri();
let index_name = format!("fork_{}_{column}_vec", scope.fork_id());
crate::backend::lance_branch::create_vector_index_on_branch(
&uri,
&branch,
column,
&index_name,
)
.await
.with_context(|| {
format!("build fork-local vector index on {uri}@{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 uri = dataset_uri();
let index_name = format!("fork_{}_{column}_fts", scope.fork_id());
crate::backend::lance_branch::create_fts_index_on_branch(
&uri,
&branch,
column,
&index_name,
)
.await
.with_context(|| {
format!("build fork-local FTS index on {uri}@{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(())
}