Introduce IndexConstraintUsage

This commit is contained in:
gwenn 2016-08-20 12:06:24 +02:00
parent b11a4b1c73
commit 58b7d62517
2 changed files with 28 additions and 20 deletions

View File

@ -95,21 +95,13 @@ impl IndexInfo {
}
/// if `argv_index` > 0, constraint is part of argv to xFilter
pub fn set_argv_index(&mut self, constraint_idx: usize, argv_index: libc::c_int) {
unsafe {
let mut constraint_usages = slice::from_raw_parts_mut((*self.0).aConstraintUsage,
(*self.0).nConstraint as usize);
constraint_usages[constraint_idx].argvIndex = argv_index;
}
}
/// if `omit`, do not code a test for this constraint
pub fn set_omit(&mut self, constraint_idx: usize, omit: bool) {
unsafe {
let mut constraint_usages = slice::from_raw_parts_mut((*self.0).aConstraintUsage,
(*self.0).nConstraint as usize);
constraint_usages[constraint_idx].omit = if omit { 1 } else { 0 };
}
pub fn constraint_usage(&mut self, constraint_idx: usize) -> IndexConstraintUsage {
let mut constraint_usages = unsafe {
slice::from_raw_parts_mut((*self.0).aConstraintUsage, (*self.0).nConstraint as usize)
};
IndexConstraintUsage(&mut constraint_usages[constraint_idx])
}
/// Number used to identify the index
pub fn set_idx_num(&mut self, idx_num: libc::c_int) {
unsafe {
@ -168,6 +160,19 @@ impl<'a> IndexConstraint<'a> {
}
}
pub struct IndexConstraintUsage<'a>(&'a mut ffi::Struct_sqlite3_index_constraint_usage);
impl<'a> IndexConstraintUsage<'a> {
/// if `argv_index` > 0, constraint is part of argv to xFilter
pub fn set_argv_index(&mut self, argv_index: libc::c_int) {
self.0.argvIndex = argv_index;
}
/// if `omit`, do not code a test for this constraint
pub fn set_omit(&mut self, omit: bool) {
self.0.omit = if omit { 1 } else { 0 };
}
}
/// Virtual table cursor trait.
pub trait VTabCursor<V: VTab<Self>>: Sized {
/// Accessor to the associated virtual table.

View File

@ -108,18 +108,21 @@ impl VTab<SeriesTabCursor> for SeriesTab {
let mut num_of_arg = 0;
if let Some(start_idx) = start_idx {
num_of_arg += 1;
info.set_argv_index(start_idx, num_of_arg);
info.set_omit(start_idx, true);
let mut constraint_usage = info.constraint_usage(start_idx);
constraint_usage.set_argv_index(num_of_arg);
constraint_usage.set_omit(true);
}
if let Some(stop_idx) = stop_idx {
num_of_arg += 1;
info.set_argv_index(stop_idx, num_of_arg);
info.set_omit(stop_idx, true);
let mut constraint_usage = info.constraint_usage(stop_idx);
constraint_usage.set_argv_index(num_of_arg);
constraint_usage.set_omit(true);
}
if let Some(step_idx) = step_idx {
num_of_arg += 1;
info.set_argv_index(step_idx, num_of_arg);
info.set_omit(step_idx, true);
let mut constraint_usage = info.constraint_usage(step_idx);
constraint_usage.set_argv_index(num_of_arg);
constraint_usage.set_omit(true);
}
if idx_num.contains(BOTH) {
// Both start= and stop= boundaries are available.