This commit is contained in:
Paul Masurel
2018-02-12 10:31:29 +09:00
parent 9370427ae2
commit a7ffc0e610
19 changed files with 173 additions and 181 deletions

View File

@@ -50,14 +50,14 @@ impl DocSet for BitSetDocSet {
return true;
}
if let Some(cursor_bucket) = self.docs.first_non_empty_bucket(self.cursor_bucket + 1) {
self.go_to_bucket(cursor_bucket);
let lower = self.cursor_tinybitset.pop_lowest().unwrap();
self.doc = (cursor_bucket * 64u32) | lower;
true
self.go_to_bucket(cursor_bucket);
let lower = self.cursor_tinybitset.pop_lowest().unwrap();
self.doc = (cursor_bucket * 64u32) | lower;
true
} else {
false
}
}
}
fn skip_next(&mut self, target: DocId) -> SkipResult {
// skip is required to advance.
@@ -232,14 +232,15 @@ mod tests {
}
}
#[bench]
fn bench_bitset_1pct_insert(b: &mut test::Bencher) {
use tests;
let els = tests::generate_nonunique_unsorted(1_000_000u32, 10_000);
b.iter(|| {
let mut bitset = BitSet::with_max_value(1_000_000);
for el in els.iter().cloned() { bitset.insert(el); }
for el in els.iter().cloned() {
bitset.insert(el);
}
});
}
@@ -248,8 +249,10 @@ mod tests {
use tests;
let els = tests::generate_nonunique_unsorted(1_000_000u32, 10_000);
let mut bitset = BitSet::with_max_value(1_000_000);
for el in els { bitset.insert(el); }
b.iter(|| { bitset.clone() });
for el in els {
bitset.insert(el);
}
b.iter(|| bitset.clone());
}
#[bench]
@@ -258,11 +261,12 @@ mod tests {
use DocSet;
let els = tests::generate_nonunique_unsorted(1_000_000u32, 10_000);
let mut bitset = BitSet::with_max_value(1_000_000);
for el in els { bitset.insert(el); }
for el in els {
bitset.insert(el);
}
b.iter(|| {
let mut docset = BitSetDocSet::from(bitset.clone());
while docset.advance() {}
});
}
}

View File

@@ -11,18 +11,18 @@ use query::ConstScorer;
use std::collections::Bound;
use std::collections::range::RangeArgument;
fn map_bound<TFrom, Transform: Fn(TFrom)->Vec<u8> >(bound: Bound<TFrom>, transform: &Transform) -> Bound<Vec<u8>> {
fn map_bound<TFrom, Transform: Fn(TFrom) -> Vec<u8>>(
bound: Bound<TFrom>,
transform: &Transform,
) -> Bound<Vec<u8>> {
use self::Bound::*;
match bound {
Excluded(from_val) => Excluded(transform(from_val)),
Included(from_val) => Included(transform(from_val)),
Unbounded => Unbounded
Unbounded => Unbounded,
}
}
/// `RangeQuery` match all documents that have at least one term within a defined range.
///
/// Matched document will all get a constant `Score` of one.
@@ -88,40 +88,42 @@ pub struct RangeQuery {
}
impl RangeQuery {
/// Create a new `RangeQuery` over a `i64` field.
pub fn new_i64<TRangeArgument: RangeArgument<i64>>(field: Field, range: TRangeArgument) -> RangeQuery {
let make_term_val = |val: &i64| {
Term::from_field_i64(field, *val).value_bytes().to_owned()
};
pub fn new_i64<TRangeArgument: RangeArgument<i64>>(
field: Field,
range: TRangeArgument,
) -> RangeQuery {
let make_term_val = |val: &i64| Term::from_field_i64(field, *val).value_bytes().to_owned();
RangeQuery {
field,
left_bound: map_bound(range.start(), &make_term_val),
right_bound: map_bound(range.end(), &make_term_val)
right_bound: map_bound(range.end(), &make_term_val),
}
}
/// Create a new `RangeQuery` over a `u64` field.
pub fn new_u64<TRangeArgument: RangeArgument<u64>>(field: Field, range: TRangeArgument) -> RangeQuery {
let make_term_val = |val: &u64| {
Term::from_field_u64(field, *val).value_bytes().to_owned()
};
pub fn new_u64<TRangeArgument: RangeArgument<u64>>(
field: Field,
range: TRangeArgument,
) -> RangeQuery {
let make_term_val = |val: &u64| Term::from_field_u64(field, *val).value_bytes().to_owned();
RangeQuery {
field,
left_bound: map_bound(range.start(), &make_term_val),
right_bound: map_bound(range.end(), &make_term_val)
right_bound: map_bound(range.end(), &make_term_val),
}
}
/// Create a new `RangeQuery` over a `Str` field.
pub fn new_str<'b, TRangeArgument: RangeArgument<&'b str>>(field: Field, range: TRangeArgument) -> RangeQuery {
let make_term_val = |val: &&str| {
val.as_bytes().to_vec()
};
pub fn new_str<'b, TRangeArgument: RangeArgument<&'b str>>(
field: Field,
range: TRangeArgument,
) -> RangeQuery {
let make_term_val = |val: &&str| val.as_bytes().to_vec();
RangeQuery {
field,
left_bound: map_bound(range.start(), &make_term_val),
right_bound: map_bound(range.end(), &make_term_val)
right_bound: map_bound(range.end(), &make_term_val),
}
}
}
@@ -135,7 +137,7 @@ impl Query for RangeQuery {
Ok(box RangeWeight {
field: self.field,
left_bound: self.left_bound.clone(),
right_bound: self.right_bound.clone()
right_bound: self.right_bound.clone(),
})
}
}
@@ -148,8 +150,8 @@ pub struct RangeWeight {
impl RangeWeight {
fn term_range<'a, T>(&self, term_dict: &'a T) -> T::Streamer
where
T: TermDictionary<'a> + 'a,
where
T: TermDictionary<'a> + 'a,
{
use std::collections::Bound::*;
let mut term_stream_builder = term_dict.range();
@@ -203,10 +205,9 @@ mod tests {
#[test]
fn test_range_query_simple() {
fn run() -> Result<()> {
let mut schema_builder = SchemaBuilder::new();
let year_field= schema_builder.add_u64_field("year", INT_INDEXED);
let year_field = schema_builder.add_u64_field("year", INT_INDEXED);
let schema = schema_builder.build();
let index = Index::create_in_ram(schema);
@@ -233,7 +234,6 @@ mod tests {
}
run().unwrap();
}
#[test]
@@ -271,22 +271,22 @@ mod tests {
count_collector.count()
};
assert_eq!(count_multiples(RangeQuery::new_i64(int_field, 10..11)), 9);
assert_eq!(
count_multiples(RangeQuery::new_i64(int_field, 10..11)),
9
);
assert_eq!(
count_multiples(RangeQuery::new_i64(int_field, (Bound::Included(10), Bound::Included(11)) )),
count_multiples(RangeQuery::new_i64(
int_field,
(Bound::Included(10), Bound::Included(11))
)),
18
);
assert_eq!(
count_multiples(RangeQuery::new_i64(int_field, (Bound::Excluded(9), Bound::Included(10)))),
count_multiples(RangeQuery::new_i64(
int_field,
(Bound::Excluded(9), Bound::Included(10))
)),
9
);
assert_eq!(
count_multiples(RangeQuery::new_i64(int_field, 9..)),
91
);
assert_eq!(count_multiples(RangeQuery::new_i64(int_field, 9..)), 91);
}
}

View File

@@ -62,7 +62,6 @@ impl Scorer for EmptyScorer {
}
}
/// Wraps a `DocSet` and simply returns a constant `Scorer`.
/// The `ConstScorer` is useful if you have a `DocSet` where
/// you needed a scorer.
@@ -75,7 +74,6 @@ pub struct ConstScorer<TDocSet: DocSet> {
}
impl<TDocSet: DocSet> ConstScorer<TDocSet> {
/// Creates a new `ConstScorer`.
pub fn new(docset: TDocSet) -> ConstScorer<TDocSet> {
ConstScorer {