use nodedb_types::collection::CollectionType;
use nodedb_types::collection_config::{PartitionStrategy, PrimaryEngine};
use nodedb_types::id::DatabaseId;
use nodedb_types::sync::wire::CollectionDescriptor;
use crate::error::LiteError;
use crate::query::engine::LiteQueryEngine;
use crate::storage::engine::StorageEngine;
impl<S: StorageEngine> LiteQueryEngine<S> {
pub(in crate::query) async fn persist_engine_collection_meta(
&self,
name: &str,
collection_type: CollectionType,
fields: Vec<(String, String)>,
bitemporal: bool,
) -> Result<(), LiteError> {
let partition_strategy = PartitionStrategy::default_for_collection_type(&collection_type);
let descriptor = CollectionDescriptor {
tenant_id: 1,
database_id: DatabaseId::DEFAULT,
name: name.to_string(),
collection_type: collection_type.clone(),
bitemporal,
crdt: false,
fields: fields.clone(),
primary: PrimaryEngine::Document,
vector_primary: None,
partition_strategy,
declared_primary_key: None,
descriptor_version: 1,
};
let descriptor_json = sonic_rs::to_string(&descriptor)
.map_err(|e| LiteError::Query(format!("serialize descriptor: {e}")))?;
let meta = crate::nodedb::collection::ddl::CollectionMeta {
name: name.to_string(),
collection_type: collection_type.to_string(),
created_at_ms: crate::runtime::now_millis(),
fields,
config_json: None,
descriptor_json: Some(descriptor_json),
bitemporal,
crdt: false,
};
let key = format!("collection:{name}");
let bytes =
sonic_rs::to_vec(&meta).map_err(|e| LiteError::Query(format!("serialize: {e}")))?;
self.storage
.put(nodedb_types::Namespace::Meta, key.as_bytes(), &bytes)
.await
.map_err(|e| LiteError::Query(format!("storage: {e}")))?;
Ok(())
}
pub(in crate::query) async fn remove_engine_collection_meta(
&self,
name: &str,
) -> Result<(), LiteError> {
let key = format!("collection:{name}");
self.storage
.delete(nodedb_types::Namespace::Meta, key.as_bytes())
.await
.map_err(|e| LiteError::Query(format!("storage: {e}")))?;
Ok(())
}
}