Skip to content

Commit 8ad206c

Browse files
committed
[BUG] is_default_schema does not do a space check for defaults or #embedding
1 parent c849806 commit 8ad206c

File tree

2 files changed

+124
-1
lines changed

2 files changed

+124
-1
lines changed

chromadb/test/api/test_schema_e2e.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,64 @@ def test_schema_vector_config_persistence(
107107

108108
collection_name = f"schema_spann_{uuid4().hex}"
109109

110+
schema = Schema()
111+
schema.create_index(
112+
config=VectorIndexConfig(
113+
space="cosine",
114+
spann=SpannIndexConfig(
115+
search_nprobe=16,
116+
write_nprobe=32,
117+
ef_construction=120,
118+
max_neighbors=24,
119+
),
120+
)
121+
)
122+
123+
collection = client.get_or_create_collection(
124+
name=collection_name,
125+
schema=schema,
126+
)
127+
128+
persisted_schema = collection.schema
129+
assert persisted_schema is not None
130+
131+
print(persisted_schema.serialize_to_json())
132+
133+
embedding_override = persisted_schema.keys["#embedding"].float_list
134+
assert embedding_override is not None
135+
vector_index = embedding_override.vector_index
136+
assert vector_index is not None
137+
assert vector_index.enabled is True
138+
assert vector_index.config is not None
139+
assert vector_index.config.space is not None
140+
assert vector_index.config.space == "cosine"
141+
142+
client_reloaded = client_factories.create_client_from_system()
143+
reloaded_collection = client_reloaded.get_collection(
144+
name=collection_name,
145+
)
146+
147+
reloaded_schema = reloaded_collection.schema
148+
assert reloaded_schema is not None
149+
reloaded_embedding_override = reloaded_schema.keys["#embedding"].float_list
150+
assert reloaded_embedding_override is not None
151+
reloaded_vector_index = reloaded_embedding_override.vector_index
152+
assert reloaded_vector_index is not None
153+
assert reloaded_vector_index.config is not None
154+
assert reloaded_vector_index.config.space is not None
155+
assert reloaded_vector_index.config.space == "cosine"
156+
157+
158+
def test_schema_vector_config_persistence_with_ef(
159+
client_factories: "ClientFactories",
160+
) -> None:
161+
"""Ensure schema-provided SPANN settings persist across client restarts."""
162+
163+
client = client_factories.create_client_from_system()
164+
client.reset()
165+
166+
collection_name = f"schema_spann_{uuid4().hex}"
167+
110168
schema = Schema()
111169
embedding_function = SimpleEmbeddingFunction(dim=6)
112170
schema.create_index(

rust/types/src/collection_schema.rs

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1547,8 +1547,13 @@ impl Schema {
15471547
if vector_index.enabled {
15481548
return false;
15491549
}
1550+
if !is_embedding_function_default(&vector_index.config.embedding_function) {
1551+
return false;
1552+
}
1553+
if !is_space_default(&vector_index.config.space) {
1554+
return false;
1555+
}
15501556
// Check that the config has default structure
1551-
// We allow space and embedding_function to vary, but check structure
15521557
if vector_index.config.source_key.is_some() {
15531558
return false;
15541559
}
@@ -1613,6 +1618,9 @@ impl Schema {
16131618
if !vector_index.enabled {
16141619
return false;
16151620
}
1621+
if !is_space_default(&vector_index.config.space) {
1622+
return false;
1623+
}
16161624
// Check that embedding_function is default
16171625
if !is_embedding_function_default(&vector_index.config.embedding_function) {
16181626
return false;
@@ -3804,6 +3812,63 @@ mod tests {
38043812
assert!(!schema_with_extra_overrides.is_default());
38053813
}
38063814

3815+
#[test]
3816+
fn test_is_schema_default_with_space() {
3817+
let schema = Schema::new_default(KnnIndex::Hnsw);
3818+
assert!(schema.is_default());
3819+
3820+
let mut schema_with_space = Schema::new_default(KnnIndex::Hnsw);
3821+
if let Some(ref mut float_list) = schema_with_space.defaults.float_list {
3822+
if let Some(ref mut vector_index) = float_list.vector_index {
3823+
vector_index.config.space = Some(Space::Cosine);
3824+
}
3825+
}
3826+
assert!(!schema_with_space.is_default());
3827+
3828+
let mut schema_with_space_in_embedding_key = Schema::new_default(KnnIndex::Spann);
3829+
if let Some(ref mut embedding_key) = schema_with_space_in_embedding_key
3830+
.keys
3831+
.get_mut(EMBEDDING_KEY)
3832+
{
3833+
if let Some(ref mut float_list) = embedding_key.float_list {
3834+
if let Some(ref mut vector_index) = float_list.vector_index {
3835+
vector_index.config.space = Some(Space::Cosine);
3836+
}
3837+
}
3838+
}
3839+
assert!(!schema_with_space_in_embedding_key.is_default());
3840+
}
3841+
3842+
#[test]
3843+
fn test_is_schema_default_with_embedding_function() {
3844+
let schema = Schema::new_default(KnnIndex::Hnsw);
3845+
assert!(schema.is_default());
3846+
3847+
let mut schema_with_embedding_function = Schema::new_default(KnnIndex::Hnsw);
3848+
if let Some(ref mut float_list) = schema_with_embedding_function.defaults.float_list {
3849+
if let Some(ref mut vector_index) = float_list.vector_index {
3850+
vector_index.config.embedding_function =
3851+
Some(EmbeddingFunctionConfiguration::Legacy);
3852+
}
3853+
}
3854+
assert!(!schema_with_embedding_function.is_default());
3855+
3856+
let mut schema_with_embedding_function_in_embedding_key =
3857+
Schema::new_default(KnnIndex::Spann);
3858+
if let Some(ref mut embedding_key) = schema_with_embedding_function_in_embedding_key
3859+
.keys
3860+
.get_mut(EMBEDDING_KEY)
3861+
{
3862+
if let Some(ref mut float_list) = embedding_key.float_list {
3863+
if let Some(ref mut vector_index) = float_list.vector_index {
3864+
vector_index.config.embedding_function =
3865+
Some(EmbeddingFunctionConfiguration::Legacy);
3866+
}
3867+
}
3868+
}
3869+
assert!(!schema_with_embedding_function_in_embedding_key.is_default());
3870+
}
3871+
38073872
#[test]
38083873
fn test_add_merges_keys_by_value_type() {
38093874
let mut schema_a = Schema::new_default(KnnIndex::Hnsw);

0 commit comments

Comments
 (0)