Skip to content

Commit c968656

Browse files
authored
feat(cubesql): Support SQL pushdown for LAG/LEAD functions (#10407)
1 parent 170a910 commit c968656

File tree

3 files changed

+40
-0
lines changed

3 files changed

+40
-0
lines changed

packages/cubejs-schema-compiler/src/adapter/BaseQuery.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4262,6 +4262,8 @@ export class BaseQuery {
42624262
FLOOR: 'FLOOR({{ args_concat }})',
42634263
CEIL: 'CEIL({{ args_concat }})',
42644264
TRUNC: 'TRUNC({{ args_concat }})',
4265+
LAG: 'LAG({{ args_concat }})',
4266+
LEAD: 'LEAD({{ args_concat }})',
42654267

42664268
// There is a difference in behaviour of these function processing in different DBs and DWHs.
42674269
// The SQL standard requires greatest and least to return null in case one argument is null.

rust/cubesql/cubesql/src/compile/mod.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18377,4 +18377,40 @@ LIMIT {{ limit }}{% endif %}"#.to_string(),
1837718377

1837818378
Ok(())
1837918379
}
18380+
18381+
#[tokio::test]
18382+
async fn test_lag_lead_fn_sql_push_down() {
18383+
if !Rewriter::sql_push_down_enabled() {
18384+
return;
18385+
}
18386+
init_testing_logger();
18387+
18388+
let query_plan = convert_select_to_query_plan(
18389+
r#"
18390+
SELECT
18391+
order_date,
18392+
customer_gender,
18393+
LAG(customer_gender, 1) OVER (ORDER BY order_date) AS lag,
18394+
LEAD(customer_gender, 1) OVER (ORDER BY order_date) AS lead
18395+
FROM KibanaSampleDataEcommerce
18396+
WHERE LOWER(customer_gender) = 'test'
18397+
GROUP BY 1, 2
18398+
"#
18399+
.to_string(),
18400+
DatabaseProtocol::PostgreSQL,
18401+
)
18402+
.await;
18403+
18404+
let logical_plan = query_plan.as_logical_plan();
18405+
let sql = logical_plan.find_cube_scan_wrapped_sql().wrapped_sql.sql;
18406+
assert!(sql.contains("LAG("));
18407+
assert!(sql.contains("LEAD("));
18408+
assert!(sql.contains(" OVER (ORDER BY "));
18409+
18410+
let physical_plan = query_plan.as_physical_plan().await.unwrap();
18411+
println!(
18412+
"Physical plan: {}",
18413+
displayable(physical_plan.as_ref()).indent()
18414+
);
18415+
}
1838018416
}

rust/cubesql/cubesql/src/compile/test/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -632,6 +632,8 @@ pub fn sql_generator(
632632
("functions/FLOOR".to_string(), "FLOOR({{ args_concat }})".to_string()),
633633
("functions/CEIL".to_string(), "CEIL({{ args_concat }})".to_string()),
634634
("functions/TRUNC".to_string(), "TRUNC({{ args_concat }})".to_string()),
635+
("functions/LAG".to_string(), "LAG({{ args_concat }})".to_string()),
636+
("functions/LEAD".to_string(), "LEAD({{ args_concat }})".to_string()),
635637
("functions/LEAST".to_string(), "LEAST({{ args_concat }})".to_string()),
636638
("functions/DATEDIFF".to_string(), "DATEDIFF({{ date_part }}, {{ args[1] }}, {{ args[2] }})".to_string()),
637639
("functions/CURRENTDATE".to_string(), "CURRENT_DATE({{ args_concat }})".to_string()),

0 commit comments

Comments
 (0)