use super::types::{EdgeTypeMetadata, IndexMetadata, TagMetadata};
use std::collections::HashMap;
#[derive(Debug, Default, Clone)]
pub struct MetadataContext {
index_metadata: HashMap<String, IndexMetadata>,
tag_metadata: HashMap<String, TagMetadata>,
edge_type_metadata: HashMap<String, EdgeTypeMetadata>,
}
impl MetadataContext {
pub fn new() -> Self {
Self {
index_metadata: HashMap::new(),
tag_metadata: HashMap::new(),
edge_type_metadata: HashMap::new(),
}
}
pub fn set_index_metadata(&mut self, index_name: String, metadata: IndexMetadata) {
self.index_metadata.insert(index_name, metadata);
}
pub fn set_tag_metadata(&mut self, tag_name: String, metadata: TagMetadata) {
self.tag_metadata.insert(tag_name, metadata);
}
pub fn set_edge_type_metadata(&mut self, edge_type: String, metadata: EdgeTypeMetadata) {
self.edge_type_metadata.insert(edge_type, metadata);
}
pub fn get_index_metadata(&self, index_name: &str) -> Option<&IndexMetadata> {
self.index_metadata.get(index_name)
}
pub fn get_tag_metadata(&self, tag_name: &str) -> Option<&TagMetadata> {
self.tag_metadata.get(tag_name)
}
pub fn get_tag_metadata_mut(&mut self, tag_name: &str) -> Option<&mut TagMetadata> {
self.tag_metadata.get_mut(tag_name)
}
pub fn get_edge_type_metadata(&self, edge_type: &str) -> Option<&EdgeTypeMetadata> {
self.edge_type_metadata.get(edge_type)
}
pub fn get_edge_type_metadata_mut(&mut self, edge_type: &str) -> Option<&mut EdgeTypeMetadata> {
self.edge_type_metadata.get_mut(edge_type)
}
pub fn has_index_metadata(&self, index_name: &str) -> bool {
self.index_metadata.contains_key(index_name)
}
pub fn has_tag_metadata(&self, tag_name: &str) -> bool {
self.tag_metadata.contains_key(tag_name)
}
pub fn has_edge_type_metadata(&self, edge_type: &str) -> bool {
self.edge_type_metadata.contains_key(edge_type)
}
pub fn get_all_indexes(&self) -> impl Iterator<Item = &IndexMetadata> {
self.index_metadata.values()
}
pub fn get_all_tags(&self) -> impl Iterator<Item = &TagMetadata> {
self.tag_metadata.values()
}
pub fn get_all_edge_types(&self) -> impl Iterator<Item = &EdgeTypeMetadata> {
self.edge_type_metadata.values()
}
pub fn clear(&mut self) {
self.index_metadata.clear();
self.tag_metadata.clear();
self.edge_type_metadata.clear();
}
pub fn merge(&mut self, other: MetadataContext) {
self.index_metadata.extend(other.index_metadata);
self.tag_metadata.extend(other.tag_metadata);
self.edge_type_metadata.extend(other.edge_type_metadata);
}
pub fn find_vector_index_by_field(
&self,
space_id: u64,
field_name: &str,
) -> Option<&IndexMetadata> {
self.index_metadata.values().find(|index| {
index.space_id == space_id
&& index.field_name == field_name
&& index.index_type == super::types::IndexType::Vector
})
}
pub fn find_fulltext_index_by_field(
&self,
space_id: u64,
field_name: &str,
) -> Option<&IndexMetadata> {
self.index_metadata.values().find(|index| {
index.space_id == space_id
&& index.field_name == field_name
&& index.index_type == super::types::IndexType::Fulltext
})
}
pub fn find_index_by_name(
&self,
index_name: &str,
index_type: Option<super::types::IndexType>,
) -> Option<&IndexMetadata> {
self.index_metadata.values().find(|index| {
index.index_name == index_name && index_type.is_none_or(|t| index.index_type == t)
})
}
}