Renaming Edge -> Condition

This commit is contained in:
Loïc Lecrenier 2023-03-16 11:49:23 +01:00
parent aa59c3bc2c
commit 2853009987
9 changed files with 97 additions and 97 deletions

View File

@ -45,7 +45,7 @@ use super::interner::MappedInterner;
use super::logger::SearchLogger; use super::logger::SearchLogger;
use super::query_graph::QueryNode; use super::query_graph::QueryNode;
use super::ranking_rule_graph::{ use super::ranking_rule_graph::{
DeadEndPathCache, EdgeConditionDocIdsCache, ProximityGraph, RankingRuleGraph, ConditionDocIdsCache, DeadEndPathCache, ProximityGraph, RankingRuleGraph,
RankingRuleGraphTrait, TypoGraph, RankingRuleGraphTrait, TypoGraph,
}; };
use super::small_bitmap::SmallBitmap; use super::small_bitmap::SmallBitmap;
@ -85,12 +85,12 @@ pub struct GraphBasedRankingRuleState<G: RankingRuleGraphTrait> {
/// The current graph /// The current graph
graph: RankingRuleGraph<G>, graph: RankingRuleGraph<G>,
/// Cache to retrieve the docids associated with each edge /// Cache to retrieve the docids associated with each edge
edge_conditions_cache: EdgeConditionDocIdsCache<G>, conditions_cache: ConditionDocIdsCache<G>,
/// Cache used to optimistically discard paths that resolve to no documents. /// Cache used to optimistically discard paths that resolve to no documents.
dead_end_path_cache: DeadEndPathCache<G>, dead_end_path_cache: DeadEndPathCache<G>,
/// A structure giving the list of possible costs from each node to the end node, /// A structure giving the list of possible costs from each node to the end node,
/// along with a set of unavoidable edges that must be traversed to achieve that distance. /// along with a set of unavoidable edges that must be traversed to achieve that distance.
all_distances: MappedInterner<Vec<(u16, SmallBitmap<G::EdgeCondition>)>, QueryNode>, all_distances: MappedInterner<Vec<(u16, SmallBitmap<G::Condition>)>, QueryNode>,
/// An index in the first element of `all_distances`, giving the cost of the next bucket /// An index in the first element of `all_distances`, giving the cost of the next bucket
cur_distance_idx: usize, cur_distance_idx: usize,
} }
@ -101,7 +101,7 @@ pub struct GraphBasedRankingRuleState<G: RankingRuleGraphTrait> {
fn remove_empty_edges<'ctx, G: RankingRuleGraphTrait>( fn remove_empty_edges<'ctx, G: RankingRuleGraphTrait>(
ctx: &mut SearchContext<'ctx>, ctx: &mut SearchContext<'ctx>,
graph: &mut RankingRuleGraph<G>, graph: &mut RankingRuleGraph<G>,
condition_docids_cache: &mut EdgeConditionDocIdsCache<G>, condition_docids_cache: &mut ConditionDocIdsCache<G>,
universe: &RoaringBitmap, universe: &RoaringBitmap,
dead_end_path_cache: &mut DeadEndPathCache<G>, dead_end_path_cache: &mut DeadEndPathCache<G>,
) -> Result<()> { ) -> Result<()> {
@ -135,7 +135,7 @@ impl<'ctx, G: RankingRuleGraphTrait> RankingRule<'ctx, QueryGraph> for GraphBase
query_graph: &QueryGraph, query_graph: &QueryGraph,
) -> Result<()> { ) -> Result<()> {
let mut graph = RankingRuleGraph::build(ctx, query_graph.clone())?; let mut graph = RankingRuleGraph::build(ctx, query_graph.clone())?;
let mut condition_docids_cache = EdgeConditionDocIdsCache::default(); let mut condition_docids_cache = ConditionDocIdsCache::default();
let mut dead_end_path_cache = DeadEndPathCache::new(&graph.conditions_interner); let mut dead_end_path_cache = DeadEndPathCache::new(&graph.conditions_interner);
// First simplify the graph as much as possible, by computing the docids of all the conditions // First simplify the graph as much as possible, by computing the docids of all the conditions
@ -153,7 +153,7 @@ impl<'ctx, G: RankingRuleGraphTrait> RankingRule<'ctx, QueryGraph> for GraphBase
let state = GraphBasedRankingRuleState { let state = GraphBasedRankingRuleState {
graph, graph,
edge_conditions_cache: condition_docids_cache, conditions_cache: condition_docids_cache,
dead_end_path_cache, dead_end_path_cache,
all_distances, all_distances,
cur_distance_idx: 0, cur_distance_idx: 0,
@ -181,7 +181,7 @@ impl<'ctx, G: RankingRuleGraphTrait> RankingRule<'ctx, QueryGraph> for GraphBase
remove_empty_edges( remove_empty_edges(
ctx, ctx,
&mut state.graph, &mut state.graph,
&mut state.edge_conditions_cache, &mut state.conditions_cache,
universe, universe,
&mut state.dead_end_path_cache, &mut state.dead_end_path_cache,
)?; )?;
@ -204,7 +204,7 @@ impl<'ctx, G: RankingRuleGraphTrait> RankingRule<'ctx, QueryGraph> for GraphBase
let GraphBasedRankingRuleState { let GraphBasedRankingRuleState {
graph, graph,
edge_conditions_cache: condition_docids_cache, conditions_cache: condition_docids_cache,
dead_end_path_cache, dead_end_path_cache,
all_distances, all_distances,
cur_distance_idx: _, cur_distance_idx: _,
@ -326,8 +326,8 @@ impl<'ctx, G: RankingRuleGraphTrait> RankingRule<'ctx, QueryGraph> for GraphBase
let mut used_phrases = HashSet::new(); let mut used_phrases = HashSet::new();
for condition in used_conditions.iter() { for condition in used_conditions.iter() {
let condition = graph.conditions_interner.get(condition); let condition = graph.conditions_interner.get(condition);
used_words.extend(G::words_used_by_edge_condition(ctx, condition)?); used_words.extend(G::words_used_by_condition(ctx, condition)?);
used_phrases.extend(G::phrases_used_by_edge_condition(ctx, condition)?); used_phrases.extend(G::phrases_used_by_condition(ctx, condition)?);
} }
// 2. Remove the unused words and phrases from all the nodes in the graph // 2. Remove the unused words and phrases from all the nodes in the graph
let mut nodes_to_remove = vec![]; let mut nodes_to_remove = vec![];

View File

@ -11,7 +11,7 @@ use crate::search::new::query_graph::QueryNodeData;
use crate::search::new::query_term::{LocatedQueryTerm, QueryTerm}; use crate::search::new::query_term::{LocatedQueryTerm, QueryTerm};
use crate::search::new::ranking_rule_graph::{ use crate::search::new::ranking_rule_graph::{
DeadEndPathCache, Edge, ProximityCondition, ProximityGraph, RankingRuleGraph, DeadEndPathCache, Edge, ProximityCondition, ProximityGraph, RankingRuleGraph,
RankingRuleGraphTrait, TypoEdge, TypoGraph, RankingRuleGraphTrait, TypoCondition, TypoGraph,
}; };
use crate::search::new::small_bitmap::SmallBitmap; use crate::search::new::small_bitmap::SmallBitmap;
use crate::search::new::{QueryGraph, QueryNode, SearchContext}; use crate::search::new::{QueryGraph, QueryNode, SearchContext};
@ -51,10 +51,10 @@ pub enum SearchEvents {
}, },
TypoState { TypoState {
graph: RankingRuleGraph<TypoGraph>, graph: RankingRuleGraph<TypoGraph>,
paths: Vec<Vec<Interned<TypoEdge>>>, paths: Vec<Vec<Interned<TypoCondition>>>,
dead_end_path_cache: DeadEndPathCache<TypoGraph>, dead_end_path_cache: DeadEndPathCache<TypoGraph>,
universe: RoaringBitmap, universe: RoaringBitmap,
distances: MappedInterner<Vec<(u16, SmallBitmap<TypoEdge>)>, QueryNode>, distances: MappedInterner<Vec<(u16, SmallBitmap<TypoCondition>)>, QueryNode>,
cost: u16, cost: u16,
}, },
RankingRuleSkipBucket { RankingRuleSkipBucket {
@ -188,10 +188,10 @@ impl SearchLogger<QueryGraph> for DetailedSearchLogger {
fn log_typo_state( fn log_typo_state(
&mut self, &mut self,
query_graph: &RankingRuleGraph<TypoGraph>, query_graph: &RankingRuleGraph<TypoGraph>,
paths_map: &[Vec<Interned<TypoEdge>>], paths_map: &[Vec<Interned<TypoCondition>>],
dead_end_path_cache: &DeadEndPathCache<TypoGraph>, dead_end_path_cache: &DeadEndPathCache<TypoGraph>,
universe: &RoaringBitmap, universe: &RoaringBitmap,
distances: &MappedInterner<Vec<(u16, SmallBitmap<TypoEdge>)>, QueryNode>, distances: &MappedInterner<Vec<(u16, SmallBitmap<TypoCondition>)>, QueryNode>,
cost: u16, cost: u16,
) { ) {
self.events.push(SearchEvents::TypoState { self.events.push(SearchEvents::TypoState {
@ -430,7 +430,7 @@ results.{random} {{
ctx: &mut SearchContext, ctx: &mut SearchContext,
node_idx: Interned<QueryNode>, node_idx: Interned<QueryNode>,
node: &QueryNode, node: &QueryNode,
distances: &[(u16, SmallBitmap<R::EdgeCondition>)], distances: &[(u16, SmallBitmap<R::Condition>)],
file: &mut File, file: &mut File,
) { ) {
match &node.data { match &node.data {
@ -527,9 +527,9 @@ shape: class"
fn ranking_rule_graph_d2_description<R: RankingRuleGraphTrait>( fn ranking_rule_graph_d2_description<R: RankingRuleGraphTrait>(
ctx: &mut SearchContext, ctx: &mut SearchContext,
graph: &RankingRuleGraph<R>, graph: &RankingRuleGraph<R>,
paths: &[Vec<Interned<R::EdgeCondition>>], paths: &[Vec<Interned<R::Condition>>],
dead_end_paths_cache: &DeadEndPathCache<R>, dead_end_paths_cache: &DeadEndPathCache<R>,
distances: MappedInterner<Vec<(u16, SmallBitmap<R::EdgeCondition>)>, QueryNode>, distances: MappedInterner<Vec<(u16, SmallBitmap<R::Condition>)>, QueryNode>,
file: &mut File, file: &mut File,
) { ) {
writeln!(file, "direction: right").unwrap(); writeln!(file, "direction: right").unwrap();
@ -596,7 +596,7 @@ shape: class"
fn condition_d2_description<R: RankingRuleGraphTrait>( fn condition_d2_description<R: RankingRuleGraphTrait>(
ctx: &mut SearchContext, ctx: &mut SearchContext,
graph: &RankingRuleGraph<R>, graph: &RankingRuleGraph<R>,
condition_id: Interned<R::EdgeCondition>, condition_id: Interned<R::Condition>,
file: &mut File, file: &mut File,
) { ) {
let condition = graph.conditions_interner.get(condition_id); let condition = graph.conditions_interner.get(condition_id);
@ -606,14 +606,14 @@ shape: class"
shape: class shape: class
{} {}
}}", }}",
R::label_for_edge_condition(ctx, condition).unwrap() R::label_for_condition(ctx, condition).unwrap()
) )
.unwrap(); .unwrap();
} }
fn paths_d2_description<R: RankingRuleGraphTrait>( fn paths_d2_description<R: RankingRuleGraphTrait>(
ctx: &mut SearchContext, ctx: &mut SearchContext,
graph: &RankingRuleGraph<R>, graph: &RankingRuleGraph<R>,
paths: &[Vec<Interned<R::EdgeCondition>>], paths: &[Vec<Interned<R::Condition>>],
file: &mut File, file: &mut File,
) { ) {
for (path_idx, condition_indexes) in paths.iter().enumerate() { for (path_idx, condition_indexes) in paths.iter().enumerate() {

View File

@ -6,7 +6,8 @@ use roaring::RoaringBitmap;
use super::interner::{Interned, MappedInterner}; use super::interner::{Interned, MappedInterner};
use super::query_graph::QueryNode; use super::query_graph::QueryNode;
use super::ranking_rule_graph::{ use super::ranking_rule_graph::{
DeadEndPathCache, ProximityCondition, ProximityGraph, RankingRuleGraph, TypoEdge, TypoGraph, DeadEndPathCache, ProximityCondition, ProximityGraph, RankingRuleGraph, TypoCondition,
TypoGraph,
}; };
use super::small_bitmap::SmallBitmap; use super::small_bitmap::SmallBitmap;
use super::{RankingRule, RankingRuleQueryTrait}; use super::{RankingRule, RankingRuleQueryTrait};
@ -76,10 +77,10 @@ pub trait SearchLogger<Q: RankingRuleQueryTrait> {
fn log_typo_state( fn log_typo_state(
&mut self, &mut self,
query_graph: &RankingRuleGraph<TypoGraph>, query_graph: &RankingRuleGraph<TypoGraph>,
paths: &[Vec<Interned<TypoEdge>>], paths: &[Vec<Interned<TypoCondition>>],
dead_end_path_cache: &DeadEndPathCache<TypoGraph>, dead_end_path_cache: &DeadEndPathCache<TypoGraph>,
universe: &RoaringBitmap, universe: &RoaringBitmap,
distances: &MappedInterner<Vec<(u16, SmallBitmap<TypoEdge>)>, QueryNode>, distances: &MappedInterner<Vec<(u16, SmallBitmap<TypoCondition>)>, QueryNode>,
cost: u16, cost: u16,
); );
} }
@ -147,10 +148,10 @@ impl<Q: RankingRuleQueryTrait> SearchLogger<Q> for DefaultSearchLogger {
fn log_typo_state( fn log_typo_state(
&mut self, &mut self,
_query_graph: &RankingRuleGraph<TypoGraph>, _query_graph: &RankingRuleGraph<TypoGraph>,
_paths: &[Vec<Interned<TypoEdge>>], _paths: &[Vec<Interned<TypoCondition>>],
_dead_end_path_cache: &DeadEndPathCache<TypoGraph>, _dead_end_path_cache: &DeadEndPathCache<TypoGraph>,
_universe: &RoaringBitmap, _universe: &RoaringBitmap,
_distances: &MappedInterner<Vec<(u16, SmallBitmap<TypoEdge>)>, QueryNode>, _distances: &MappedInterner<Vec<(u16, SmallBitmap<TypoCondition>)>, QueryNode>,
_cost: u16, _cost: u16,
) { ) {
} }

View File

@ -22,10 +22,10 @@ impl<G: RankingRuleGraphTrait> RankingRuleGraph<G> {
&mut self, &mut self,
from: Interned<QueryNode>, from: Interned<QueryNode>,
cost: u16, cost: u16,
all_distances: &MappedInterner<Vec<(u16, SmallBitmap<G::EdgeCondition>)>, QueryNode>, all_distances: &MappedInterner<Vec<(u16, SmallBitmap<G::Condition>)>, QueryNode>,
dead_end_path_cache: &mut DeadEndPathCache<G>, dead_end_path_cache: &mut DeadEndPathCache<G>,
mut visit: impl FnMut( mut visit: impl FnMut(
&[Interned<G::EdgeCondition>], &[Interned<G::Condition>],
&mut Self, &mut Self,
&mut DeadEndPathCache<G>, &mut DeadEndPathCache<G>,
) -> Result<ControlFlow<()>>, ) -> Result<ControlFlow<()>>,
@ -46,16 +46,16 @@ impl<G: RankingRuleGraphTrait> RankingRuleGraph<G> {
&mut self, &mut self,
from: Interned<QueryNode>, from: Interned<QueryNode>,
cost: u16, cost: u16,
all_distances: &MappedInterner<Vec<(u16, SmallBitmap<G::EdgeCondition>)>, QueryNode>, all_distances: &MappedInterner<Vec<(u16, SmallBitmap<G::Condition>)>, QueryNode>,
dead_end_path_cache: &mut DeadEndPathCache<G>, dead_end_path_cache: &mut DeadEndPathCache<G>,
visit: &mut impl FnMut( visit: &mut impl FnMut(
&[Interned<G::EdgeCondition>], &[Interned<G::Condition>],
&mut Self, &mut Self,
&mut DeadEndPathCache<G>, &mut DeadEndPathCache<G>,
) -> Result<ControlFlow<()>>, ) -> Result<ControlFlow<()>>,
prev_conditions: &mut Vec<Interned<G::EdgeCondition>>, prev_conditions: &mut Vec<Interned<G::Condition>>,
cur_path: &mut SmallBitmap<G::EdgeCondition>, cur_path: &mut SmallBitmap<G::Condition>,
forbidden_conditions: &mut SmallBitmap<G::EdgeCondition>, forbidden_conditions: &mut SmallBitmap<G::Condition>,
) -> Result<bool> { ) -> Result<bool> {
let mut any_valid = false; let mut any_valid = false;
@ -158,7 +158,7 @@ impl<G: RankingRuleGraphTrait> RankingRuleGraph<G> {
pub fn initialize_distances_with_necessary_edges( pub fn initialize_distances_with_necessary_edges(
&self, &self,
) -> MappedInterner<Vec<(u16, SmallBitmap<G::EdgeCondition>)>, QueryNode> { ) -> MappedInterner<Vec<(u16, SmallBitmap<G::Condition>)>, QueryNode> {
let mut distances_to_end = self.query_graph.nodes.map(|_| vec![]); let mut distances_to_end = self.query_graph.nodes.map(|_| vec![]);
let mut enqueued = SmallBitmap::new(self.query_graph.nodes.len()); let mut enqueued = SmallBitmap::new(self.query_graph.nodes.len());
@ -173,7 +173,7 @@ impl<G: RankingRuleGraphTrait> RankingRuleGraph<G> {
} }
while let Some(cur_node) = node_stack.pop_front() { while let Some(cur_node) = node_stack.pop_front() {
let mut self_distances = BTreeMap::<u16, SmallBitmap<G::EdgeCondition>>::new(); let mut self_distances = BTreeMap::<u16, SmallBitmap<G::Condition>>::new();
let cur_node_edges = &self.edges_of_node.get(cur_node); let cur_node_edges = &self.edges_of_node.get(cur_node);
for edge_idx in cur_node_edges.iter() { for edge_idx in cur_node_edges.iter() {

View File

@ -19,11 +19,11 @@ mod typo;
use std::collections::HashSet; use std::collections::HashSet;
use std::hash::Hash; use std::hash::Hash;
pub use condition_docids_cache::EdgeConditionDocIdsCache; pub use condition_docids_cache::ConditionDocIdsCache;
pub use dead_end_path_cache::DeadEndPathCache; pub use dead_end_path_cache::DeadEndPathCache;
pub use proximity::{ProximityCondition, ProximityGraph}; pub use proximity::{ProximityCondition, ProximityGraph};
use roaring::RoaringBitmap; use roaring::RoaringBitmap;
pub use typo::{TypoEdge, TypoGraph}; pub use typo::{TypoCondition, TypoGraph};
use super::interner::{DedupInterner, FixedSizeInterner, Interned, MappedInterner}; use super::interner::{DedupInterner, FixedSizeInterner, Interned, MappedInterner};
use super::logger::SearchLogger; use super::logger::SearchLogger;
@ -74,48 +74,48 @@ impl<E> PartialEq for Edge<E> {
pub trait RankingRuleGraphTrait: Sized { pub trait RankingRuleGraphTrait: Sized {
/// The condition of an edge connecting two query nodes. The condition /// The condition of an edge connecting two query nodes. The condition
/// should be sufficient to compute the edge's cost and associated document ids /// should be sufficient to compute the edge's cost and associated document ids
/// in [`resolve_edge_condition`](RankingRuleGraphTrait::resolve_edge_condition). /// in [`resolve_condition`](RankingRuleGraphTrait::resolve_condition).
type EdgeCondition: Sized + Clone + PartialEq + Eq + Hash; type Condition: Sized + Clone + PartialEq + Eq + Hash;
/// Return the label of the given edge condition, to be used when visualising /// Return the label of the given edge condition, to be used when visualising
/// the ranking rule graph. /// the ranking rule graph.
fn label_for_edge_condition<'ctx>( fn label_for_condition<'ctx>(
ctx: &mut SearchContext<'ctx>, ctx: &mut SearchContext<'ctx>,
edge: &Self::EdgeCondition, condition: &Self::Condition,
) -> Result<String>; ) -> Result<String>;
fn words_used_by_edge_condition<'ctx>( fn words_used_by_condition<'ctx>(
ctx: &mut SearchContext<'ctx>, ctx: &mut SearchContext<'ctx>,
edge: &Self::EdgeCondition, condition: &Self::Condition,
) -> Result<HashSet<Interned<String>>>; ) -> Result<HashSet<Interned<String>>>;
fn phrases_used_by_edge_condition<'ctx>(
fn phrases_used_by_condition<'ctx>(
ctx: &mut SearchContext<'ctx>, ctx: &mut SearchContext<'ctx>,
edge: &Self::EdgeCondition, condition: &Self::Condition,
) -> Result<HashSet<Interned<Phrase>>>; ) -> Result<HashSet<Interned<Phrase>>>;
/// Compute the document ids associated with the given edge condition, /// Compute the document ids associated with the given edge condition,
/// restricted to the given universe. /// restricted to the given universe.
fn resolve_edge_condition<'ctx>( fn resolve_condition<'ctx>(
ctx: &mut SearchContext<'ctx>, ctx: &mut SearchContext<'ctx>,
edge_condition: &Self::EdgeCondition, condition: &Self::Condition,
universe: &RoaringBitmap, universe: &RoaringBitmap,
) -> Result<RoaringBitmap>; ) -> Result<RoaringBitmap>;
/// Return the cost and condition of the edges going from the previously visited node /// Return the costs and conditions of the edges going from the source node to the destination node
/// (with [`build_step_visit_source_node`](RankingRuleGraphTrait::build_step_visit_source_node)) to `dest_node`.
fn build_edges<'ctx>( fn build_edges<'ctx>(
ctx: &mut SearchContext<'ctx>, ctx: &mut SearchContext<'ctx>,
conditions_interner: &mut DedupInterner<Self::EdgeCondition>, conditions_interner: &mut DedupInterner<Self::Condition>,
source_node: &QueryNode, source_node: &QueryNode,
dest_node: &QueryNode, dest_node: &QueryNode,
) -> Result<Vec<(u8, Option<Interned<Self::EdgeCondition>>)>>; ) -> Result<Vec<(u8, Option<Interned<Self::Condition>>)>>;
fn log_state( fn log_state(
graph: &RankingRuleGraph<Self>, graph: &RankingRuleGraph<Self>,
paths: &[Vec<Interned<Self::EdgeCondition>>], paths: &[Vec<Interned<Self::Condition>>],
dead_end_path_cache: &DeadEndPathCache<Self>, dead_end_path_cache: &DeadEndPathCache<Self>,
universe: &RoaringBitmap, universe: &RoaringBitmap,
distances: &MappedInterner<Vec<(u16, SmallBitmap<Self::EdgeCondition>)>, QueryNode>, distances: &MappedInterner<Vec<(u16, SmallBitmap<Self::Condition>)>, QueryNode>,
cost: u16, cost: u16,
logger: &mut dyn SearchLogger<QueryGraph>, logger: &mut dyn SearchLogger<QueryGraph>,
); );
@ -127,9 +127,9 @@ pub trait RankingRuleGraphTrait: Sized {
/// but replacing the edges. /// but replacing the edges.
pub struct RankingRuleGraph<G: RankingRuleGraphTrait> { pub struct RankingRuleGraph<G: RankingRuleGraphTrait> {
pub query_graph: QueryGraph, pub query_graph: QueryGraph,
pub edges_store: FixedSizeInterner<Option<Edge<G::EdgeCondition>>>, pub edges_store: FixedSizeInterner<Option<Edge<G::Condition>>>,
pub edges_of_node: MappedInterner<SmallBitmap<Option<Edge<G::EdgeCondition>>>, QueryNode>, pub edges_of_node: MappedInterner<SmallBitmap<Option<Edge<G::Condition>>>, QueryNode>,
pub conditions_interner: FixedSizeInterner<G::EdgeCondition>, pub conditions_interner: FixedSizeInterner<G::Condition>,
} }
impl<G: RankingRuleGraphTrait> Clone for RankingRuleGraph<G> { impl<G: RankingRuleGraphTrait> Clone for RankingRuleGraph<G> {
fn clone(&self) -> Self { fn clone(&self) -> Self {
@ -143,7 +143,7 @@ impl<G: RankingRuleGraphTrait> Clone for RankingRuleGraph<G> {
} }
impl<G: RankingRuleGraphTrait> RankingRuleGraph<G> { impl<G: RankingRuleGraphTrait> RankingRuleGraph<G> {
/// Remove all edges with the given condition /// Remove all edges with the given condition
pub fn remove_edges_with_condition(&mut self, condition_to_remove: Interned<G::EdgeCondition>) { pub fn remove_edges_with_condition(&mut self, condition_to_remove: Interned<G::Condition>) {
for (edge_id, edge_opt) in self.edges_store.iter_mut() { for (edge_id, edge_opt) in self.edges_store.iter_mut() {
let Some(edge) = edge_opt.as_mut() else { continue }; let Some(edge) = edge_opt.as_mut() else { continue };
let Some(condition) = edge.condition else { continue }; let Some(condition) = edge.condition else { continue };

View File

@ -4,7 +4,7 @@
use crate::search::new::interner::Interned; use crate::search::new::interner::Interned;
/// A set of `Vec<Interned<T>>`. /// A set of `Vec<Interned<T>>` implemented as a prefix tree.
pub struct PathSet<T> { pub struct PathSet<T> {
nodes: Vec<(Interned<T>, Self)>, nodes: Vec<(Interned<T>, Self)>,
is_end: bool, is_end: bool,

View File

@ -6,7 +6,7 @@ use crate::{CboRoaringBitmapCodec, Result};
pub fn compute_docids<'ctx>( pub fn compute_docids<'ctx>(
ctx: &mut SearchContext<'ctx>, ctx: &mut SearchContext<'ctx>,
edge: &ProximityCondition, condition: &ProximityCondition,
universe: &RoaringBitmap, universe: &RoaringBitmap,
) -> Result<RoaringBitmap> { ) -> Result<RoaringBitmap> {
let SearchContext { let SearchContext {
@ -18,7 +18,7 @@ pub fn compute_docids<'ctx>(
phrase_interner, phrase_interner,
term_interner, term_interner,
} = ctx; } = ctx;
let pairs = match edge { let pairs = match condition {
ProximityCondition::Term { term } => { ProximityCondition::Term { term } => {
return term_docids return term_docids
.get_query_term_docids( .get_query_term_docids(

View File

@ -45,11 +45,11 @@ pub enum ProximityCondition {
pub enum ProximityGraph {} pub enum ProximityGraph {}
impl RankingRuleGraphTrait for ProximityGraph { impl RankingRuleGraphTrait for ProximityGraph {
type EdgeCondition = ProximityCondition; type Condition = ProximityCondition;
fn resolve_edge_condition<'ctx>( fn resolve_condition<'ctx>(
ctx: &mut SearchContext<'ctx>, ctx: &mut SearchContext<'ctx>,
condition: &Self::EdgeCondition, condition: &Self::Condition,
universe: &RoaringBitmap, universe: &RoaringBitmap,
) -> Result<roaring::RoaringBitmap> { ) -> Result<roaring::RoaringBitmap> {
compute_docids::compute_docids(ctx, condition, universe) compute_docids::compute_docids(ctx, condition, universe)
@ -57,10 +57,10 @@ impl RankingRuleGraphTrait for ProximityGraph {
fn build_edges<'ctx>( fn build_edges<'ctx>(
ctx: &mut SearchContext<'ctx>, ctx: &mut SearchContext<'ctx>,
conditions_interner: &mut DedupInterner<Self::EdgeCondition>, conditions_interner: &mut DedupInterner<Self::Condition>,
source_node: &QueryNode, source_node: &QueryNode,
dest_node: &QueryNode, dest_node: &QueryNode,
) -> Result<Vec<(u8, Option<Interned<Self::EdgeCondition>>)>> { ) -> Result<Vec<(u8, Option<Interned<Self::Condition>>)>> {
build::build_edges(ctx, conditions_interner, source_node, dest_node) build::build_edges(ctx, conditions_interner, source_node, dest_node)
} }
@ -76,11 +76,11 @@ impl RankingRuleGraphTrait for ProximityGraph {
logger.log_proximity_state(graph, paths, dead_end_path_cache, universe, distances, cost); logger.log_proximity_state(graph, paths, dead_end_path_cache, universe, distances, cost);
} }
fn label_for_edge_condition<'ctx>( fn label_for_condition<'ctx>(
ctx: &mut SearchContext<'ctx>, ctx: &mut SearchContext<'ctx>,
edge: &Self::EdgeCondition, condition: &Self::Condition,
) -> Result<String> { ) -> Result<String> {
match edge { match condition {
ProximityCondition::Term { term } => { ProximityCondition::Term { term } => {
let term = ctx.term_interner.get(*term); let term = ctx.term_interner.get(*term);
Ok(format!("{} : exists", ctx.word_interner.get(term.original))) Ok(format!("{} : exists", ctx.word_interner.get(term.original)))
@ -117,11 +117,11 @@ impl RankingRuleGraphTrait for ProximityGraph {
} }
} }
fn words_used_by_edge_condition<'ctx>( fn words_used_by_condition<'ctx>(
ctx: &mut SearchContext<'ctx>, ctx: &mut SearchContext<'ctx>,
edge: &Self::EdgeCondition, condition: &Self::Condition,
) -> Result<HashSet<Interned<String>>> { ) -> Result<HashSet<Interned<String>>> {
match edge { match condition {
ProximityCondition::Term { term } => { ProximityCondition::Term { term } => {
let term = ctx.term_interner.get(*term); let term = ctx.term_interner.get(*term);
Ok(HashSet::from_iter(term.all_single_words_except_prefix_db())) Ok(HashSet::from_iter(term.all_single_words_except_prefix_db()))
@ -153,11 +153,11 @@ impl RankingRuleGraphTrait for ProximityGraph {
} }
} }
fn phrases_used_by_edge_condition<'ctx>( fn phrases_used_by_condition<'ctx>(
ctx: &mut SearchContext<'ctx>, ctx: &mut SearchContext<'ctx>,
edge: &Self::EdgeCondition, condition: &Self::Condition,
) -> Result<HashSet<Interned<Phrase>>> { ) -> Result<HashSet<Interned<Phrase>>> {
match edge { match condition {
ProximityCondition::Term { term } => { ProximityCondition::Term { term } => {
let term = ctx.term_interner.get(*term); let term = ctx.term_interner.get(*term);
Ok(HashSet::from_iter(term.all_phrases())) Ok(HashSet::from_iter(term.all_phrases()))

View File

@ -14,19 +14,18 @@ use std::fmt::Write;
use std::iter::FromIterator; use std::iter::FromIterator;
#[derive(Clone, PartialEq, Eq, Hash)] #[derive(Clone, PartialEq, Eq, Hash)]
pub struct TypoEdge { pub struct TypoCondition {
term: Interned<QueryTerm>, term: Interned<QueryTerm>,
nbr_typos: u8,
} }
pub enum TypoGraph {} pub enum TypoGraph {}
impl RankingRuleGraphTrait for TypoGraph { impl RankingRuleGraphTrait for TypoGraph {
type EdgeCondition = TypoEdge; type Condition = TypoCondition;
fn resolve_edge_condition<'db_cache, 'ctx>( fn resolve_condition<'db_cache, 'ctx>(
ctx: &mut SearchContext<'ctx>, ctx: &mut SearchContext<'ctx>,
edge: &Self::EdgeCondition, condition: &Self::Condition,
universe: &RoaringBitmap, universe: &RoaringBitmap,
) -> Result<RoaringBitmap> { ) -> Result<RoaringBitmap> {
let SearchContext { let SearchContext {
@ -47,7 +46,7 @@ impl RankingRuleGraphTrait for TypoGraph {
word_interner, word_interner,
term_interner, term_interner,
phrase_interner, phrase_interner,
edge.term, condition.term,
)?; )?;
Ok(docids) Ok(docids)
@ -55,10 +54,10 @@ impl RankingRuleGraphTrait for TypoGraph {
fn build_edges<'ctx>( fn build_edges<'ctx>(
ctx: &mut SearchContext<'ctx>, ctx: &mut SearchContext<'ctx>,
conditions_interner: &mut DedupInterner<Self::EdgeCondition>, conditions_interner: &mut DedupInterner<Self::Condition>,
_from_node: &QueryNode, _from_node: &QueryNode,
to_node: &QueryNode, to_node: &QueryNode,
) -> Result<Vec<(u8, Option<Interned<Self::EdgeCondition>>)>> { ) -> Result<Vec<(u8, Option<Interned<Self::Condition>>)>> {
let SearchContext { term_interner, .. } = ctx; let SearchContext { term_interner, .. } = ctx;
match &to_node.data { match &to_node.data {
QueryNodeData::Term(LocatedQueryTerm { value, positions }) => { QueryNodeData::Term(LocatedQueryTerm { value, positions }) => {
@ -121,10 +120,10 @@ impl RankingRuleGraphTrait for TypoGraph {
if !new_term.is_empty() { if !new_term.is_empty() {
edges.push(( edges.push((
nbr_typos as u8 + base_cost, nbr_typos as u8 + base_cost,
Some(conditions_interner.insert(TypoEdge { Some(
term: term_interner.insert(new_term), conditions_interner
nbr_typos: nbr_typos as u8, .insert(TypoCondition { term: term_interner.insert(new_term) }),
})), ),
)) ))
} }
} }
@ -137,21 +136,21 @@ impl RankingRuleGraphTrait for TypoGraph {
fn log_state( fn log_state(
graph: &RankingRuleGraph<Self>, graph: &RankingRuleGraph<Self>,
paths: &[Vec<Interned<TypoEdge>>], paths: &[Vec<Interned<TypoCondition>>],
dead_end_path_cache: &DeadEndPathCache<Self>, dead_end_path_cache: &DeadEndPathCache<Self>,
universe: &RoaringBitmap, universe: &RoaringBitmap,
distances: &MappedInterner<Vec<(u16, SmallBitmap<TypoEdge>)>, QueryNode>, distances: &MappedInterner<Vec<(u16, SmallBitmap<TypoCondition>)>, QueryNode>,
cost: u16, cost: u16,
logger: &mut dyn SearchLogger<QueryGraph>, logger: &mut dyn SearchLogger<QueryGraph>,
) { ) {
logger.log_typo_state(graph, paths, dead_end_path_cache, universe, distances, cost); logger.log_typo_state(graph, paths, dead_end_path_cache, universe, distances, cost);
} }
fn label_for_edge_condition<'ctx>( fn label_for_condition<'ctx>(
ctx: &mut SearchContext<'ctx>, ctx: &mut SearchContext<'ctx>,
edge: &Self::EdgeCondition, condition: &Self::Condition,
) -> Result<String> { ) -> Result<String> {
let TypoEdge { term, nbr_typos: _ } = edge; let TypoCondition { term } = condition;
let term = ctx.term_interner.get(*term); let term = ctx.term_interner.get(*term);
let QueryTerm { let QueryTerm {
original: _, original: _,
@ -203,20 +202,20 @@ impl RankingRuleGraphTrait for TypoGraph {
Ok(s) Ok(s)
} }
fn words_used_by_edge_condition<'ctx>( fn words_used_by_condition<'ctx>(
ctx: &mut SearchContext<'ctx>, ctx: &mut SearchContext<'ctx>,
edge: &Self::EdgeCondition, condition: &Self::Condition,
) -> Result<HashSet<Interned<String>>> { ) -> Result<HashSet<Interned<String>>> {
let TypoEdge { term, .. } = edge; let TypoCondition { term, .. } = condition;
let term = ctx.term_interner.get(*term); let term = ctx.term_interner.get(*term);
Ok(HashSet::from_iter(term.all_single_words_except_prefix_db())) Ok(HashSet::from_iter(term.all_single_words_except_prefix_db()))
} }
fn phrases_used_by_edge_condition<'ctx>( fn phrases_used_by_condition<'ctx>(
ctx: &mut SearchContext<'ctx>, ctx: &mut SearchContext<'ctx>,
edge: &Self::EdgeCondition, condition: &Self::Condition,
) -> Result<HashSet<Interned<Phrase>>> { ) -> Result<HashSet<Interned<Phrase>>> {
let TypoEdge { term, .. } = edge; let TypoCondition { term, .. } = condition;
let term = ctx.term_interner.get(*term); let term = ctx.term_interner.get(*term);
Ok(HashSet::from_iter(term.all_phrases())) Ok(HashSet::from_iter(term.all_phrases()))
} }