Skip to content

Commit

Permalink
introduce case enum for json filtering
Browse files Browse the repository at this point in the history
  • Loading branch information
lubosmato authored and Luboš Matejčík committed Aug 15, 2024
1 parent fae3447 commit fe1afb1
Show file tree
Hide file tree
Showing 9 changed files with 218 additions and 92 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -516,10 +516,10 @@ mod json_filters {
);
}

// QueryMode::Insensitive
// Case::Insensitive
let res = run_query!(
runner,
jsonq(&runner, r#"string_contains: "Oo", mode: "insensitive" "#, None)
jsonq(&runner, r#"string_contains: "Oo", case: "insensitive" "#, None)
);
insta::allow_duplicates! {
insta::assert_snapshot!(
Expand Down Expand Up @@ -568,10 +568,10 @@ mod json_filters {
);
}

// QueryMode::insensitive
// Case::insensitive
let res = run_query!(
runner,
jsonq(&runner, r#"string_starts_with: "FoO", mode: "insensitive" "#, None)
jsonq(&runner, r#"string_starts_with: "FoO", case: "insensitive" "#, None)
);
insta::allow_duplicates! {
insta::assert_snapshot!(
Expand Down Expand Up @@ -619,10 +619,10 @@ mod json_filters {
);
}

// QueryMode::insensitive
// Case::insensitive
let res = run_query!(
runner,
jsonq(&runner, r#"string_ends_with: "oO", mode: "insensitive" "#, None)
jsonq(&runner, r#"string_ends_with: "oO", case: "insensitive" "#, None)
);
insta::allow_duplicates! {
insta::assert_snapshot!(
Expand Down
96 changes: 42 additions & 54 deletions query-engine/connectors/sql-query-connector/src/filter/visitor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -744,6 +744,7 @@ fn convert_json_filter(
path,
condition,
target_type,
case,
} = json_condition;
let (expr_json, expr_string): (Expression, Expression) = match path {
Some(JsonFilterPath::String(path)) => (
Expand All @@ -759,19 +760,13 @@ fn convert_json_filter(

let condition: Expression = match *condition {
ScalarCondition::Contains(value) => {
(expr_json, expr_string).json_contains(field, value, target_type.unwrap(), query_mode, reverse, alias, ctx)
(expr_json, expr_string).json_contains(field, value, target_type.unwrap(), case, reverse, alias, ctx)
}
ScalarCondition::StartsWith(value) => {
(expr_json, expr_string).json_starts_with(field, value, target_type.unwrap(), case, reverse, alias, ctx)
}
ScalarCondition::StartsWith(value) => (expr_json, expr_string).json_starts_with(
field,
value,
target_type.unwrap(),
query_mode,
reverse,
alias,
ctx,
),
ScalarCondition::EndsWith(value) => {
(expr_json, expr_string).json_ends_with(field, value, target_type.unwrap(), query_mode, reverse, alias, ctx)
(expr_json, expr_string).json_ends_with(field, value, target_type.unwrap(), case, reverse, alias, ctx)
}
ScalarCondition::GreaterThan(value) => {
let gt = expr_json
Expand Down Expand Up @@ -1231,7 +1226,7 @@ trait JsonFilterExt {
field: &ScalarFieldRef,
value: ConditionValue,
target_type: JsonTargetType,
query_mode: QueryMode,
case: Case,
reverse: bool,
alias: Option<Alias>,
ctx: &Context<'_>,
Expand All @@ -1242,7 +1237,7 @@ trait JsonFilterExt {
field: &ScalarFieldRef,
value: ConditionValue,
target_type: JsonTargetType,
query_mode: QueryMode,
case: Case,
reverse: bool,
alias: Option<Alias>,
ctx: &Context<'_>,
Expand All @@ -1253,27 +1248,20 @@ trait JsonFilterExt {
field: &ScalarFieldRef,
value: ConditionValue,
target_type: JsonTargetType,
query_mode: QueryMode,
case: Case,
reverse: bool,
alias: Option<Alias>,
ctx: &Context<'_>,
) -> Expression<'static>;
}

// TODO: case type
// #[derive(Debug, Clone, PartialEq, Eq, Hash)]
// pub enum Case {
// Sensitive,
// Insensitive,
// }

impl JsonFilterExt for (Expression<'static>, Expression<'static>) {
fn json_contains(
self,
field: &ScalarFieldRef,
value: ConditionValue,
target_type: JsonTargetType,
query_mode: QueryMode,
case: Case,
reverse: bool,
alias: Option<Alias>,
ctx: &Context<'_>,
Expand All @@ -1283,9 +1271,9 @@ impl JsonFilterExt for (Expression<'static>, Expression<'static>) {
match (value, target_type) {
// string_contains (value)
(ConditionValue::Value(value), JsonTargetType::String) => {
let contains = match query_mode {
QueryMode::Default => expr_string.like(format!("%{value}%")),
QueryMode::Insensitive => Expression::from(lower(expr_string)).like(lower(format!("%{value}%"))),
let contains = match case {
Case::Sensitive => expr_string.like(format!("%{value}%")),
Case::Insensitive => Expression::from(lower(expr_string)).like(lower(format!("%{value}%"))),
};

if reverse {
Expand All @@ -1306,21 +1294,21 @@ impl JsonFilterExt for (Expression<'static>, Expression<'static>) {
}
// string_contains (ref)
(ConditionValue::FieldRef(field_ref), JsonTargetType::String) => {
let contains =
match query_mode {
QueryMode::Default => expr_string.like(quaint::ast::concat::<'_, Expression<'_>>(vec![
Value::text("%").raw().into(),
field_ref.aliased_col(alias, ctx).into(),
Value::text("%").raw().into(),
])),
QueryMode::Insensitive => Expression::from(lower(expr_string)).like(lower(
quaint::ast::concat::<'_, Expression<'_>>(vec![
Value::text("%").raw().into(),
field_ref.aliased_col(alias, ctx).into(),
Value::text("%").raw().into(),
]),
)),
};
let contains = match case {
Case::Sensitive => expr_string.like(quaint::ast::concat::<'_, Expression<'_>>(vec![
Value::text("%").raw().into(),
field_ref.aliased_col(alias, ctx).into(),
Value::text("%").raw().into(),
])),
Case::Insensitive => Expression::from(lower(expr_string)).like(lower(quaint::ast::concat::<
'_,
Expression<'_>,
>(vec![
Value::text("%").raw().into(),
field_ref.aliased_col(alias, ctx).into(),
Value::text("%").raw().into(),
]))),
};

if reverse {
contains.or(expr_json.json_type_not_equals(JsonType::String)).into()
Expand All @@ -1346,7 +1334,7 @@ impl JsonFilterExt for (Expression<'static>, Expression<'static>) {
field: &ScalarFieldRef,
value: ConditionValue,
target_type: JsonTargetType,
query_mode: QueryMode,
case: Case,
reverse: bool,
alias: Option<Alias>,
ctx: &Context<'_>,
Expand All @@ -1355,9 +1343,9 @@ impl JsonFilterExt for (Expression<'static>, Expression<'static>) {
match (value, target_type) {
// string_starts_with (value)
(ConditionValue::Value(value), JsonTargetType::String) => {
let starts_with = match query_mode {
QueryMode::Default => expr_string.like(format!("{value}%")),
QueryMode::Insensitive => Expression::from(lower(expr_string)).like(lower(format!("{value}%"))),
let starts_with = match case {
Case::Sensitive => expr_string.like(format!("{value}%")),
Case::Insensitive => Expression::from(lower(expr_string)).like(lower(format!("{value}%"))),
};

if reverse {
Expand All @@ -1378,12 +1366,12 @@ impl JsonFilterExt for (Expression<'static>, Expression<'static>) {
}
// string_starts_with (ref)
(ConditionValue::FieldRef(field_ref), JsonTargetType::String) => {
let starts_with = match query_mode {
QueryMode::Default => expr_string.like(quaint::ast::concat::<'_, Expression<'_>>(vec![
let starts_with = match case {
Case::Sensitive => expr_string.like(quaint::ast::concat::<'_, Expression<'_>>(vec![
field_ref.aliased_col(alias, ctx).into(),
Value::text("%").raw().into(),
])),
QueryMode::Insensitive => {
Case::Insensitive => {
Expression::from(lower(expr_string)).like(lower(quaint::ast::concat::<'_, Expression<'_>>(
vec![field_ref.aliased_col(alias, ctx).into(), Value::text("%").raw().into()],
)))
Expand Down Expand Up @@ -1416,7 +1404,7 @@ impl JsonFilterExt for (Expression<'static>, Expression<'static>) {
field: &ScalarFieldRef,
value: ConditionValue,
target_type: JsonTargetType,
query_mode: QueryMode,
case: Case,
reverse: bool,
alias: Option<Alias>,
ctx: &Context<'_>,
Expand All @@ -1426,9 +1414,9 @@ impl JsonFilterExt for (Expression<'static>, Expression<'static>) {
match (value, target_type) {
// string_ends_with (value)
(ConditionValue::Value(value), JsonTargetType::String) => {
let ends_with = match query_mode {
QueryMode::Default => expr_string.like(format!("%{value}")),
QueryMode::Insensitive => Expression::from(lower(expr_string)).like(lower(format!("%{value}"))),
let ends_with = match case {
Case::Sensitive => expr_string.like(format!("%{value}")),
Case::Insensitive => Expression::from(lower(expr_string)).like(lower(format!("%{value}"))),
};

if reverse {
Expand All @@ -1449,12 +1437,12 @@ impl JsonFilterExt for (Expression<'static>, Expression<'static>) {
}
// string_ends_with (ref)
(ConditionValue::FieldRef(field_ref), JsonTargetType::String) => {
let ends_with = match query_mode {
QueryMode::Default => expr_string.like(quaint::ast::concat::<'_, Expression<'_>>(vec![
let ends_with = match case {
Case::Sensitive => expr_string.like(quaint::ast::concat::<'_, Expression<'_>>(vec![
Value::text("%").raw().into(),
field_ref.aliased_col(alias, ctx).into(),
])),
QueryMode::Insensitive => {
Case::Insensitive => {
Expression::from(lower(expr_string)).like(lower(quaint::ast::concat::<'_, Expression<'_>>(
vec![Value::text("%").raw().into(), field_ref.aliased_col(alias, ctx).into()],
)))
Expand Down
Loading

0 comments on commit fe1afb1

Please sign in to comment.