Skip to content

Commit f1ebed4

Browse files
committed
fix(cubesql): Ignore __user IS NOT NULL filter
1 parent cf4beff commit f1ebed4

File tree

2 files changed

+62
-0
lines changed

2 files changed

+62
-0
lines changed

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,22 @@ impl RewriteRules for FilterRules {
362362
change_user_member("?user"),
363363
self.transform_change_user_eq("?column", "?literal", "?user"),
364364
),
365+
transforming_rewrite(
366+
"user-is-not-null-filter",
367+
filter_replacer(
368+
is_not_null_expr(column_expr("?column")),
369+
"?alias_to_cube",
370+
"?members",
371+
"?filter_aliases",
372+
),
373+
filter_replacer(
374+
literal_bool(true),
375+
"?alias_to_cube",
376+
"?members",
377+
"?filter_aliases",
378+
),
379+
self.transform_user_is_not_null("?column"),
380+
),
365381
transforming_rewrite(
366382
"join-field-filter-eq",
367383
filter_replacer(
@@ -3338,6 +3354,22 @@ impl FilterRules {
33383354
}
33393355
}
33403356

3357+
fn transform_user_is_not_null(
3358+
&self,
3359+
column_var: &'static str,
3360+
) -> impl Fn(&mut EGraph<LogicalPlanLanguage, LogicalPlanAnalysis>, &mut Subst) -> bool {
3361+
let column_var = var!(column_var);
3362+
3363+
move |egraph, subst| {
3364+
for column in var_iter!(egraph[subst[column_var]], ColumnExprColumn).cloned() {
3365+
if column.name.eq_ignore_ascii_case("__user") {
3366+
return true;
3367+
}
3368+
}
3369+
false
3370+
}
3371+
}
3372+
33413373
// Transform ?expr IN (?literal) to ?expr = ?literal
33423374
fn transform_filter_in_to_equal(
33433375
&self,

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,36 @@ async fn test_change_user_via_in_filter_thoughtspot() {
110110
assert_eq!(cube_scan.request, expected_request);
111111
}
112112

113+
#[tokio::test]
114+
async fn test_change_user_via_filter_powerbi() {
115+
init_testing_logger();
116+
117+
let query_plan = convert_select_to_query_plan(
118+
"SELECT COUNT(*) as cnt FROM KibanaSampleDataEcommerce WHERE NOT __user IS NULL AND __user = 'gopher'".to_string(),
119+
DatabaseProtocol::PostgreSQL,
120+
)
121+
.await;
122+
123+
let cube_scan = query_plan.as_logical_plan().find_cube_scan();
124+
125+
assert_eq!(cube_scan.options.change_user, Some("gopher".to_string()));
126+
127+
assert_eq!(
128+
cube_scan.request,
129+
V1LoadRequestQuery {
130+
measures: Some(vec!["KibanaSampleDataEcommerce.count".to_string(),]),
131+
segments: Some(vec![]),
132+
dimensions: Some(vec![]),
133+
time_dimensions: None,
134+
order: Some(vec![]),
135+
limit: None,
136+
offset: None,
137+
filters: None,
138+
ungrouped: None,
139+
}
140+
)
141+
}
142+
113143
#[tokio::test]
114144
async fn test_change_user_via_filter_and() {
115145
let query_plan = convert_select_to_query_plan(

0 commit comments

Comments
 (0)