use crate::storage::RocksDb as DB;
use dashmap::DashMap;
use parking_lot::RwLock;
use serde_json::Value;
use std::collections::hash_map::DefaultHasher;
use std::sync::atomic::{AtomicBool, AtomicUsize};
use std::sync::Arc;
pub use super::document::Document;
pub use super::geo::{GeoIndex, GeoIndexStats};
pub use super::index::{
FulltextMatch, Index, IndexStats, IndexType, TtlIndex, TtlIndexStats, VectorIndexConfig,
VectorIndexStats, VectorQuantization,
};
pub use super::schema::SchemaValidator;
pub use super::vector::{VectorIndex, VectorSearchResult};
use cuckoofilter::CuckooFilter;
use fastbloom::BloomFilter;
pub mod auto_index;
pub mod blobs;
pub mod core;
pub mod crud;
pub mod fulltext;
pub mod geo;
pub mod hybrid;
pub mod index_meta;
pub mod indexes;
pub mod schema;
pub mod ttl;
pub mod txn;
pub mod vector;
pub mod versioning;
pub use self::hybrid::{FusionMethod, HybridSearchOptions, HybridSearchResult};
pub use self::vector::QuantizationStats;
pub const DOC_PREFIX: &str = "doc:";
pub const IDX_PREFIX: &str = "idx:";
pub const IDX_META_PREFIX: &str = "idx_meta:";
pub const GEO_PREFIX: &str = "geo:";
pub const GEO_META_PREFIX: &str = "geo_meta:";
pub const FT_PREFIX: &str = "ft:"; pub const FT_META_PREFIX: &str = "ft_meta:"; pub const FT_TERM_PREFIX: &str = "ft_term:"; pub const STATS_COUNT_KEY: &str = "_stats:count"; pub const SHARD_CONFIG_KEY: &str = "_stats:shard_config"; pub const SHARD_TABLE_KEY: &str = "_stats:shard_table"; pub const COLLECTION_TYPE_KEY: &str = "_stats:type"; pub const BLO_PREFIX: &str = "blo:"; pub const BLO_TMP_PREFIX: &str = "blo_tmp:"; pub const TTL_META_PREFIX: &str = "ttl_meta:"; pub const TTL_EXPIRY_PREFIX: &str = "ttl_exp:";
pub const BLO_IDX_PREFIX: &str = "blo_idx:"; pub const CFO_IDX_PREFIX: &str = "cfo_idx:"; pub const SCHEMA_KEY: &str = "_stats:schema"; pub const VEC_META_PREFIX: &str = "vec_meta:"; pub const VEC_DATA_PREFIX: &str = "vec_data:"; pub const EMBED_PENDING_PREFIX: &str = "embed_pending:"; pub const DOCV_PREFIX: &str = "docv:"; pub const VERSIONING_META_KEY: &str = "versioning_enabled"; pub const AUTO_INDEX_META_KEY: &str = "auto_index_enabled"; pub const ROW_POLICY_META_KEY: &str = "row_policy"; pub const NGRAM_SIZE: usize = 3;
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum ChangeType {
Insert,
Update,
Delete,
Truncate,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct ChangeEvent {
#[serde(rename = "type")]
pub type_: ChangeType,
pub key: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub old_data: Option<Value>,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct FulltextIndex {
pub name: String,
#[serde(
alias = "field",
deserialize_with = "crate::storage::index::deserialize_fields"
)]
pub fields: Vec<String>,
#[serde(default = "default_min_length")]
pub min_length: usize,
}
fn default_min_length() -> usize {
3
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct CollectionStats {
pub name: String,
pub document_count: usize,
pub chunk_count: usize,
pub disk_usage: DiskUsage,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct DiskUsage {
pub sst_files_size: u64,
pub live_data_size: u64,
pub num_sst_files: u64,
pub memtable_size: u64,
}
pub struct Collection {
pub name: String,
pub(crate) db: Arc<DB>,
pub(crate) doc_count: Arc<AtomicUsize>,
pub(crate) chunk_count: Arc<AtomicUsize>,
pub(crate) count_dirty: Arc<AtomicBool>,
pub(crate) last_flush_time: Arc<std::sync::atomic::AtomicU64>,
pub(crate) vec_dirty: Arc<AtomicBool>,
pub(crate) vec_last_persist: Arc<std::sync::atomic::AtomicU64>,
pub change_sender: Arc<tokio::sync::broadcast::Sender<ChangeEvent>>,
pub(crate) collection_type: Arc<RwLock<String>>,
pub(crate) bloom_filters: Arc<DashMap<String, BloomFilter>>,
pub(crate) cuckoo_filters: Arc<DashMap<String, CuckooFilter<DefaultHasher>>>,
pub(crate) vector_indexes: Arc<DashMap<String, Arc<VectorIndex>>>,
pub(crate) schema_validator: Arc<RwLock<Option<SchemaValidator>>>,
pub(crate) schema_hash: Arc<RwLock<Option<u64>>>,
}
impl Clone for Collection {
fn clone(&self) -> Self {
Self {
name: self.name.clone(),
db: self.db.clone(),
doc_count: self.doc_count.clone(),
chunk_count: self.chunk_count.clone(),
count_dirty: self.count_dirty.clone(),
last_flush_time: self.last_flush_time.clone(),
vec_dirty: self.vec_dirty.clone(),
vec_last_persist: self.vec_last_persist.clone(),
change_sender: self.change_sender.clone(),
collection_type: self.collection_type.clone(),
bloom_filters: self.bloom_filters.clone(),
cuckoo_filters: self.cuckoo_filters.clone(),
vector_indexes: self.vector_indexes.clone(),
schema_validator: self.schema_validator.clone(),
schema_hash: self.schema_hash.clone(),
}
}
}
impl std::fmt::Debug for Collection {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Collection")
.field("name", &self.name)
.finish()
}
}