Skip to content

Commit bf0f10b

Browse files
author
Eric B. Ridge
committed
API adjustments to Query::query_terms so that non-borrowed terms can also be highlighted
1 parent 5fc031d commit bf0f10b

12 files changed

Lines changed: 120 additions & 40 deletions

File tree

src/query/boolean_query/boolean_query.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use super::boolean_weight::BooleanWeight;
22
use crate::query::{EnableScoring, Occur, Query, SumCombiner, TermQuery, Weight};
3-
use crate::schema::{IndexRecordOption, Term};
3+
use crate::schema::{Field, IndexRecordOption, Term};
4+
use crate::SegmentReader;
45

56
/// The boolean query returns a set of documents
67
/// that matches the Boolean combination of constituent subqueries.
@@ -168,9 +169,14 @@ impl Query for BooleanQuery {
168169
)))
169170
}
170171

171-
fn query_terms<'a>(&'a self, visitor: &mut dyn FnMut(&'a Term, bool)) {
172+
fn query_terms(
173+
&self,
174+
field: Field,
175+
segment_reader: &SegmentReader,
176+
visitor: &mut dyn FnMut(&Term, bool),
177+
) {
172178
for (_occur, subquery) in &self.subqueries {
173-
subquery.query_terms(visitor);
179+
subquery.query_terms(field, segment_reader, visitor);
174180
}
175181
}
176182
}

src/query/boost_query.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use std::fmt;
33
use crate::docset::COLLECT_BLOCK_BUFFER_LEN;
44
use crate::fastfield::AliveBitSet;
55
use crate::query::{EnableScoring, Explanation, Query, Scorer, Weight};
6+
use crate::schema::Field;
67
use crate::{DocId, DocSet, Score, SegmentReader, Term};
78

89
/// `BoostQuery` is a wrapper over a query used to boost its score.
@@ -48,8 +49,13 @@ impl Query for BoostQuery {
4849
Ok(boosted_weight)
4950
}
5051

51-
fn query_terms<'a>(&'a self, visitor: &mut dyn FnMut(&'a Term, bool)) {
52-
self.query.query_terms(visitor)
52+
fn query_terms(
53+
&self,
54+
field: Field,
55+
segment_reader: &SegmentReader,
56+
visitor: &mut dyn FnMut(&Term, bool),
57+
) {
58+
self.query.query_terms(field, segment_reader, visitor)
5359
}
5460
}
5561

src/query/const_score_query.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use std::fmt;
22

33
use crate::docset::COLLECT_BLOCK_BUFFER_LEN;
44
use crate::query::{EnableScoring, Explanation, Query, Scorer, Weight};
5+
use crate::schema::Field;
56
use crate::{DocId, DocSet, Score, SegmentReader, TantivyError, Term};
67

78
/// `ConstScoreQuery` is a wrapper over a query to provide a constant score.
@@ -46,8 +47,13 @@ impl Query for ConstScoreQuery {
4647
})
4748
}
4849

49-
fn query_terms<'a>(&'a self, visitor: &mut dyn FnMut(&'a Term, bool)) {
50-
self.query.query_terms(visitor);
50+
fn query_terms(
51+
&self,
52+
field: Field,
53+
segment_reader: &SegmentReader,
54+
visitor: &mut dyn FnMut(&Term, bool),
55+
) {
56+
self.query.query_terms(field, segment_reader, visitor);
5157
}
5258
}
5359

src/query/disjunction_max_query.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::query::{BooleanWeight, DisjunctionMaxCombiner, EnableScoring, Occur, Query, Weight};
2-
use crate::{Score, Term};
2+
use crate::schema::Field;
3+
use crate::{Score, SegmentReader, Term};
34

45
/// The disjunction max query returns documents matching one or more wrapped queries,
56
/// called query clauses or clauses.
@@ -104,9 +105,14 @@ impl Query for DisjunctionMaxQuery {
104105
)))
105106
}
106107

107-
fn query_terms<'a>(&'a self, visitor: &mut dyn FnMut(&'a Term, bool)) {
108+
fn query_terms(
109+
&self,
110+
field: Field,
111+
segment_reader: &SegmentReader,
112+
visitor: &mut dyn FnMut(&Term, bool),
113+
) {
108114
for disjunct in &self.disjuncts {
109-
disjunct.query_terms(visitor);
115+
disjunct.query_terms(field, segment_reader, visitor);
110116
}
111117
}
112118
}

src/query/fuzzy_query.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ mod test {
230230
let get_json_path_term = |query: &str| -> crate::Result<Term> {
231231
let query = query_parser.parse_query(query)?;
232232
let mut terms = Vec::new();
233-
query.query_terms(&mut |term, _| {
233+
query.query_terms(attributes, searcher.segment_reader(0), &mut |term, _| {
234234
terms.push(term.clone());
235235
});
236236

src/query/mod.rs

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -82,38 +82,59 @@ mod tests {
8282
let text_field = schema_builder.add_text_field("text", TEXT);
8383
let schema = schema_builder.build();
8484
let index = Index::create_in_ram(schema);
85+
let mut writer = index.writer(16_000_000).unwrap();
86+
writer.add_document(doc! {}).unwrap();
87+
writer.commit().unwrap();
8588
let query_parser = QueryParser::for_index(&index, vec![text_field]);
8689
let term_a = Term::from_field_text(text_field, "a");
8790
let term_b = Term::from_field_text(text_field, "b");
91+
let searcher = index.reader().unwrap().searcher();
92+
let segment_reader = &searcher.segment_readers()[0];
8893
{
8994
let query = query_parser.parse_query("a").unwrap();
9095
let mut terms = Vec::new();
91-
query.query_terms(&mut |term, pos| terms.push((term, pos)));
92-
assert_eq!(vec![(&term_a, false)], terms);
96+
query.query_terms(text_field, &segment_reader, &mut |term, pos| {
97+
terms.push((term.clone(), pos))
98+
});
99+
assert_eq!(vec![(term_a.clone(), false)], terms);
93100
}
94101
{
95102
let query = query_parser.parse_query("a b").unwrap();
96103
let mut terms = Vec::new();
97-
query.query_terms(&mut |term, pos| terms.push((term, pos)));
98-
assert_eq!(vec![(&term_a, false), (&term_b, false)], terms);
104+
query.query_terms(text_field, &segment_reader, &mut |term, pos| {
105+
terms.push((term.clone(), pos))
106+
});
107+
assert_eq!(
108+
vec![(term_a.clone(), false), (term_b.clone(), false)],
109+
terms
110+
);
99111
}
100112
{
101113
let query = query_parser.parse_query("\"a b\"").unwrap();
102114
let mut terms = Vec::new();
103-
query.query_terms(&mut |term, pos| terms.push((term, pos)));
104-
assert_eq!(vec![(&term_a, true), (&term_b, true)], terms);
115+
query.query_terms(text_field, &segment_reader, &mut |term, pos| {
116+
terms.push((term.clone(), pos))
117+
});
118+
assert_eq!(vec![(term_a.clone(), true), (term_b.clone(), true)], terms);
105119
}
106120
{
107121
let query = query_parser.parse_query("a a a a a").unwrap();
108122
let mut terms = Vec::new();
109-
query.query_terms(&mut |term, pos| terms.push((term, pos)));
110-
assert_eq!(vec![(&term_a, false); 5], terms);
123+
query.query_terms(text_field, &segment_reader, &mut |term, pos| {
124+
terms.push((term.clone(), pos))
125+
});
126+
assert_eq!(vec![(term_a.clone(), false); 5], terms);
111127
}
112128
{
113129
let query = query_parser.parse_query("a -b").unwrap();
114130
let mut terms = Vec::new();
115-
query.query_terms(&mut |term, pos| terms.push((term, pos)));
116-
assert_eq!(vec![(&term_a, false), (&term_b, false)], terms);
131+
query.query_terms(text_field, &segment_reader, &mut |term, pos| {
132+
terms.push((term.clone(), pos))
133+
});
134+
assert_eq!(
135+
vec![(term_a.clone(), false), (term_b.clone(), false)],
136+
terms
137+
);
117138
}
118139
}
119140
}

src/query/phrase_prefix_query/phrase_prefix_query.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use super::{prefix_end, PhrasePrefixWeight};
44
use crate::query::bm25::Bm25Weight;
55
use crate::query::{EnableScoring, InvertedIndexRangeWeight, Query, Weight};
66
use crate::schema::{Field, IndexRecordOption, Term};
7+
use crate::SegmentReader;
78

89
const DEFAULT_MAX_EXPANSIONS: u32 = 50;
910

@@ -157,7 +158,12 @@ impl Query for PhrasePrefixQuery {
157158
}
158159
}
159160

160-
fn query_terms<'a>(&'a self, visitor: &mut dyn FnMut(&'a Term, bool)) {
161+
fn query_terms(
162+
&self,
163+
_field: Field,
164+
_segment_reader: &SegmentReader,
165+
visitor: &mut dyn FnMut(&Term, bool),
166+
) {
161167
for (_, term) in &self.phrase_terms {
162168
visitor(term, true);
163169
}

src/query/phrase_query/phrase_query.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use super::PhraseWeight;
22
use crate::query::bm25::Bm25Weight;
33
use crate::query::{EnableScoring, Query, Weight};
44
use crate::schema::{Field, IndexRecordOption, Term};
5+
use crate::SegmentReader;
56

67
/// `PhraseQuery` matches a specific sequence of words.
78
///
@@ -141,7 +142,12 @@ impl Query for PhraseQuery {
141142
Ok(Box::new(phrase_weight))
142143
}
143144

144-
fn query_terms<'a>(&'a self, visitor: &mut dyn FnMut(&'a Term, bool)) {
145+
fn query_terms(
146+
&self,
147+
_field: Field,
148+
_segment_reader: &SegmentReader,
149+
visitor: &mut dyn FnMut(&Term, bool),
150+
) {
145151
for (_, term) in &self.phrase_terms {
146152
visitor(term, true);
147153
}

src/query/query.rs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ use super::bm25::Bm25StatisticsProvider;
66
use super::Weight;
77
use crate::core::searcher::Searcher;
88
use crate::query::Explanation;
9-
use crate::schema::Schema;
10-
use crate::{DocAddress, Term};
9+
use crate::schema::{Field, Schema};
10+
use crate::{DocAddress, SegmentReader, Term};
1111

1212
/// Argument used in `Query::weight(..)`
1313
#[derive(Copy, Clone)]
@@ -159,7 +159,13 @@ pub trait Query: QueryClone + Send + Sync + downcast_rs::Downcast + fmt::Debug {
159159
///
160160
/// Note that there can be multiple instances of any given term
161161
/// in a query and deduplication must be handled by the visitor.
162-
fn query_terms<'a>(&'a self, _visitor: &mut dyn FnMut(&'a Term, bool)) {}
162+
fn query_terms(
163+
&self,
164+
_field: Field,
165+
_segment_reader: &SegmentReader,
166+
_visitor: &mut dyn FnMut(&Term, bool),
167+
) {
168+
}
163169
}
164170

165171
/// Implements `box_clone`.
@@ -185,8 +191,13 @@ impl Query for Box<dyn Query> {
185191
self.as_ref().count(searcher)
186192
}
187193

188-
fn query_terms<'a>(&'a self, visitor: &mut dyn FnMut(&'a Term, bool)) {
189-
self.as_ref().query_terms(visitor);
194+
fn query_terms(
195+
&self,
196+
field: Field,
197+
segment_reader: &SegmentReader,
198+
visitor: &mut dyn FnMut(&Term, bool),
199+
) {
200+
self.as_ref().query_terms(field, segment_reader, visitor);
190201
}
191202
}
192203

src/query/set_query.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use tantivy_fst::{Automaton, Map};
66
use crate::query::score_combiner::DoNothingCombiner;
77
use crate::query::{AutomatonWeight, BooleanWeight, EnableScoring, Occur, Query, Weight};
88
use crate::schema::{Field, Schema};
9-
use crate::Term;
9+
use crate::{SegmentReader, Term};
1010

1111
/// A Term Set Query matches all of the documents containing any of the Term provided
1212
#[derive(Debug, Clone)]
@@ -73,7 +73,12 @@ impl Query for TermSetQuery {
7373
Ok(Box::new(self.specialized_weight(enable_scoring.schema())?))
7474
}
7575

76-
fn query_terms<'a>(&'a self, visitor: &mut dyn FnMut(&'a Term, bool)) {
76+
fn query_terms(
77+
&self,
78+
_field: Field,
79+
_segment_reader: &SegmentReader,
80+
visitor: &mut dyn FnMut(&Term, bool),
81+
) {
7782
for terms in self.terms_map.values() {
7883
for term in terms {
7984
visitor(term, false);

0 commit comments

Comments
 (0)