use std::sync::Arc;
use arrow_array::{LargeStringArray, RecordBatch};
use arrow_schema::{DataType, Field, Schema};
use infino::{Bm25SearchOptions, IndexSpec, connect};
use tracing_subscriber::{EnvFilter, fmt::format::FmtSpan};
fn main() -> Result<(), Box<dyn std::error::Error>> {
#[cfg(feature = "detailed-tracing")]
let span_events = FmtSpan::CLOSE;
#[cfg(not(feature = "detailed-tracing"))]
let span_events = FmtSpan::NONE;
tracing_subscriber::fmt()
.with_env_filter(
EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info")),
)
.with_span_events(span_events)
.with_target(true)
.init();
let dir = tempfile::tempdir()?;
let uri = dir.path().to_str().expect("utf8 tempdir path");
let db = connect(uri)?;
let schema = Arc::new(Schema::new(vec![Field::new(
"title",
DataType::LargeUtf8,
false,
)]));
let docs = db.create_table("docs", schema.clone(), IndexSpec::new().fts("title"))?;
let titles = ["the quick brown fox", "a lazy sleeping dog"];
docs.append(&RecordBatch::try_new(
schema,
vec![Arc::new(LargeStringArray::from(titles.to_vec()))],
)?)?;
let _ = docs.bm25_search(
"title",
"fox",
10,
Bm25SearchOptions::new(),
Some(&["_id", "title"]),
)?;
let _ = db.query_sql("SELECT _id, title FROM docs ORDER BY _id")?;
let _reopened = db.open_table("docs")?;
db.drop_table("docs", true)?;
Ok(())
}