use std::collections::HashMap;
use std::path::PathBuf;
use crate::collection::types::Collection;
use crate::error::{Error, Result};
use crate::point::{Point, SearchResult};
#[derive(Clone)]
pub struct MetadataCollection {
pub(crate) inner: Collection,
}
impl MetadataCollection {
pub fn create(path: PathBuf, name: &str) -> Result<Self> {
Ok(Self {
inner: Collection::create_metadata_only(path, name)?,
})
}
pub fn open(path: PathBuf) -> Result<Self> {
Ok(Self {
inner: Collection::open(path)?,
})
}
pub fn flush(&self) -> Result<()> {
self.inner.flush()
}
pub fn flush_full(&self) -> Result<()> {
self.inner.flush_full()
}
#[must_use]
pub fn name(&self) -> String {
self.inner.config().name
}
#[must_use]
pub fn len(&self) -> usize {
self.inner.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.inner.is_empty()
}
#[must_use]
pub fn all_ids(&self) -> Vec<u64> {
self.inner.all_ids()
}
pub fn upsert(&self, points: impl IntoIterator<Item = Point>) -> Result<()> {
let points: Vec<Point> = points.into_iter().collect();
let name = self.inner.config().name;
for point in &points {
if !point.vector.is_empty() {
return Err(Error::VectorNotAllowed(name.clone()));
}
}
self.inner.upsert_metadata(points)
}
#[must_use]
pub fn get(&self, ids: &[u64]) -> Vec<Option<Point>> {
self.inner.get(ids)
}
pub fn delete(&self, ids: &[u64]) -> Result<()> {
self.inner.delete(ids)
}
pub fn text_search(&self, query: &str, k: usize) -> Result<Vec<SearchResult>> {
self.inner.text_search(query, k)
}
pub fn execute_query(
&self,
query: &crate::velesql::Query,
params: &HashMap<String, serde_json::Value>,
) -> Result<Vec<SearchResult>> {
self.inner.execute_query(query, params)
}
pub fn execute_query_str(
&self,
sql: &str,
params: &HashMap<String, serde_json::Value>,
) -> Result<Vec<SearchResult>> {
self.inner.execute_query_str(sql, params)
}
}