mirror of
https://github.com/meilisearch/meilisearch.git
synced 2025-08-02 03:40:00 +00:00
Refactor of the Interner
This commit is contained in:
@ -1,7 +1,7 @@
|
||||
use std::collections::HashSet;
|
||||
|
||||
use super::{Edge, RankingRuleGraph, RankingRuleGraphTrait};
|
||||
use crate::search::new::interner::Interner;
|
||||
use crate::search::new::interner::{DedupInterner, Interner};
|
||||
use crate::search::new::small_bitmap::SmallBitmap;
|
||||
use crate::search::new::{QueryGraph, SearchContext};
|
||||
use crate::Result;
|
||||
@ -15,40 +15,43 @@ impl<G: RankingRuleGraphTrait> RankingRuleGraph<G> {
|
||||
|
||||
/// Build the ranking rule graph from the given query graph
|
||||
pub fn build(ctx: &mut SearchContext, query_graph: QueryGraph) -> Result<Self> {
|
||||
let QueryGraph { nodes: graph_nodes, edges: graph_edges, .. } = &query_graph;
|
||||
let QueryGraph { nodes: graph_nodes, .. } = &query_graph;
|
||||
|
||||
let mut conditions_interner = Interner::default();
|
||||
let mut conditions_interner = DedupInterner::default();
|
||||
|
||||
let mut edges_store = vec![];
|
||||
let mut edges_of_node = vec![];
|
||||
let mut edges_store = Interner::default();
|
||||
let mut edges_of_node = query_graph.nodes.map(|_| HashSet::new());
|
||||
|
||||
for (source_idx, source_node) in graph_nodes.iter().enumerate() {
|
||||
edges_of_node.push(HashSet::new());
|
||||
let new_edges = edges_of_node.last_mut().unwrap();
|
||||
for (source_id, source_node) in graph_nodes.iter() {
|
||||
let new_edges = edges_of_node.get_mut(source_id);
|
||||
|
||||
for dest_idx in graph_edges[source_idx].successors.iter() {
|
||||
let dest_node = &graph_nodes[dest_idx as usize];
|
||||
for dest_idx in source_node.successors.iter() {
|
||||
let dest_node = graph_nodes.get(dest_idx);
|
||||
let edges = G::build_edges(ctx, &mut conditions_interner, source_node, dest_node)?;
|
||||
if edges.is_empty() {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (cost, condition) in edges {
|
||||
edges_store.push(Some(Edge {
|
||||
source_node: source_idx as u16,
|
||||
let new_edge_id = edges_store.push(Some(Edge {
|
||||
source_node: source_id,
|
||||
dest_node: dest_idx,
|
||||
cost,
|
||||
condition,
|
||||
}));
|
||||
new_edges.insert(edges_store.len() as u16 - 1);
|
||||
new_edges.insert(new_edge_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
let edges_of_node = edges_of_node
|
||||
.into_iter()
|
||||
.map(|edges| SmallBitmap::from_iter(edges.into_iter(), edges_store.len() as u16))
|
||||
.collect();
|
||||
let edges_store = edges_store.freeze();
|
||||
let edges_of_node =
|
||||
edges_of_node.map(|edges| SmallBitmap::from_iter(edges.iter().copied(), &edges_store));
|
||||
|
||||
Ok(RankingRuleGraph { query_graph, edges_store, edges_of_node, conditions_interner })
|
||||
Ok(RankingRuleGraph {
|
||||
query_graph,
|
||||
edges_store,
|
||||
edges_of_node,
|
||||
conditions_interner: conditions_interner.freeze(),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user