Expose parameters of RangeQuery for external usage

This commit is contained in:
jwolfe
2018-05-18 17:00:39 +09:00
parent 0cea706f10
commit b2ce65f52d
2 changed files with 35 additions and 14 deletions

View File

@@ -12,14 +12,14 @@ use std::ops::Range;
use termdict::{TermDictionary, TermStreamer};
use Result;
fn map_bound<TFrom, Transform: Fn(TFrom) -> Vec<u8>>(
bound: Bound<TFrom>,
fn map_bound<TFrom, TTo, Transform: Fn(&TFrom) -> TTo>(
bound: &Bound<TFrom>,
transform: &Transform,
) -> Bound<Vec<u8>> {
) -> Bound<TTo> {
use self::Bound::*;
match bound {
Excluded(from_val) => Excluded(transform(from_val)),
Included(from_val) => Included(transform(from_val)),
Excluded(ref from_val) => Excluded(transform(from_val)),
Included(ref from_val) => Included(transform(from_val)),
Unbounded => Unbounded,
}
}
@@ -113,12 +113,12 @@ impl RangeQuery {
left_bound: Bound<i64>,
right_bound: Bound<i64>,
) -> RangeQuery {
let make_term_val = |val: i64| Term::from_field_i64(field, val).value_bytes().to_owned();
let make_term_val = |val: &i64| Term::from_field_i64(field, *val).value_bytes().to_owned();
RangeQuery {
field,
value_type: Type::I64,
left_bound: map_bound(left_bound, &make_term_val),
right_bound: map_bound(right_bound, &make_term_val),
left_bound: map_bound(&left_bound, &make_term_val),
right_bound: map_bound(&right_bound, &make_term_val),
}
}
@@ -134,12 +134,12 @@ impl RangeQuery {
left_bound: Bound<u64>,
right_bound: Bound<u64>,
) -> RangeQuery {
let make_term_val = |val: u64| Term::from_field_u64(field, val).value_bytes().to_owned();
let make_term_val = |val: &u64| Term::from_field_u64(field, *val).value_bytes().to_owned();
RangeQuery {
field,
value_type: Type::U64,
left_bound: map_bound(left_bound, &make_term_val),
right_bound: map_bound(right_bound, &make_term_val),
left_bound: map_bound(&left_bound, &make_term_val),
right_bound: map_bound(&right_bound, &make_term_val),
}
}
@@ -167,12 +167,12 @@ impl RangeQuery {
left: Bound<&'b str>,
right: Bound<&'b str>,
) -> RangeQuery {
let make_term_val = |val: &str| val.as_bytes().to_vec();
let make_term_val = |val: &&str| val.as_bytes().to_vec();
RangeQuery {
field,
value_type: Type::Str,
left_bound: map_bound(left, &make_term_val),
right_bound: map_bound(right, &make_term_val),
left_bound: map_bound(&left, &make_term_val),
right_bound: map_bound(&right, &make_term_val),
}
}
@@ -187,6 +187,21 @@ impl RangeQuery {
Bound::Excluded(range.end),
)
}
/// Field to search over
pub fn field(&self) -> Field {
self.field
}
/// Lower bound of range
pub fn left_bound(&self) -> Bound<Term> {
map_bound(&self.left_bound, &|bytes| Term::from_field_bytes(self.field, bytes))
}
/// Upper bound of range
pub fn right_bound(&self) -> Bound<Term> {
map_bound(&self.right_bound, &|bytes| Term::from_field_bytes(self.field, bytes))
}
}
impl Query for RangeQuery {

View File

@@ -109,6 +109,12 @@ impl Term {
self.0.extend(bytes);
}
pub(crate) fn from_field_bytes(field: Field, bytes: &[u8]) -> Term {
let mut term = Term::for_field(field);
term.set_bytes(bytes);
term
}
/// Set the texts only, keeping the field untouched.
pub fn set_text(&mut self, text: &str) {
self.set_bytes(text.as_bytes());