@@ -12,8 +12,7 @@ use std::marker::PhantomData;
12
12
use columnar:: { BytesColumn , Column , DynamicColumn , HasAssociatedColumnType } ;
13
13
14
14
use crate :: collector:: { Collector , SegmentCollector } ;
15
- use crate :: schema:: Field ;
16
- use crate :: { DocId , Score , SegmentReader , TantivyError } ;
15
+ use crate :: { DocId , Score , SegmentReader } ;
17
16
18
17
/// The `FilterCollector` filters docs using a fast field value and a predicate.
19
18
///
@@ -50,13 +49,13 @@ use crate::{DocId, Score, SegmentReader, TantivyError};
50
49
///
51
50
/// let query_parser = QueryParser::for_index(&index, vec![title]);
52
51
/// let query = query_parser.parse_query("diary")?;
53
- /// let no_filter_collector = FilterCollector::new(price, |value: u64| value > 20_120u64, TopDocs::with_limit(2));
52
+ /// let no_filter_collector = FilterCollector::new(" price".to_string() , |value: u64| value > 20_120u64, TopDocs::with_limit(2));
54
53
/// let top_docs = searcher.search(&query, &no_filter_collector)?;
55
54
///
56
55
/// assert_eq!(top_docs.len(), 1);
57
56
/// assert_eq!(top_docs[0].1, DocAddress::new(0, 1));
58
57
///
59
- /// let filter_all_collector: FilterCollector<_, _, u64> = FilterCollector::new(price, |value| value < 5u64, TopDocs::with_limit(2));
58
+ /// let filter_all_collector: FilterCollector<_, _, u64> = FilterCollector::new(" price".to_string() , |value| value < 5u64, TopDocs::with_limit(2));
60
59
/// let filtered_top_docs = searcher.search(&query, &filter_all_collector)?;
61
60
///
62
61
/// assert_eq!(filtered_top_docs.len(), 0);
@@ -68,9 +67,10 @@ use crate::{DocId, Score, SegmentReader, TantivyError};
68
67
/// [`FastValue`][crate::fastfield::FastValue] trait, e.g. `u64` but not `&[u8]`.
69
68
/// To filter based on a bytes fast field, use a [`BytesFilterCollector`] instead.
70
69
pub struct FilterCollector < TCollector , TPredicate , TPredicateValue >
71
- where TPredicate : ' static + Clone
70
+ where
71
+ TPredicate : ' static + Clone ,
72
72
{
73
- field : Field ,
73
+ field : String ,
74
74
collector : TCollector ,
75
75
predicate : TPredicate ,
76
76
t_predicate_value : PhantomData < TPredicateValue > ,
83
83
TPredicate : Fn ( TPredicateValue ) -> bool + Send + Sync + Clone ,
84
84
{
85
85
/// Create a new `FilterCollector`.
86
- pub fn new ( field : Field , predicate : TPredicate , collector : TCollector ) -> Self {
86
+ pub fn new ( field : String , predicate : TPredicate , collector : TCollector ) -> Self {
87
87
Self {
88
88
field,
89
89
predicate,
@@ -110,18 +110,7 @@ where
110
110
segment_local_id : u32 ,
111
111
segment_reader : & SegmentReader ,
112
112
) -> crate :: Result < Self :: Child > {
113
- let schema = segment_reader. schema ( ) ;
114
- let field_entry = schema. get_field_entry ( self . field ) ;
115
- if !field_entry. is_fast ( ) {
116
- return Err ( TantivyError :: SchemaError ( format ! (
117
- "Field {:?} is not a fast field." ,
118
- field_entry. name( )
119
- ) ) ) ;
120
- }
121
-
122
- let column_opt = segment_reader
123
- . fast_fields ( )
124
- . column_opt ( field_entry. name ( ) ) ?;
113
+ let column_opt = segment_reader. fast_fields ( ) . column_opt ( & self . field ) ?;
125
114
126
115
let segment_collector = self
127
116
. collector
@@ -229,7 +218,7 @@ where
229
218
///
230
219
/// let query_parser = QueryParser::for_index(&index, vec![title]);
231
220
/// let query = query_parser.parse_query("diary")?;
232
- /// let filter_collector = BytesFilterCollector::new(barcode, |bytes: &[u8]| bytes.starts_with(b"01"), TopDocs::with_limit(2));
221
+ /// let filter_collector = BytesFilterCollector::new(" barcode".to_string() , |bytes: &[u8]| bytes.starts_with(b"01"), TopDocs::with_limit(2));
233
222
/// let top_docs = searcher.search(&query, &filter_collector)?;
234
223
///
235
224
/// assert_eq!(top_docs.len(), 1);
@@ -238,9 +227,10 @@ where
238
227
/// # }
239
228
/// ```
240
229
pub struct BytesFilterCollector < TCollector , TPredicate >
241
- where TPredicate : ' static + Clone
230
+ where
231
+ TPredicate : ' static + Clone ,
242
232
{
243
- field : Field ,
233
+ field : String ,
244
234
collector : TCollector ,
245
235
predicate : TPredicate ,
246
236
}
@@ -251,7 +241,7 @@ where
251
241
TPredicate : Fn ( & [ u8 ] ) -> bool + Send + Sync + Clone ,
252
242
{
253
243
/// Create a new `BytesFilterCollector`.
254
- pub fn new ( field : Field , predicate : TPredicate , collector : TCollector ) -> Self {
244
+ pub fn new ( field : String , predicate : TPredicate , collector : TCollector ) -> Self {
255
245
Self {
256
246
field,
257
247
predicate,
@@ -274,10 +264,7 @@ where
274
264
segment_local_id : u32 ,
275
265
segment_reader : & SegmentReader ,
276
266
) -> crate :: Result < Self :: Child > {
277
- let schema = segment_reader. schema ( ) ;
278
- let field_name = schema. get_field_name ( self . field ) ;
279
-
280
- let column_opt = segment_reader. fast_fields ( ) . bytes ( field_name) ?;
267
+ let column_opt = segment_reader. fast_fields ( ) . bytes ( & self . field ) ?;
281
268
282
269
let segment_collector = self
283
270
. collector
@@ -304,7 +291,8 @@ where
304
291
}
305
292
306
293
pub struct BytesFilterSegmentCollector < TSegmentCollector , TPredicate >
307
- where TPredicate : ' static
294
+ where
295
+ TPredicate : ' static ,
308
296
{
309
297
column_opt : Option < BytesColumn > ,
310
298
segment_collector : TSegmentCollector ,
0 commit comments