feat(kernel): complete tree-first graph tasks 074-080

This commit is contained in:
lix-2026
2026-04-16 22:01:51 +08:00
parent 2ff10fa86c
commit b1d5d97142
65 changed files with 11579 additions and 4606 deletions
+32 -1
View File
@@ -142,6 +142,14 @@ pub enum SearchMatchField {
Recent,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SearchEvidenceRecord {
pub kind: String,
pub node_id: Option<String>,
pub snippet: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RankedSearchDocument {
@@ -154,6 +162,9 @@ pub struct RankedSearchDocument {
pub has_ocr: bool,
pub public_path: String,
pub score: f64,
pub node_id: Option<String>,
pub subtree_root_id: Option<String>,
pub evidence: Vec<SearchEvidenceRecord>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
@@ -554,16 +565,33 @@ pub fn evaluate_search_documents(
.into_iter()
.filter_map(|(document_id, matched)| {
let document = doc_map.get(document_id.as_str())?;
let snippet = matched.snippet.clone();
let evidence_kind = if matched.has_ocr {
"ocr".to_string()
} else {
match matched.match_field {
SearchMatchField::Title => "title".to_string(),
SearchMatchField::Content => "content".to_string(),
SearchMatchField::Recent => "recent".to_string(),
}
};
Some(RankedSearchDocument {
id: document.id.clone(),
title: normalize_title(document.title.as_deref()),
snippet: matched.snippet,
snippet: snippet.clone(),
updated_at: document.updated_at.clone(),
created_at: document.created_at.clone(),
match_field: matched.match_field,
has_ocr: matched.has_ocr,
public_path: format!("/documents/{}", document.id),
score: matched.score,
node_id: Some(document.id.clone()),
subtree_root_id: Some(document.id.clone()),
evidence: vec![SearchEvidenceRecord {
kind: evidence_kind,
node_id: Some(document.id.clone()),
snippet,
}],
})
})
.collect::<Vec<_>>();
@@ -1063,6 +1091,9 @@ mod tests {
assert_eq!(result.results.len(), 1);
assert_eq!(result.results[0].id, "page_1");
assert!(result.results[0].snippet.contains("<mark>Rust</mark>") || result.results[0].snippet.contains("<mark>rust</mark>"));
assert_eq!(result.results[0].node_id.as_deref(), Some("page_1"));
assert_eq!(result.results[0].subtree_root_id.as_deref(), Some("page_1"));
assert_eq!(result.results[0].evidence.len(), 1);
assert_eq!(result.enqueue_asset_ids, vec!["asset_1".to_string()]);
}
}