feat(kernel): complete tree-first graph tasks 074-080
This commit is contained in:
@@ -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()]);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user