Skip to content

Commit 7308eab

Browse files
quangdang46claude
andcommitted
fix: guard Layer3.search_raw against None doc/metadata
Port upstream fix from mempalace#1011 - ChromaDB may return None for doc/meta when a drawer's HNSW entry exists but its metadata/document rows haven't been materialized (partial-flush states, mid-delete, schema upgrade boundaries). Now degrades gracefully with fallback values. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent fb9b0c6 commit 7308eab

1 file changed

Lines changed: 7 additions & 1 deletion

File tree

crates/core/src/layers.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,12 +326,18 @@ impl Layer3 {
326326
let mut hits = Vec::new();
327327
for qr in results {
328328
for (i, doc) in qr.documents.iter().enumerate() {
329+
// ChromaDB may return None for doc/meta when a drawer's HNSW entry
330+
// exists but its metadata/document rows haven't been materialized
331+
// (partial-flush states, mid-delete, schema upgrade boundaries).
332+
// Degrade gracefully — the hit still appears with real distance;
333+
// storage fields show their fallback where content is missing.
334+
let doc = doc.clone();
329335
let meta = qr.metadatas.get(i).cloned().unwrap_or_default();
330336
let distance = qr.distances.get(i).copied().unwrap_or(1.0);
331337
let similarity: f64 = (1.0 - distance).clamp(0.0_f64, 1.0);
332338

333339
hits.push(SearchHit {
334-
text: doc.clone(),
340+
text: doc,
335341
wing: meta.get("wing").and_then(|v| v.as_str().map(String::from)),
336342
room: meta.get("room").and_then(|v| v.as_str().map(String::from)),
337343
source_file: meta

0 commit comments

Comments
 (0)