use crate::pgvector::PgVector;
use std::collections::HashSet;
use swiftide_core::{
Persist,
indexing::{self, EmbeddedField},
};
use testcontainers::{ContainerAsync, GenericImage};
#[derive(Clone)]
pub(crate) struct PgVectorTestData<'a> {
pub embed_mode: indexing::EmbedMode,
pub chunk: &'a str,
pub metadata: Option<indexing::Metadata>,
pub vectors: Vec<(indexing::EmbeddedField, Vec<f32>)>,
pub expected_in_results: bool,
}
impl PgVectorTestData<'_> {
pub(crate) fn to_node(&self) -> indexing::TextNode {
let mut base_builder = indexing::TextNode::builder();
let mut builder = base_builder.chunk(self.chunk).embed_mode(self.embed_mode);
if let Some(metadata) = &self.metadata {
builder = builder.metadata(metadata.clone());
}
let mut node = builder.build().unwrap();
node.vectors = Some(self.vectors.clone().into_iter().collect());
node
}
pub(crate) fn create_test_vector(
field: EmbeddedField,
base_value: f32,
) -> (EmbeddedField, Vec<f32>) {
(field, vec![base_value; 384])
}
}
pub(crate) struct TestContext {
pub(crate) pgv_storage: PgVector,
_pgv_db_container: ContainerAsync<GenericImage>,
}
impl TestContext {
pub(crate) async fn setup_with_cfg(
metadata_fields: Option<Vec<&str>>,
vector_fields: HashSet<EmbeddedField>,
) -> Result<Self, Box<dyn std::error::Error>> {
let (pgv_db_container, pgv_db_url) = swiftide_test_utils::start_postgres().await;
tracing::info!("Postgres database URL: {:#?}", pgv_db_url);
let mut connection_pool = PgVector::builder();
let mut builder = connection_pool
.db_url(pgv_db_url)
.vector_size(384)
.table_name("swiftide_pgvector_test".to_string());
for vector_field in vector_fields {
builder = builder.with_vector(vector_field);
}
if let Some(metadata_fields_inner) = metadata_fields {
for field in metadata_fields_inner {
builder = builder.with_metadata(field);
}
}
let pgv_storage = builder.build().map_err(|err| {
tracing::error!("Failed to build PgVector: {}", err);
err
})?;
pgv_storage.setup().await.map_err(|err| {
tracing::error!("PgVector setup failed: {}", err);
err
})?;
Ok(Self {
pgv_storage,
_pgv_db_container: pgv_db_container,
})
}
}