fix: float byte trimmer filter range
parent
0250bd1337
commit
d387108dab
|
@ -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,
|
||||
),
|
||||
|
||||
|
|
|
@ -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,
|
||||
),
|
||||
|
||||
|
|
|
@ -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,
|
||||
),
|
||||
|
||||
|
|
|
@ -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(),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue