#[derive(Default, Debug, Clone, serde::Serialize)]
pub struct BTreeIndexBuilder {}
impl BTreeIndexBuilder {}
#[derive(Debug, Clone, Default, serde::Serialize)]
pub struct BitmapIndexBuilder {}
#[derive(Debug, Clone, Default, serde::Serialize)]
pub struct LabelListIndexBuilder {}
#[derive(Debug, Clone, Default, serde::Serialize)]
pub struct FmIndexBuilder {}
#[derive(Debug, Clone, Default, serde::Serialize)]
pub struct ZoneMapIndexBuilder {}
#[derive(Debug, Clone, Default, serde::Serialize)]
pub struct NGramIndexBuilder {}
#[derive(Debug, Clone, Default, serde::Serialize)]
pub struct BloomFilterIndexBuilder {
#[serde(skip_serializing_if = "Option::is_none")]
number_of_items: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
probability: Option<f64>,
}
impl BloomFilterIndexBuilder {
pub fn number_of_items(mut self, number_of_items: u64) -> crate::Result<Self> {
if number_of_items == 0 {
return Err(crate::Error::InvalidInput {
message: "BloomFilter number_of_items must be greater than zero".into(),
});
}
self.number_of_items = Some(number_of_items);
Ok(self)
}
pub fn probability(mut self, probability: f64) -> crate::Result<Self> {
if !probability.is_finite() || probability <= 0.0 || probability >= 1.0 {
return Err(crate::Error::InvalidInput {
message: "BloomFilter probability must be finite and strictly between zero and one"
.into(),
});
}
self.probability = Some(probability);
Ok(self)
}
}
#[derive(Debug, Clone, Default, serde::Serialize)]
pub struct RTreeIndexBuilder {
#[serde(skip_serializing_if = "Option::is_none")]
page_size: Option<u32>,
}
impl RTreeIndexBuilder {
pub fn page_size(mut self, page_size: u32) -> crate::Result<Self> {
if page_size < 2 {
return Err(crate::Error::InvalidInput {
message: "RTree page_size must be at least 2".into(),
});
}
self.page_size = Some(page_size);
Ok(self)
}
}
pub use lance_index::scalar::FullTextSearchQuery;
pub use lance_index::scalar::InvertedIndexParams as FtsIndexBuilder;
pub use lance_index::scalar::InvertedIndexParams;
pub use lance_index::scalar::inverted::DocumentGranularity;
pub use lance_index::scalar::inverted::query::*;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn scalar_index_parameters() {
assert_eq!(
serde_json::to_value(BloomFilterIndexBuilder::default()).unwrap(),
serde_json::json!({})
);
assert_eq!(
serde_json::to_value(RTreeIndexBuilder::default()).unwrap(),
serde_json::json!({})
);
assert_eq!(
serde_json::to_value(
BloomFilterIndexBuilder::default()
.number_of_items(1)
.unwrap()
)
.unwrap(),
serde_json::json!({"number_of_items": 1})
);
assert_eq!(
serde_json::to_value(
BloomFilterIndexBuilder::default()
.probability(0.01)
.unwrap()
)
.unwrap(),
serde_json::json!({"probability": 0.01})
);
assert!(
BloomFilterIndexBuilder::default()
.number_of_items(0)
.is_err()
);
for probability in [
f64::NAN,
f64::INFINITY,
f64::NEG_INFINITY,
-0.1,
0.0,
1.0,
1.1,
] {
assert!(
BloomFilterIndexBuilder::default()
.probability(probability)
.is_err()
);
}
for page_size in [0, 1] {
assert!(RTreeIndexBuilder::default().page_size(page_size).is_err());
}
assert!(RTreeIndexBuilder::default().page_size(2).is_ok());
}
}