From ea1402bd8266901c02b72baf6cc0a0e2d46dc9a3 Mon Sep 17 00:00:00 2001 From: Paul Masurel Date: Tue, 29 Jan 2019 09:54:49 +0100 Subject: [PATCH] Downcast_ref --- Cargo.toml | 2 +- src/collector/mod.rs | 11 ++++----- src/collector/multi_collector.rs | 10 ++++---- src/lib.rs | 2 +- src/query/boolean_query/boolean_weight.rs | 8 +++---- src/query/boolean_query/mod.rs | 28 ++++------------------- src/query/intersection.rs | 11 ++++----- src/query/query.rs | 9 +++----- src/query/scorer.rs | 10 ++++---- 9 files changed, 29 insertions(+), 62 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 5158747e7..2861f72e7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -40,7 +40,7 @@ futures-cpupool = "0.1" owning_ref = "0.4" stable_deref_trait = "1.0.0" rust-stemmers = "1" -downcast = { version="0.9" } +downcast-rs = { version="1.0" } matches = "0.1" bitpacking = "0.5" census = "0.2" diff --git a/src/collector/mod.rs b/src/collector/mod.rs index 776b8a51b..046b26ed0 100644 --- a/src/collector/mod.rs +++ b/src/collector/mod.rs @@ -85,7 +85,7 @@ See the `custom_collector` example. */ -use downcast; +use downcast_rs; use DocId; use Result; use Score; @@ -111,9 +111,9 @@ pub use self::facet_collector::FacetCollector; /// `Fruit` is the type for the result of our collection. /// e.g. `usize` for the `Count` collector. -pub trait Fruit: Send + downcast::Any {} +pub trait Fruit: Send + downcast_rs::Downcast {} -impl Fruit for T where T: Send + downcast::Any {} +impl Fruit for T where T: Send + downcast_rs::Downcast {} /// Collectors are in charge of collecting and retaining relevant /// information from the document found and scored by the query. @@ -358,10 +358,7 @@ where } } -#[allow(missing_docs)] -mod downcast_impl { - downcast!(super::Fruit); -} +impl_downcast!(Fruit); #[cfg(test)] pub mod tests; diff --git a/src/collector/multi_collector.rs b/src/collector/multi_collector.rs index 717c8426b..446795cc6 100644 --- a/src/collector/multi_collector.rs +++ b/src/collector/multi_collector.rs @@ -1,7 +1,6 @@ use super::Collector; use super::SegmentCollector; use collector::Fruit; -use downcast::Downcast; use std::marker::PhantomData; use DocId; use Result; @@ -37,11 +36,10 @@ impl Collector for CollectorWrapper { let typed_fruit: Vec = children .into_iter() .map(|untyped_fruit| { - Downcast::::downcast(untyped_fruit) + untyped_fruit.downcast::() .map(|boxed_but_typed| *boxed_but_typed) - .map_err(|e| { - let err_msg = format!("Failed to cast child collector fruit. {:?}", e); - TantivyError::InvalidArgument(err_msg) + .map_err(|_| { + TantivyError::InvalidArgument("Failed to cast child fruit.".to_string()) }) }) .collect::>()?; @@ -89,7 +87,7 @@ pub struct FruitHandle { impl FruitHandle { pub fn extract(self, fruits: &mut MultiFruit) -> TFruit { let boxed_fruit = fruits.sub_fruits[self.pos].take().expect(""); - *Downcast::::downcast(boxed_fruit).expect("Failed") + *boxed_fruit.downcast::().map_err(|_| ()).expect("Failed to downcast collector fruit.") } } diff --git a/src/lib.rs b/src/lib.rs index c5442ae56..6b86ccd76 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -168,7 +168,7 @@ extern crate maplit; extern crate test; #[macro_use] -extern crate downcast; +extern crate downcast_rs; #[macro_use] extern crate fail; diff --git a/src/query/boolean_query/boolean_weight.rs b/src/query/boolean_query/boolean_weight.rs index edd8fecae..01736ba3c 100644 --- a/src/query/boolean_query/boolean_weight.rs +++ b/src/query/boolean_query/boolean_weight.rs @@ -1,5 +1,5 @@ use core::SegmentReader; -use downcast::Downcast; +use downcast_rs::Downcast; use query::intersect_scorers; use query::score_combiner::{DoNothingCombiner, ScoreCombiner, SumWithCoordsCombiner}; use query::term_query::TermScorer; @@ -10,7 +10,6 @@ use query::RequiredOptionalScorer; use query::Scorer; use query::Union; use query::Weight; -use std::borrow::Borrow; use std::collections::HashMap; use Result; @@ -25,13 +24,12 @@ where { let is_all_term_queries = scorers.iter().all(|scorer| { - let scorer_ref: &Scorer = scorer.borrow(); - Downcast::::is_type(scorer_ref) + scorer.is::() }); if is_all_term_queries { let scorers: Vec = scorers .into_iter() - .map(|scorer| *Downcast::::downcast(scorer).unwrap()) + .map(|scorer| *(scorer.downcast::().map_err(|_| ()).unwrap() )) .collect(); let scorer: Box = Box::new(Union::::from(scorers)); return scorer; diff --git a/src/query/boolean_query/mod.rs b/src/query/boolean_query/mod.rs index 622575661..f0d7b890b 100644 --- a/src/query/boolean_query/mod.rs +++ b/src/query/boolean_query/mod.rs @@ -8,7 +8,7 @@ mod tests { use super::*; use collector::tests::TestCollector; - use downcast::Downcast; + use downcast_rs::Downcast; use query::score_combiner::SumWithCoordsCombiner; use query::term_query::TermScorer; use query::Intersection; @@ -72,28 +72,10 @@ mod tests { let searcher = index.searcher(); let weight = query.weight(&searcher, true).unwrap(); let scorer = weight.scorer(searcher.segment_reader(0u32)).unwrap(); - assert!(Downcast::::is_type(&*scorer)); - } - - #[test] - pub fn test_boolean_termonly_intersection() { - let (index, text_field) = aux_test_helper(); - let query_parser = QueryParser::for_index(&index, vec![text_field]); - let searcher = index.searcher(); - { - let query = query_parser.parse_query("+a +b +c").unwrap(); - let weight = query.weight(&searcher, true).unwrap(); - let scorer = weight.scorer(searcher.segment_reader(0u32)).unwrap(); - assert!(Downcast::>::is_type(&*scorer)); - } - { - let query = query_parser.parse_query("+a +(b c)").unwrap(); - let weight = query.weight(&searcher, true).unwrap(); - let scorer = weight.scorer(searcher.segment_reader(0u32)).unwrap(); - assert!(Downcast::>>::is_type(&*scorer)); - } + assert!(scorer.is::()); } + /* #[test] pub fn test_boolean_reqopt() { let (index, text_field) = aux_test_helper(); @@ -111,10 +93,10 @@ mod tests { let query = query_parser.parse_query("+a b").unwrap(); let weight = query.weight(&searcher, false).unwrap(); let scorer = weight.scorer(searcher.segment_reader(0u32)).unwrap(); - println!("{:?}", scorer.type_name()); assert!(Downcast::::is_type(&*scorer)); } - } + } + */ #[test] pub fn test_boolean_query() { diff --git a/src/query/intersection.rs b/src/query/intersection.rs index aef6d9e59..1536d2b42 100644 --- a/src/query/intersection.rs +++ b/src/query/intersection.rs @@ -1,11 +1,9 @@ use docset::{DocSet, SkipResult}; -use downcast::Downcast; -use query::term_query::TermScorer; use query::EmptyScorer; use query::Scorer; -use std::borrow::Borrow; use DocId; use Score; +use query::term_query::TermScorer; /// Returns the intersection scorer. /// @@ -27,12 +25,11 @@ pub fn intersect_scorers(mut scorers: Vec>) -> Box { (Some(left), Some(right)) => { { let all_term_scorers = [&left, &right].iter().all(|&scorer| { - let scorer_ref: &Scorer = as Borrow>::borrow(scorer); - Downcast::::is_type(scorer_ref) + scorer.is::() }); if all_term_scorers { - let left = *Downcast::::downcast(left).unwrap(); - let right = *Downcast::::downcast(right).unwrap(); + let left = *(left.downcast::().map_err(|_| ()).unwrap()); + let right = *(right.downcast::().map_err(|_| ()).unwrap()); return Box::new(Intersection { left, right, diff --git a/src/query/query.rs b/src/query/query.rs index 298ce6970..53bb8ea80 100644 --- a/src/query/query.rs +++ b/src/query/query.rs @@ -1,6 +1,6 @@ use super::Weight; use core::searcher::Searcher; -use downcast; +use downcast_rs; use std::collections::BTreeSet; use std::fmt; use Result; @@ -39,7 +39,7 @@ use Term; /// /// When implementing a new type of `Query`, it is normal to implement a /// dedicated `Query`, `Weight` and `Scorer`. -pub trait Query: QueryClone + downcast::Any + fmt::Debug { +pub trait Query: QueryClone + downcast_rs::Downcast + fmt::Debug { /// Create the weight associated to a query. /// /// If scoring is not required, setting `scoring_enabled` to `false` @@ -96,7 +96,4 @@ impl QueryClone for Box { } } -#[allow(missing_docs)] -mod downcast_impl { - downcast!(super::Query); -} +impl_downcast!(Query); diff --git a/src/query/scorer.rs b/src/query/scorer.rs index a2e40fa48..99d529be0 100644 --- a/src/query/scorer.rs +++ b/src/query/scorer.rs @@ -1,6 +1,6 @@ use common::BitSet; use docset::{DocSet, SkipResult}; -use downcast; +use downcast_rs; use std::ops::DerefMut; use DocId; use Score; @@ -8,7 +8,7 @@ use Score; /// Scored set of documents matching a query within a specific segment. /// /// See [`Query`](./trait.Query.html). -pub trait Scorer: downcast::Any + DocSet + 'static { +pub trait Scorer: downcast_rs::Downcast + DocSet + 'static { /// Returns the score. /// /// This method will perform a bit of computation and is not cached. @@ -23,10 +23,8 @@ pub trait Scorer: downcast::Any + DocSet + 'static { } } -#[allow(missing_docs)] -mod downcast_impl { - downcast!(super::Scorer); -} +impl_downcast!(Scorer); + impl Scorer for Box { fn score(&mut self) -> Score {