use async_trait::async_trait;
use crate::error::StorageResult;
use super::extractor::ExtractedValue;
#[async_trait]
pub trait SearchIndexWriter: Send + Sync {
async fn write_entries(
&self,
tenant_id: &str,
resource_type: &str,
resource_id: &str,
values: Vec<ExtractedValue>,
) -> StorageResult<usize>;
async fn delete_entries(
&self,
tenant_id: &str,
resource_type: &str,
resource_id: &str,
) -> StorageResult<usize>;
async fn delete_entries_for_param(
&self,
tenant_id: &str,
param_url: &str,
) -> StorageResult<usize>;
async fn clear_all(&self, tenant_id: &str) -> StorageResult<usize>;
async fn count_entries(&self, tenant_id: &str) -> StorageResult<u64>;
async fn count_resource_entries(
&self,
tenant_id: &str,
resource_type: &str,
resource_id: &str,
) -> StorageResult<u64>;
}
#[derive(Debug, Clone, Default)]
pub struct WriteOptions {
pub replace: bool,
pub skip_validation: bool,
pub batch_size: Option<usize>,
}
impl WriteOptions {
pub fn new() -> Self {
Self::default()
}
pub fn replace(mut self) -> Self {
self.replace = true;
self
}
pub fn skip_validation(mut self) -> Self {
self.skip_validation = true;
self
}
pub fn with_batch_size(mut self, size: usize) -> Self {
self.batch_size = Some(size);
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_write_options() {
let opts = WriteOptions::new().replace().with_batch_size(100);
assert!(opts.replace);
assert_eq!(opts.batch_size, Some(100));
}
}