fix: float byte trimmer filter range

pull/24376/head
Edd Robinson 2021-09-15 13:39:58 +01:00
parent 0250bd1337
commit d387108dab
4 changed files with 161 additions and 16 deletions

View File

@ -413,8 +413,16 @@ where
right: (L, &cmp::Operator),
dst: RowIDs,
) -> RowIDs {
let left = (self.transcoder.encode(left.0), left.1);
let right = (self.transcoder.encode(right.0), right.1);
debug!(left=?left, right=?right, encoding=?ENCODING_NAME, "row_ids_filter_range");
let left = self
.transcoder
.encode_comparable(left.0, *left.1)
.expect("transcoder must return Some variant");
let right = self
.transcoder
.encode_comparable(right.0, *right.1)
.expect("transcoder must return Some variant");
debug!(left=?left, right=?right, encoding=?ENCODING_NAME, "row_ids_filter_range encoded expr");
match (&left.1, &right.1) {
(cmp::Operator::GT, cmp::Operator::LT)
@ -425,8 +433,8 @@ where
| (cmp::Operator::LT, cmp::Operator::GTE)
| (cmp::Operator::LTE, cmp::Operator::GT)
| (cmp::Operator::LTE, cmp::Operator::GTE) => self.row_ids_cmp_range_order(
(&left.0, Self::ord_from_op(left.1)),
(&right.0, Self::ord_from_op(right.1)),
(&left.0, Self::ord_from_op(&left.1)),
(&right.0, Self::ord_from_op(&right.1)),
dst,
),

View File

@ -486,8 +486,16 @@ where
right: (L, &cmp::Operator),
dst: RowIDs,
) -> RowIDs {
let left = (self.transcoder.encode(left.0), left.1);
let right = (self.transcoder.encode(right.0), right.1);
debug!(left=?left, right=?right, encoding=?ENCODING_NAME, "row_ids_filter_range");
let left = self
.transcoder
.encode_comparable(left.0, *left.1)
.expect("transcoder must return Some variant");
let right = self
.transcoder
.encode_comparable(right.0, *right.1)
.expect("transcoder must return Some variant");
debug!(left=?left, right=?right, encoding=?ENCODING_NAME, "row_ids_filter_range encoded expr");
match (left.1, right.1) {
(cmp::Operator::GT, cmp::Operator::LT)
@ -498,8 +506,8 @@ where
| (cmp::Operator::LT, cmp::Operator::GTE)
| (cmp::Operator::LTE, cmp::Operator::GT)
| (cmp::Operator::LTE, cmp::Operator::GTE) => self.row_ids_cmp_range_order(
(left.0, Self::ord_from_op(left.1)),
(right.0, Self::ord_from_op(right.1)),
(left.0, Self::ord_from_op(&left.1)),
(right.0, Self::ord_from_op(&right.1)),
dst,
),

View File

@ -430,8 +430,16 @@ where
right: (L, &cmp::Operator),
dst: RowIDs,
) -> RowIDs {
let left = (self.transcoder.encode(left.0), left.1);
let right = (self.transcoder.encode(right.0), right.1);
debug!(left=?left, right=?right, encoding=?ENCODING_NAME, "row_ids_filter_range");
let left = self
.transcoder
.encode_comparable(left.0, *left.1)
.expect("transcoder must return Some variant");
let right = self
.transcoder
.encode_comparable(right.0, *right.1)
.expect("transcoder must return Some variant");
debug!(left=?left, right=?right, encoding=?ENCODING_NAME, "row_ids_filter_range encoded expr");
match (&left.1, &right.1) {
(cmp::Operator::GT, cmp::Operator::LT)
@ -442,8 +450,8 @@ where
| (cmp::Operator::LT, cmp::Operator::GTE)
| (cmp::Operator::LTE, cmp::Operator::GT)
| (cmp::Operator::LTE, cmp::Operator::GTE) => self.row_ids_cmp_range(
(&left.0, Self::ord_from_op(left.1)),
(&right.0, Self::ord_from_op(right.1)),
(&left.0, Self::ord_from_op(&left.1)),
(&right.0, Self::ord_from_op(&right.1)),
dst,
),

View File

@ -787,8 +787,6 @@ mod test {
}
fn _row_ids_filter_float_trimmer(enc: Box<dyn ScalarEncoding<f64>>) {
// These cases replicate the behaviour in PG.
//
// [100.0, 200.0, 100.0, 300.0, 400.0]
let cases = vec![
(100.0, Operator::Equal, vec![0, 2]), // 100.0, 100.0
@ -877,8 +875,6 @@ mod test {
}
fn _row_ids_filter_float_trimmer_with_nulls(enc: Box<dyn ScalarEncoding<f64>>) {
// These cases replicate the behaviour in PG.
//
// [100.0, NULL, NULL, 200.0]
let cases = vec![
(100.0, Operator::Equal, vec![0]), // 100.0
@ -932,4 +928,129 @@ mod test {
);
}
}
#[test]
fn row_ids_filter_range_float_trimmer() {
let data = vec![100.0, 200.0, 100.0, 300.0, 400.0];
let float_trimmer = FloatByteTrimmer {};
let data_float_trimmed = data
.iter()
.cloned()
.map::<u16, _>(|x| float_trimmer.encode(x))
.collect::<Vec<u16>>();
let cases: Vec<Box<dyn ScalarEncoding<f64>>> = vec![
Box::new(RLE::<u16, f64, _>::new_from_iter(
data_float_trimmed.iter().cloned(),
float_trimmer,
)),
Box::new(Fixed::<u16, f64, _>::new(
data_float_trimmed.clone(),
FloatByteTrimmer {},
)),
Box::new(FixedNull::<UInt16Type, f64, _>::new(
PrimitiveArray::from(data_float_trimmed),
FloatByteTrimmer {},
)),
];
for enc in cases {
_row_ids_filter_range_float_trimmer(enc)
}
}
fn _row_ids_filter_range_float_trimmer(enc: Box<dyn ScalarEncoding<f64>>) {
// [100.0, 200.0, 100.0, 300.0, 400.0]
let cases = vec![
((100.0, &Operator::LT), (99.0, &Operator::GT), vec![]), //
((100.0, &Operator::LTE), (100.0, &Operator::GTE), vec![0, 2]), // 100.0, 100.0
(
(100.0, &Operator::GT),
(400.0, &Operator::LTE),
vec![1, 3, 4],
), // 200.0, 300.0, 400.0
(
(100.0, &Operator::GTE),
(401.0, &Operator::LTE),
vec![0, 1, 2, 3, 4],
), // 100.0, 200.0, 100.0, 300.0, 400.0
((200.0, &Operator::LT), (99.6, &Operator::GT), vec![0, 2]), // 100.0, 100.0
((200.0, &Operator::GT), (401.2, &Operator::LTE), vec![3, 4]), // 300.0, 400.0
(
(200.0, &Operator::GTE),
(400.9, &Operator::LT),
vec![1, 3, 4],
), // 200.0, 300.0, 400.0
(
(99.8, &Operator::GT),
(500.87, &Operator::LT),
vec![0, 1, 2, 3, 4],
), // 100.0, 200.0, 100.0, 300.0, 400.0
];
for (left, right, exp) in cases {
let dst = enc.row_ids_filter_range(left, right, RowIDs::new_vector());
assert_eq!(
dst.unwrap_vector(),
&exp,
"example '{:?} {:?}' failed for {:?}",
left,
right,
enc.name(),
);
}
}
#[test]
fn row_ids_filter_range_float_trimmer_with_nulls() {
let data = vec![Some(100.0), None, None, Some(200.0), None];
let float_trimmer = FloatByteTrimmer {};
let cases: Vec<Box<dyn ScalarEncoding<f64>>> = vec![
Box::new(RLE::<u16, f64, _>::new_from_iter_opt(
data.iter()
.cloned()
.map(|x| x.map(|v| float_trimmer.encode(v))),
FloatByteTrimmer {},
)),
Box::new(FixedNull::<UInt16Type, f64, _>::new(
data.iter()
.cloned()
.map(|v| v.map(|v| float_trimmer.encode(v)))
.collect(),
FloatByteTrimmer {},
)),
];
for enc in cases {
_row_ids_filter_range_float_trimmer_with_nulls(enc)
}
}
fn _row_ids_filter_range_float_trimmer_with_nulls(enc: Box<dyn ScalarEncoding<f64>>) {
// [100.0, NULL, NULL, 200.0, NULL]
let cases = vec![
((100.0, &Operator::LT), (99.0, &Operator::GT), vec![]), //
((100.0, &Operator::LTE), (100.0, &Operator::GTE), vec![0]), // 100.0
((100.0, &Operator::GT), (400.0, &Operator::LTE), vec![3]), // 200.0
((100.0, &Operator::GTE), (401.0, &Operator::LTE), vec![0, 3]), // 100.0, 200.0
((200.0, &Operator::LT), (99.6, &Operator::GT), vec![0]), // 100.0
((200.0, &Operator::GT), (401.2, &Operator::LTE), vec![]), //
((99.8, &Operator::GT), (500.87, &Operator::LT), vec![0, 3]), // 100.0, 200.0
];
for (left, right, exp) in cases {
let dst = enc.row_ids_filter_range(left, right, RowIDs::new_vector());
assert_eq!(
dst.unwrap_vector(),
&exp,
"example '{:?} {:?}' failed for {:?}",
left,
right,
enc.name(),
);
}
}
}