Change collector api to a `DocId,Query,Result` receiver
Slightly less cute, a lot more convenient
- Id
- 3d855e863e6336d8d451049c2fb1b65ea6b8f8e3
- Author
- Caio
- Commit time
- 2019-12-12T14:26:55+01:00
Modified crates/cantine_derive/src/lib.rs
impl<F, R> #collector<F>
where
F: 'static + Sync + Fn(&tantivy::SegmentReader) -> R,
- R: 'static + Fn(tantivy::DocId) -> #meta,
+ R: 'static + Fn(tantivy::DocId, &#query, &mut #agg),
{
pub fn new(query: #query, reader_factory: F) -> Self {
let agg = <#agg>::from(&query);
impl<F, R> tantivy::collector::Collector for #collector<F>
where
F: 'static + Sync + Fn(&tantivy::SegmentReader) -> R,
- R: 'static + Fn(tantivy::DocId) -> #meta,
+ R: 'static + Fn(tantivy::DocId, &#query, &mut #agg),
{
type Fruit = #agg;
type Child = #segment_collector<R>;
impl<F> tantivy::collector::SegmentCollector for #segment_collector<F>
where
- F: 'static + Fn(tantivy::DocId) -> #meta,
+ F: 'static + Fn(tantivy::DocId, &#query, &mut #agg),
{
type Fruit = #agg;
fn collect(&mut self, doc: tantivy::DocId, _score: tantivy::Score) {
- let item = (self.reader)(doc);
- self.agg.collect(&self.query, &item);
+ (self.reader)(doc, &self.query, &mut self.agg);
}
fn harvest(self) -> Self::Fruit {
Modified crates/cantine_derive/tests/basic.rs
-use std::{
- collections::HashMap,
- convert::TryFrom,
- ops::Range,
- sync::{Arc, Mutex},
-};
+use std::{collections::HashMap, convert::TryFrom, ops::Range, sync::Arc};
use tantivy::{
query::AllQuery,
schema::{SchemaBuilder, Value},
- DocId, Document, Index, SegmentReader,
+ Document, Index, SegmentReader,
};
use cantine_derive::FilterAndAggregation;
d: vec![42.0..100.0],
};
- let db = Arc::new(Mutex::new(db));
+ let db = Arc::new(db);
let collector = FeatCollector::new(query, move |seg_reader: &SegmentReader| {
let id_reader = seg_reader.fast_fields().u64(id_field).unwrap();
let db = db.clone();
- move |doc: DocId| {
+ move |doc, query, agg| {
let id = id_reader.get(doc);
- db.lock().unwrap().remove(&id).unwrap()
+ agg.collect(query, db.get(&id).unwrap());
}
});