refactor: scan Batches directly (#6369)

* refactor: scan `Batch`es directly

Signed-off-by: luofucong <luofc@foxmail.com>

* fix ci

Signed-off-by: luofucong <luofc@foxmail.com>

* resolve PR comments

Signed-off-by: luofucong <luofc@foxmail.com>

* resolve PR comments

Signed-off-by: luofucong <luofc@foxmail.com>

---------

Signed-off-by: luofucong <luofc@foxmail.com>
This commit is contained in:
LFC
2025-06-24 15:55:49 +08:00
committed by GitHub
parent 24019334ee
commit bb12be3310
10 changed files with 476 additions and 162 deletions
+97 -10
View File
@@ -67,14 +67,34 @@ pub struct ScanRequest {
impl Display for ScanRequest {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "ScanRequest {{")?;
enum Delimiter {
None,
Init,
}
impl Delimiter {
fn as_str(&mut self) -> &str {
match self {
Delimiter::None => {
*self = Delimiter::Init;
""
}
Delimiter::Init => ", ",
}
}
}
let mut delimiter = Delimiter::None;
write!(f, "ScanRequest {{ ")?;
if let Some(projection) = &self.projection {
write!(f, "projection: {:?},", projection)?;
write!(f, "{}projection: {:?}", delimiter.as_str(), projection)?;
}
if !self.filters.is_empty() {
write!(
f,
", filters: [{}]",
"{}filters: [{}]",
delimiter.as_str(),
self.filters
.iter()
.map(|f| f.to_string())
@@ -83,23 +103,90 @@ impl Display for ScanRequest {
)?;
}
if let Some(output_ordering) = &self.output_ordering {
write!(f, ", output_ordering: {:?}", output_ordering)?;
write!(
f,
"{}output_ordering: {:?}",
delimiter.as_str(),
output_ordering
)?;
}
if let Some(limit) = &self.limit {
write!(f, ", limit: {}", limit)?;
write!(f, "{}limit: {}", delimiter.as_str(), limit)?;
}
if let Some(series_row_selector) = &self.series_row_selector {
write!(f, ", series_row_selector: {}", series_row_selector)?;
write!(
f,
"{}series_row_selector: {}",
delimiter.as_str(),
series_row_selector
)?;
}
if let Some(sequence) = &self.sequence {
write!(f, ", sequence: {}", sequence)?;
write!(f, "{}sequence: {}", delimiter.as_str(), sequence)?;
}
if let Some(sst_min_sequence) = &self.sst_min_sequence {
write!(f, ", sst_min_sequence: {}", sst_min_sequence)?;
write!(
f,
"{}sst_min_sequence: {}",
delimiter.as_str(),
sst_min_sequence
)?;
}
if let Some(distribution) = &self.distribution {
write!(f, ", distribution: {}", distribution)?;
write!(f, "{}distribution: {}", delimiter.as_str(), distribution)?;
}
write!(f, "}}")
write!(f, " }}")
}
}
#[cfg(test)]
mod tests {
use datafusion_expr::{binary_expr, col, lit, Operator};
use super::*;
#[test]
fn test_display_scan_request() {
let request = ScanRequest {
..Default::default()
};
assert_eq!(request.to_string(), "ScanRequest { }");
let request = ScanRequest {
projection: Some(vec![1, 2]),
filters: vec![
binary_expr(col("i"), Operator::Gt, lit(1)),
binary_expr(col("s"), Operator::Eq, lit("x")),
],
limit: Some(10),
..Default::default()
};
assert_eq!(
request.to_string(),
r#"ScanRequest { projection: [1, 2], filters: [i > Int32(1), s = Utf8("x")], limit: 10 }"#
);
let request = ScanRequest {
filters: vec![
binary_expr(col("i"), Operator::Gt, lit(1)),
binary_expr(col("s"), Operator::Eq, lit("x")),
],
limit: Some(10),
..Default::default()
};
assert_eq!(
request.to_string(),
r#"ScanRequest { filters: [i > Int32(1), s = Utf8("x")], limit: 10 }"#
);
let request = ScanRequest {
projection: Some(vec![1, 2]),
limit: Some(10),
..Default::default()
};
assert_eq!(
request.to_string(),
"ScanRequest { projection: [1, 2], limit: 10 }"
);
}
}