Added iterator for facet collector

This commit is contained in:
Paul Masurel
2018-04-14 20:22:02 +09:00
parent 9de74b68d1
commit a1c07bf457
8 changed files with 40 additions and 25 deletions

View File

@@ -4,6 +4,7 @@ Tantivy 0.5.2
- Removed C code. Tantivy is now pure Rust.
- BM25
- Approximate field norms encoded over 1 byte.
- Compiles on stable rust
Tantivy 0.5.1
==========================

View File

@@ -40,10 +40,7 @@ stable_deref_trait = "1.0.0"
rust-stemmers = "0.1.0"
downcast = { version="0.9" }
matches = "0.1"
bitpacking = "0.3.1"
[target.'cfg(windows)'.dependencies]
winapi = "0.2"
bitpacking = {path="../bitpacking"}
[dev-dependencies]
rand = "0.3"
@@ -57,10 +54,10 @@ debug-assertions = false
[features]
default = ["mmap"]
simd = ["bitpacking/simd"]
streamdict = []
mmap = ["fst/mmap", "atomicwrites"]
[badges]
travis-ci = { repository = "tantivy-search/tantivy" }

View File

@@ -43,15 +43,12 @@ It will walk you through getting a wikipedia search engine up and running in a f
## Development
Tantivy requires Rust Nightly because it uses requires the features [`box_syntax`](https://doc.rust-lang.org/stable/unstable-book/language-features/box-syntax.html), [`optin_builtin_traits`](https://github.com/rust-lang/rfcs/blob/master/text/0019-opt-in-builtin-traits.md), [`conservative_impl_trait`](https://github.com/rust-lang/rfcs/blob/master/text/1522-conservative-impl-trait.md),
and [simd](https://github.com/rust-lang/rust/issues/27731).
Tantivy now compiles on stable rust.
To check out and run test, you can simply run :
git clone git@github.com:tantivy-search/tantivy.git
cd tantivy
cargo +nightly build
cargo build
## Note on release build and performance

View File

@@ -432,11 +432,29 @@ pub struct FacetCounts {
facet_counts: BTreeMap<Facet, u64>,
}
use std::collections::btree_map;
struct FacetChildIterator<'a> {
underlying: btree_map::Range<'a, Facet, u64>,
}
impl<'a> Iterator for FacetChildIterator<'a> {
type Item = (&'a Facet, u64);
fn next(&mut self) -> Option<Self::Item> {
self.underlying
.next()
.map(|(facet, count)| (facet, *count))
}
}
impl FacetCounts {
#[allow(needless_lifetimes)] //< compiler fails if we remove the lifetime
pub fn get<'a, T>(&'a self, facet_from: T) -> impl Iterator<Item = (&'a Facet, u64)>
where
Facet: From<T>,
pub fn get<T>(&self, facet_from: T) -> FacetChildIterator //impl Iterator<Item = (&'a Facet, u64)>
where Facet: From<T>
{
let facet = Facet::from(facet_from);
let left_bound = Bound::Excluded(facet.clone());
@@ -448,10 +466,10 @@ impl FacetCounts {
let facet_after = Facet::from_encoded(facet_after_bytes);
Bound::Excluded(facet_after)
};
self.facet_counts
.range((left_bound, right_bound))
.map(|(facet, count)| (facet, *count))
let underlying: btree_map::Range<_, _> = self.facet_counts.range((left_bound, right_bound));
FacetChildIterator {
underlying
}
}
pub fn top_k<T>(&self, facet: T, k: usize) -> Vec<(&Facet, u64)>

View File

@@ -1,3 +1,5 @@
use std::slice;
/// Enum describing each component of a tantivy segment.
/// Each component is stored in its own file,
/// using the pattern `segment_uuid`.`component_extension`,
@@ -26,7 +28,7 @@ pub enum SegmentComponent {
impl SegmentComponent {
/// Iterates through the components.
pub fn iterator() -> impl Iterator<Item = &'static SegmentComponent> {
pub fn iterator() -> slice::Iter<'static, SegmentComponent> {
static SEGMENT_COMPONENTS: [SegmentComponent; 7] = [
SegmentComponent::POSTINGS,
SegmentComponent::POSITIONS,

View File

@@ -7,14 +7,13 @@ use core::SegmentId;
use core::SegmentMeta;
use core::SegmentReader;
use indexer::stamper::Stamper;
use futures::sync::oneshot::Receiver;
use datastruct::stacker::Heap;
use directory::FileProtection;
use error::{Error, ErrorKind, Result, ResultExt};
use fastfield::write_delete_bitset;
use indexer::delete_queue::{DeleteCursor, DeleteQueue};
use futures::Canceled;
use datastruct::stacker::hashmap::split_memory;
use futures::Future;
use indexer::doc_opstamp_mapping::DocToOpstampMapping;
use indexer::MergePolicy;
use indexer::operation::DeleteOperation;
@@ -447,7 +446,7 @@ impl IndexWriter {
pub fn merge(
&mut self,
segment_ids: &[SegmentId],
) -> impl Future<Item = SegmentMeta, Error = Canceled> {
) -> Receiver<SegmentMeta> {
self.segment_updater.start_merge(segment_ids)
}

View File

@@ -10,8 +10,8 @@ use indexer::stamper::Stamper;
use error::{Error, ErrorKind, Result};
use futures_cpupool::CpuPool;
use futures::Future;
use futures::Canceled;
use futures::oneshot;
use futures::sync::oneshot::Receiver;
use directory::FileProtection;
use indexer::{DefaultMergePolicy, MergePolicy};
use indexer::index_writer::advance_deletes;
@@ -286,7 +286,7 @@ impl SegmentUpdater {
pub fn start_merge(
&self,
segment_ids: &[SegmentId],
) -> impl Future<Item = SegmentMeta, Error = Canceled> {
) -> Receiver<SegmentMeta> {
self.0.segment_manager.start_merge(segment_ids);
let segment_updater_clone = self.clone();
@@ -361,6 +361,7 @@ impl SegmentUpdater {
let committed_merge_candidates = merge_policy.compute_merge_candidates(&committed_segments);
merge_candidates.extend_from_slice(&committed_merge_candidates[..]);
for MergeCandidate(segment_metas) in merge_candidates {
// TODO what do we do with the future here
self.start_merge(&segment_metas);
}
}

View File

@@ -64,7 +64,7 @@ fn map_bound<TFrom, Transform: Fn(TFrom) -> Vec<u8>>(
/// let searcher = index.searcher();
///
/// let docs_in_the_sixties = RangeQuery::new_u64(year_field, 1960..1970);
///
///
/// let mut count_collector = CountCollector::default();
/// docs_in_the_sixties.search(&*searcher, &mut count_collector)?;
///