Skip to content

Commit 339de65

Browse files
committed
chore(cubesql): Support to_date in datediff
1 parent 129fc58 commit 339de65

File tree

4 files changed

+80
-5
lines changed

4 files changed

+80
-5
lines changed

rust/cubesql/cubesql/src/compile/engine/udf.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -788,6 +788,31 @@ pub fn create_dateadd_udf() -> ScalarUDF {
788788
)
789789
}
790790

791+
pub fn create_to_date_udf() -> ScalarUDF {
792+
let fun = make_scalar_function(move |args: &[ArrayRef]| {
793+
assert!(args.len() == 2 || args.len() == 3);
794+
795+
return Err(DataFusionError::NotImplemented(format!(
796+
"to_date is not implemented, it's stub"
797+
)));
798+
});
799+
800+
let return_type: ReturnTypeFunction = Arc::new(move |_| Ok(Arc::new(DataType::Date32)));
801+
802+
ScalarUDF::new(
803+
"to_date",
804+
&Signature::one_of(
805+
vec![
806+
TypeSignature::Exact(vec![DataType::Utf8, DataType::Utf8]),
807+
TypeSignature::Exact(vec![DataType::Utf8, DataType::Utf8, DataType::Boolean]),
808+
],
809+
Volatility::Immutable,
810+
),
811+
&return_type,
812+
&fun,
813+
)
814+
}
815+
791816
pub fn create_time_format_udf() -> ScalarUDF {
792817
let fun = make_scalar_function(move |args: &[ArrayRef]| {
793818
assert!(args.len() == 2);

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

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ use self::{
5555
create_pg_truetypid_udf, create_pg_truetypmod_udf, create_pg_type_is_visible_udf,
5656
create_position_udf, create_quarter_udf, create_regexp_substr_udf, create_second_udf,
5757
create_session_user_udf, create_str_to_date_udf, create_time_format_udf,
58-
create_timediff_udf, create_to_char_udf, create_ucase_udf, create_unnest_udtf,
59-
create_user_udf, create_version_udf, create_year_udf,
58+
create_timediff_udf, create_to_char_udf, create_to_date_udf, create_ucase_udf,
59+
create_unnest_udtf, create_user_udf, create_version_udf, create_year_udf,
6060
},
6161
},
6262
parser::parse_sql_to_statement,
@@ -1166,6 +1166,7 @@ WHERE `TABLE_SCHEMA` = '{}'",
11661166
ctx.register_udf(create_ends_with_udf());
11671167
ctx.register_udf(create_position_udf());
11681168
ctx.register_udf(create_date_to_timestamp_udf());
1169+
ctx.register_udf(create_to_date_udf());
11691170

11701171
// udaf
11711172
ctx.register_udaf(create_measure_udaf());
@@ -2620,7 +2621,7 @@ mod tests {
26202621
dimensions: Some(vec![]),
26212622
time_dimensions: Some(vec![V1LoadRequestQueryTimeDimension {
26222623
dimension: "KibanaSampleDataEcommerce.order_date".to_string(),
2623-
granularity: Some("month".to_string()),
2624+
granularity: Some("day".to_string()),
26242625
date_range: None,
26252626
}]),
26262627
order: None,
@@ -11044,7 +11045,7 @@ ORDER BY \"COUNT(count)\" DESC"
1104411045
segments: Some(vec![]),
1104511046
time_dimensions: Some(vec![V1LoadRequestQueryTimeDimension {
1104611047
dimension: "KibanaSampleDataEcommerce.order_date".to_owned(),
11047-
granularity: Some("month".to_owned()),
11048+
granularity: Some("day".to_owned()),
1104811049
date_range: None
1104911050
}]),
1105011051
order: None,
@@ -16143,4 +16144,45 @@ ORDER BY \"COUNT(count)\" DESC"
1614316144
}
1614416145
)
1614516146
}
16147+
16148+
#[tokio::test]
16149+
async fn test_thoughtspot_datediff_to_date() {
16150+
init_logger();
16151+
16152+
let logical_plan = convert_select_to_query_plan(
16153+
r#"
16154+
WITH "qt_0" AS (
16155+
SELECT
16156+
DATEDIFF(day, min("ta_1"."order_date"), TO_DATE('2020-02-20','YYYY-MM-DD')) "ca_1",
16157+
min("ta_1"."order_date") "ca_2"
16158+
FROM KibanaSampleDataEcommerce "ta_1"
16159+
HAVING DATEDIFF(day, min("ta_1"."order_date"), TO_DATE('2020-02-20','YYYY-MM-DD')) > 4
16160+
)
16161+
SELECT DATEDIFF(day, min("ta_2"."ca_2"), TO_DATE('2020-02-20','YYYY-MM-DD')) "ca_3"
16162+
FROM "qt_0" "ta_2"
16163+
"#
16164+
.to_string(),
16165+
DatabaseProtocol::PostgreSQL,
16166+
)
16167+
.await
16168+
.as_logical_plan();
16169+
16170+
assert_eq!(
16171+
logical_plan.find_cube_scan().request,
16172+
V1LoadRequestQuery {
16173+
measures: Some(vec![]),
16174+
dimensions: Some(vec![]),
16175+
segments: Some(vec![]),
16176+
time_dimensions: Some(vec![V1LoadRequestQueryTimeDimension {
16177+
dimension: "KibanaSampleDataEcommerce.order_date".to_owned(),
16178+
granularity: Some("day".to_owned()),
16179+
date_range: None
16180+
}]),
16181+
order: None,
16182+
limit: None,
16183+
offset: None,
16184+
filters: None,
16185+
}
16186+
)
16187+
}
1614616188
}

rust/cubesql/cubesql/src/compile/rewrite/rules/dates.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,14 @@ impl RewriteRules for DateRules {
397397
"?interval",
398398
),
399399
),
400+
rewrite(
401+
"thoughtspot-to-date-to-timestamp",
402+
udf_expr(
403+
"to_date",
404+
vec![literal_expr("?date"), literal_string("YYYY-MM-DD")],
405+
),
406+
udf_expr("date_to_timestamp", vec![literal_expr("?date")]),
407+
),
400408
rewrite(
401409
"datastudio-dates",
402410
fun_expr(

rust/cubesql/cubesql/src/compile/rewrite/rules/split.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1823,7 +1823,7 @@ impl RewriteRules for SplitRules {
18231823
alias_expr(
18241824
fun_expr(
18251825
"DateTrunc",
1826-
vec![literal_string("month"), column_expr("?column")],
1826+
vec![literal_string("day"), column_expr("?column")],
18271827
),
18281828
"?alias",
18291829
),

0 commit comments

Comments
 (0)