Compare commits

...

1 Commits

Author SHA1 Message Date
Paul Masurel
2267722d01 Added SegmentFruit 2018-12-13 08:58:00 +09:00
9 changed files with 30 additions and 9 deletions

View File

@@ -70,6 +70,8 @@ impl Collector for StatsCollector {
// Our standard deviation will be a float.
type Fruit = Option<Stats>;
type SegmentFruit = Self::Fruit;
type Child = StatsSegmentCollector;
fn for_segment(

View File

@@ -58,6 +58,7 @@ pub struct Count;
impl Collector for Count {
type Fruit = usize;
type SegmentFruit = usize;
type Child = SegmentCountCollector;

View File

@@ -258,6 +258,8 @@ impl FacetCollector {
impl Collector for FacetCollector {
type Fruit = FacetCounts;
type SegmentFruit = FacetCounts;
type Child = FacetSegmentCollector;
fn for_segment(

View File

@@ -136,8 +136,10 @@ pub trait Collector: Sync {
/// e.g. `usize` for the `Count` collector.
type Fruit: Fruit;
type SegmentFruit: Fruit;
/// Type of the `SegmentCollector` associated to this collector.
type Child: SegmentCollector<Fruit = Self::Fruit>;
type Child: SegmentCollector<Fruit = Self::SegmentFruit>;
/// `set_segment` is called before beginning to enumerate
/// on this segment.
@@ -152,7 +154,7 @@ pub trait Collector: Sync {
/// Combines the fruit associated to the collection of each segments
/// into one fruit.
fn merge_fruits(&self, segment_fruits: Vec<Self::Fruit>) -> Result<Self::Fruit>;
fn merge_fruits(&self, segment_fruits: Vec<Self::SegmentFruit>) -> Result<Self::Fruit>;
}
/// The `SegmentCollector` is the trait in charge of defining the
@@ -181,6 +183,9 @@ where
Right: Collector,
{
type Fruit = (Left::Fruit, Right::Fruit);
type SegmentFruit = (Left::SegmentFruit, Right::SegmentFruit);
type Child = (Left::Child, Right::Child);
fn for_segment(&self, segment_local_id: u32, segment: &SegmentReader) -> Result<Self::Child> {
@@ -195,7 +200,7 @@ where
fn merge_fruits(
&self,
children: Vec<(Left::Fruit, Right::Fruit)>,
children: Vec<(Left::SegmentFruit, Right::SegmentFruit)>,
) -> Result<(Left::Fruit, Right::Fruit)> {
let mut left_fruits = vec![];
let mut right_fruits = vec![];
@@ -236,6 +241,7 @@ where
Three: Collector,
{
type Fruit = (One::Fruit, Two::Fruit, Three::Fruit);
type SegmentFruit = (One::SegmentFruit, Two::SegmentFruit, Three::SegmentFruit);
type Child = (One::Child, Two::Child, Three::Child);
fn for_segment(&self, segment_local_id: u32, segment: &SegmentReader) -> Result<Self::Child> {
@@ -249,7 +255,7 @@ where
self.0.requires_scoring() || self.1.requires_scoring() || self.2.requires_scoring()
}
fn merge_fruits(&self, children: Vec<Self::Fruit>) -> Result<Self::Fruit> {
fn merge_fruits(&self, children: Vec<Self::SegmentFruit>) -> Result<Self::Fruit> {
let mut one_fruits = vec![];
let mut two_fruits = vec![];
let mut three_fruits = vec![];
@@ -295,6 +301,7 @@ where
Four: Collector,
{
type Fruit = (One::Fruit, Two::Fruit, Three::Fruit, Four::Fruit);
type SegmentFruit = (One::SegmentFruit, Two::SegmentFruit, Three::SegmentFruit, Four::SegmentFruit);
type Child = (One::Child, Two::Child, Three::Child, Four::Child);
fn for_segment(&self, segment_local_id: u32, segment: &SegmentReader) -> Result<Self::Child> {
@@ -312,7 +319,7 @@ where
|| self.3.requires_scoring()
}
fn merge_fruits(&self, children: Vec<Self::Fruit>) -> Result<Self::Fruit> {
fn merge_fruits(&self, children: Vec<Self::SegmentFruit>) -> Result<Self::Fruit> {
let mut one_fruits = vec![];
let mut two_fruits = vec![];
let mut three_fruits = vec![];

View File

@@ -18,6 +18,7 @@ pub struct CollectorWrapper<TCollector: Collector>(TCollector);
impl<TCollector: Collector> Collector for CollectorWrapper<TCollector> {
type Fruit = Box<Fruit>;
type SegmentFruit = Box<Fruit>;
type Child = Box<BoxableSegmentCollector>;
fn for_segment(
@@ -34,10 +35,10 @@ impl<TCollector: Collector> Collector for CollectorWrapper<TCollector> {
}
fn merge_fruits(&self, children: Vec<<Self as Collector>::Fruit>) -> Result<Box<Fruit>> {
let typed_fruit: Vec<TCollector::Fruit> = children
let typed_fruit: Vec<TCollector::SegmentFruit> = children
.into_iter()
.map(|untyped_fruit| {
Downcast::<TCollector::Fruit>::downcast(untyped_fruit)
Downcast::<TCollector::SegmentFruit>::downcast(untyped_fruit)
.map(|boxed_but_typed| *boxed_but_typed)
.map_err(|e| {
let err_msg = format!("Failed to cast child collector fruit. {:?}", e);
@@ -152,7 +153,7 @@ impl<TFruit: Fruit> FruitHandle<TFruit> {
#[derive(Default)]
pub struct MultiCollector<'a> {
collector_wrappers:
Vec<Box<Collector<Child = Box<BoxableSegmentCollector>, Fruit = Box<Fruit>> + 'a>>,
Vec<Box<Collector<Child = Box<BoxableSegmentCollector>, Fruit = Box<Fruit>, SegmentFruit = Box<Fruit>> + 'a>>,
}
impl<'a> MultiCollector<'a> {
@@ -177,7 +178,9 @@ impl<'a> MultiCollector<'a> {
}
impl<'a> Collector for MultiCollector<'a> {
type Fruit = MultiFruit;
type SegmentFruit = MultiFruit;
type Child = MultiCollectorChild;
fn for_segment(

View File

@@ -40,6 +40,7 @@ impl TestFruit {
impl Collector for TestCollector {
type Fruit = TestFruit;
type SegmentFruit = Self::Fruit;
type Child = TestSegmentCollector;
fn for_segment(
@@ -109,6 +110,8 @@ impl FastFieldTestCollector {
impl Collector for FastFieldTestCollector {
type Fruit = Vec<u64>;
type SegmentFruit = Self::Fruit;
type Child = FastFieldSegmentCollector;
fn for_segment(
@@ -165,6 +168,7 @@ impl BytesFastFieldTestCollector {
impl Collector for BytesFastFieldTestCollector {
type Fruit = Vec<u8>;
type SegmentFruit = Self::Fruit;
type Child = BytesFastFieldSegmentCollector;
fn for_segment(

View File

@@ -88,6 +88,7 @@ impl<T: FastValue + PartialOrd + Clone> TopDocsByField<T> {
impl<T: FastValue + PartialOrd + Send + Sync + 'static> Collector for TopDocsByField<T> {
type Fruit = Vec<(T, DocAddress)>;
type SegmentFruit = Vec<(T, DocAddress)>;
type Child = TopFieldSegmentCollector<T>;

View File

@@ -89,6 +89,7 @@ impl TopDocs {
impl Collector for TopDocs {
type Fruit = Vec<(Score, DocAddress)>;
type SegmentFruit = Vec<(Score, DocAddress)>;
type Child = TopScoreSegmentCollector;

View File

@@ -23,7 +23,7 @@ fn collect_segment<C: Collector>(
weight: &Weight,
segment_ord: u32,
segment_reader: &SegmentReader,
) -> Result<C::Fruit> {
) -> Result<C::SegmentFruit> {
let mut scorer = weight.scorer(segment_reader)?;
let mut segment_collector = collector.for_segment(segment_ord as u32, segment_reader)?;
if let Some(delete_bitset) = segment_reader.delete_bitset() {