mirror of
https://github.com/meilisearch/meilisearch.git
synced 2025-07-31 02:40:01 +00:00
Remove EdgeIndex and NodeIndex types, prefer u32 instead
This commit is contained in:
@ -26,18 +26,10 @@ pub struct Edges {
|
||||
pub successors: RoaringBitmap,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
||||
pub struct NodeIndex(pub u32);
|
||||
impl fmt::Display for NodeIndex {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
fmt::Display::fmt(&self.0, f)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct QueryGraph {
|
||||
pub root_node: NodeIndex,
|
||||
pub end_node: NodeIndex,
|
||||
pub root_node: u32,
|
||||
pub end_node: u32,
|
||||
pub nodes: Vec<QueryNode>,
|
||||
pub edges: Vec<Edges>,
|
||||
}
|
||||
@ -56,28 +48,28 @@ impl Default for QueryGraph {
|
||||
Edges { predecessors: RoaringBitmap::new(), successors: RoaringBitmap::new() },
|
||||
];
|
||||
|
||||
Self { root_node: NodeIndex(0), end_node: NodeIndex(1), nodes, edges }
|
||||
Self { root_node: 0, end_node: 1, nodes, edges }
|
||||
}
|
||||
}
|
||||
|
||||
impl QueryGraph {
|
||||
fn connect_to_node(&mut self, from_nodes: &[NodeIndex], to_node: NodeIndex) {
|
||||
fn connect_to_node(&mut self, from_nodes: &[u32], to_node: u32) {
|
||||
for &from_node in from_nodes {
|
||||
self.edges[from_node.0 as usize].successors.insert(to_node.0);
|
||||
self.edges[to_node.0 as usize].predecessors.insert(from_node.0);
|
||||
self.edges[from_node as usize].successors.insert(to_node);
|
||||
self.edges[to_node as usize].predecessors.insert(from_node);
|
||||
}
|
||||
}
|
||||
fn add_node(&mut self, from_nodes: &[NodeIndex], node: QueryNode) -> NodeIndex {
|
||||
fn add_node(&mut self, from_nodes: &[u32], node: QueryNode) -> u32 {
|
||||
let new_node_idx = self.nodes.len() as u32;
|
||||
self.nodes.push(node);
|
||||
self.edges.push(Edges {
|
||||
predecessors: from_nodes.iter().map(|x| x.0).collect(),
|
||||
predecessors: from_nodes.iter().collect(),
|
||||
successors: RoaringBitmap::new(),
|
||||
});
|
||||
for from_node in from_nodes {
|
||||
self.edges[from_node.0 as usize].successors.insert(new_node_idx);
|
||||
self.edges[*from_node as usize].successors.insert(new_node_idx);
|
||||
}
|
||||
NodeIndex(new_node_idx)
|
||||
new_node_idx
|
||||
}
|
||||
}
|
||||
|
||||
@ -99,7 +91,7 @@ impl QueryGraph {
|
||||
let word_set = index.words_fst(txn)?;
|
||||
let mut graph = QueryGraph::default();
|
||||
|
||||
let (mut prev2, mut prev1, mut prev0): (Vec<NodeIndex>, Vec<NodeIndex>, Vec<NodeIndex>) =
|
||||
let (mut prev2, mut prev1, mut prev0): (Vec<u32>, Vec<u32>, Vec<u32>) =
|
||||
(vec![], vec![], vec![graph.root_node]);
|
||||
|
||||
// TODO: add all the word derivations found in the fst
|
||||
@ -173,33 +165,33 @@ impl QueryGraph {
|
||||
|
||||
Ok(graph)
|
||||
}
|
||||
pub fn remove_nodes(&mut self, nodes: &[NodeIndex]) {
|
||||
pub fn remove_nodes(&mut self, nodes: &[u32]) {
|
||||
for &node in nodes {
|
||||
self.nodes[node.0 as usize] = QueryNode::Deleted;
|
||||
let edges = self.edges[node.0 as usize].clone();
|
||||
self.nodes[node as usize] = QueryNode::Deleted;
|
||||
let edges = self.edges[node as usize].clone();
|
||||
for pred in edges.predecessors.iter() {
|
||||
self.edges[pred as usize].successors.remove(node.0);
|
||||
self.edges[pred as usize].successors.remove(node);
|
||||
}
|
||||
for succ in edges.successors {
|
||||
self.edges[succ as usize].predecessors.remove(node.0);
|
||||
self.edges[succ as usize].predecessors.remove(node);
|
||||
}
|
||||
self.edges[node.0 as usize] =
|
||||
self.edges[node as usize] =
|
||||
Edges { predecessors: RoaringBitmap::new(), successors: RoaringBitmap::new() };
|
||||
}
|
||||
}
|
||||
pub fn remove_nodes_keep_edges(&mut self, nodes: &[NodeIndex]) {
|
||||
pub fn remove_nodes_keep_edges(&mut self, nodes: &[u32]) {
|
||||
for &node in nodes {
|
||||
self.nodes[node.0 as usize] = QueryNode::Deleted;
|
||||
let edges = self.edges[node.0 as usize].clone();
|
||||
self.nodes[node as usize] = QueryNode::Deleted;
|
||||
let edges = self.edges[node as usize].clone();
|
||||
for pred in edges.predecessors.iter() {
|
||||
self.edges[pred as usize].successors.remove(node.0);
|
||||
self.edges[pred as usize].successors.remove(node);
|
||||
self.edges[pred as usize].successors |= &edges.successors;
|
||||
}
|
||||
for succ in edges.successors {
|
||||
self.edges[succ as usize].predecessors.remove(node.0);
|
||||
self.edges[succ as usize].predecessors.remove(node);
|
||||
self.edges[succ as usize].predecessors |= &edges.predecessors;
|
||||
}
|
||||
self.edges[node.0 as usize] =
|
||||
self.edges[node as usize] =
|
||||
Edges { predecessors: RoaringBitmap::new(), successors: RoaringBitmap::new() };
|
||||
}
|
||||
}
|
||||
@ -207,7 +199,7 @@ impl QueryGraph {
|
||||
let mut nodes_to_remove_keeping_edges = vec![];
|
||||
let mut nodes_to_remove = vec![];
|
||||
for (node_idx, node) in self.nodes.iter().enumerate() {
|
||||
let node_idx = NodeIndex(node_idx as u32);
|
||||
let node_idx = node_idx as u32;
|
||||
let QueryNode::Term(LocatedQueryTerm { value: _, positions }) = node else { continue };
|
||||
if positions.contains(&position) {
|
||||
nodes_to_remove_keeping_edges.push(node_idx)
|
||||
@ -231,7 +223,7 @@ impl QueryGraph {
|
||||
|| (!matches!(node, QueryNode::Start | QueryNode::Deleted)
|
||||
&& self.edges[node_idx].predecessors.is_empty())
|
||||
{
|
||||
nodes_to_remove.push(NodeIndex(node_idx as u32));
|
||||
nodes_to_remove.push(node_idx as u32);
|
||||
}
|
||||
}
|
||||
if nodes_to_remove.is_empty() {
|
||||
@ -315,9 +307,9 @@ node [shape = "record"]
|
||||
continue;
|
||||
}
|
||||
desc.push_str(&format!("{node} [label = {:?}]", &self.nodes[node],));
|
||||
if node == self.root_node.0 as usize {
|
||||
if node == self.root_node as usize {
|
||||
desc.push_str("[color = blue]");
|
||||
} else if node == self.end_node.0 as usize {
|
||||
} else if node == self.end_node as usize {
|
||||
desc.push_str("[color = red]");
|
||||
}
|
||||
desc.push_str(";\n");
|
||||
|
Reference in New Issue
Block a user