use terraphim_rolegraph::RoleGraph;
use terraphim_types::{IndexedDocument, SearchQuery};
pub fn query_with_learnings(
graph: &RoleGraph,
query: &SearchQuery,
include_learnings: bool,
) -> Vec<IndexedDocument> {
let query_text = query.search_term.as_str();
let mut merged = std::collections::HashMap::new();
if let Ok(results) = graph.query_graph(query_text, query.skip, query.limit) {
for (id, doc) in results {
merged.insert(id, doc);
}
}
if include_learnings {
for doc in graph.get_learning_documents(query_text) {
merged
.entry(doc.id.clone())
.and_modify(|existing: &mut IndexedDocument| {
if doc.rank > existing.rank {
*existing = doc.clone();
}
})
.or_insert_with(|| doc.clone());
}
}
let mut results: Vec<_> = merged.into_values().collect();
results.sort_by_key(|b| std::cmp::Reverse(b.rank));
results
}