Skip to content

Commit 22d0ad9

Browse files
committed
fix(cubesql): Allow Thoughtspot EXTRACT YEAR AS date
1 parent 9732af6 commit 22d0ad9

File tree

2 files changed

+178
-0
lines changed

2 files changed

+178
-0
lines changed

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

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16363,4 +16363,41 @@ ORDER BY \"COUNT(count)\" DESC"
1636316363
}
1636416364
)
1636516365
}
16366+
16367+
#[tokio::test]
16368+
async fn test_thoughtspot_extract_year_to_date_trunc() {
16369+
init_logger();
16370+
16371+
let logical_plan = convert_select_to_query_plan(
16372+
r#"
16373+
SELECT
16374+
CAST(CAST(((((EXTRACT(YEAR FROM "ta_1"."order_date") * 100) + 1) * 100) + 1) AS varchar) AS date) "ca_1",
16375+
count(DISTINCT "ta_1"."countDistinct") "ca_2"
16376+
FROM "db"."public"."KibanaSampleDataEcommerce" "ta_1"
16377+
GROUP BY "ca_1"
16378+
"#
16379+
.to_string(),
16380+
DatabaseProtocol::PostgreSQL,
16381+
)
16382+
.await
16383+
.as_logical_plan();
16384+
16385+
assert_eq!(
16386+
logical_plan.find_cube_scan().request,
16387+
V1LoadRequestQuery {
16388+
measures: Some(vec!["KibanaSampleDataEcommerce.countDistinct".to_string()]),
16389+
dimensions: Some(vec![]),
16390+
segments: Some(vec![]),
16391+
time_dimensions: Some(vec![V1LoadRequestQueryTimeDimension {
16392+
dimension: "KibanaSampleDataEcommerce.order_date".to_string(),
16393+
granularity: Some("year".to_string()),
16394+
date_range: None,
16395+
}]),
16396+
order: None,
16397+
limit: None,
16398+
offset: None,
16399+
filters: None,
16400+
}
16401+
)
16402+
}
1636616403
}

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

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3105,6 +3105,147 @@ impl RewriteRules for SplitRules {
31053105
Some("?outer_column"),
31063106
),
31073107
),
3108+
// CAST(CAST(((((EXTRACT(YEAR FROM "ta_1"."LO_COMMITDATE") * 100) + 1) * 100) + 1) AS varchar) AS date)
3109+
transforming_chain_rewrite(
3110+
"split-thoughtspot-extract-year-to-date-trunc-inner-replacer",
3111+
inner_aggregate_split_replacer("?expr", "?alias_to_cube"),
3112+
vec![(
3113+
"?expr",
3114+
cast_expr_explicit(
3115+
cast_expr_explicit(
3116+
binary_expr(
3117+
binary_expr(
3118+
binary_expr(
3119+
binary_expr(
3120+
fun_expr(
3121+
"DatePart",
3122+
vec![
3123+
literal_string("YEAR"),
3124+
column_expr("?column"),
3125+
],
3126+
),
3127+
"*",
3128+
literal_int(100),
3129+
),
3130+
"+",
3131+
literal_int(1),
3132+
),
3133+
"*",
3134+
literal_int(100),
3135+
),
3136+
"+",
3137+
literal_int(1),
3138+
),
3139+
ArrowDataType::Utf8,
3140+
),
3141+
ArrowDataType::Date32,
3142+
),
3143+
)],
3144+
alias_expr(
3145+
fun_expr(
3146+
"DateTrunc",
3147+
vec![literal_string("year"), column_expr("?column")],
3148+
),
3149+
"?alias",
3150+
),
3151+
self.transform_original_expr_to_alias_and_column("?expr", "?alias", None),
3152+
),
3153+
transforming_chain_rewrite(
3154+
"split-thoughtspot-extract-year-to-date-trunc-outer-replacer",
3155+
outer_projection_split_replacer("?expr", "?alias_to_cube"),
3156+
vec![(
3157+
"?expr",
3158+
cast_expr_explicit(
3159+
cast_expr_explicit(
3160+
binary_expr(
3161+
binary_expr(
3162+
binary_expr(
3163+
binary_expr(
3164+
fun_expr(
3165+
"DatePart",
3166+
vec![
3167+
literal_string("YEAR"),
3168+
column_expr("?column"),
3169+
],
3170+
),
3171+
"*",
3172+
literal_int(100),
3173+
),
3174+
"+",
3175+
literal_int(1),
3176+
),
3177+
"*",
3178+
literal_int(100),
3179+
),
3180+
"+",
3181+
literal_int(1),
3182+
),
3183+
ArrowDataType::Utf8,
3184+
),
3185+
ArrowDataType::Date32,
3186+
),
3187+
)],
3188+
alias_expr(
3189+
cast_expr_explicit(
3190+
column_expr("?outer_column"),
3191+
ArrowDataType::Date32,
3192+
),
3193+
"?alias",
3194+
),
3195+
self.transform_original_expr_to_alias_and_column(
3196+
"?expr",
3197+
"?alias",
3198+
Some("?outer_column"),
3199+
),
3200+
),
3201+
transforming_chain_rewrite(
3202+
"split-thoughtspot-extract-year-to-date-trunc-outer-aggr-replacer",
3203+
outer_aggregate_split_replacer("?expr", "?alias_to_cube"),
3204+
vec![(
3205+
"?expr",
3206+
cast_expr_explicit(
3207+
cast_expr_explicit(
3208+
binary_expr(
3209+
binary_expr(
3210+
binary_expr(
3211+
binary_expr(
3212+
fun_expr(
3213+
"DatePart",
3214+
vec![
3215+
literal_string("YEAR"),
3216+
column_expr("?column"),
3217+
],
3218+
),
3219+
"*",
3220+
literal_int(100),
3221+
),
3222+
"+",
3223+
literal_int(1),
3224+
),
3225+
"*",
3226+
literal_int(100),
3227+
),
3228+
"+",
3229+
literal_int(1),
3230+
),
3231+
ArrowDataType::Utf8,
3232+
),
3233+
ArrowDataType::Date32,
3234+
),
3235+
)],
3236+
alias_expr(
3237+
cast_expr_explicit(
3238+
column_expr("?outer_column"),
3239+
ArrowDataType::Date32,
3240+
),
3241+
"?alias",
3242+
),
3243+
self.transform_original_expr_to_alias_and_column(
3244+
"?expr",
3245+
"?alias",
3246+
Some("?outer_column"),
3247+
),
3248+
),
31083249
// DATE_TRUNC('qtr', DATEADD(day, CAST(2 AS int), "ta_1"."LO_COMMITDATE"))
31093250
transforming_chain_rewrite(
31103251
"split-thoughtspot-date-trunc-offset-inner-replacer",

0 commit comments

Comments
 (0)