Skip to content

Commit 18750b5

Browse files
committed
sql_parser: like expression refactored
1 parent b57c1c2 commit 18750b5

File tree

2 files changed

+42
-74
lines changed

2 files changed

+42
-74
lines changed

src/ast/expression/mod.rs

+17-7
Original file line numberDiff line numberDiff line change
@@ -150,9 +150,6 @@ pub enum BinaryMatchingExpression {
150150
/// For NOT $BinaryMatchingExpression use cases
151151
Not(Box<BinaryMatchingExpression>),
152152

153-
/// Like
154-
Like(LikeExpressionType),
155-
156153
/// Glob
157154
Glob(Box<Expression>),
158155

@@ -174,19 +171,32 @@ pub enum BinaryMatchingExpression {
174171

175172
/// A like expression type
176173
#[derive(Debug, PartialEq, Clone)]
177-
pub enum LikeExpressionType {
174+
pub struct LikeExpressionType {
178175
/// An expression
179-
Expression(Box<Expression>),
176+
pub expression: Box<Expression>,
180177

181-
/// An escape expression
182-
EscapeExpression(EscapeExpression),
178+
/// Whether the expression is not
179+
pub not: bool,
180+
181+
/// The like expression
182+
pub like_expression: Box<Expression>,
183+
184+
/// The escape expression
185+
pub escape_expression: Option<Box<Expression>>,
186+
}
187+
188+
impl From<LikeExpressionType> for Expression {
189+
fn from(like_expr: LikeExpressionType) -> Self {
190+
Expression::LikeExpression(like_expr)
191+
}
183192
}
184193

185194
/// An escape expression
186195
#[derive(Debug, PartialEq, Clone)]
187196
pub struct EscapeExpression {
188197
/// The expression
189198
pub expression: Box<Expression>,
199+
190200
/// The escape expression
191201
pub escape_expression: Option<Box<Expression>>,
192202
}

src/parser/expression/like_expr.rs

+25-67
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
use crate::parser::errors::ParsingError;
2-
use crate::{
3-
BinaryMatchingExpression, EscapeExpression, Expression, Keyword, LikeExpressionType, Parser,
4-
};
2+
use crate::{Expression, Keyword, LikeExpressionType, Parser};
53

64
use super::ExpressionParser;
75

@@ -28,96 +26,56 @@ impl LikeExpressionParser for Parser<'_> {
2826
escape_expression = Some(Box::new(self.parse_expression()?));
2927
}
3028

31-
let matching_expression: BinaryMatchingExpression = {
32-
match escape_expression {
33-
Some(escape_expression) => BinaryMatchingExpression::Like(
34-
LikeExpressionType::EscapeExpression(EscapeExpression {
35-
expression: Box::new(pattern),
36-
escape_expression: Some(escape_expression),
37-
}),
38-
),
39-
None => BinaryMatchingExpression::Like(LikeExpressionType::Expression(Box::new(
40-
pattern,
41-
))),
42-
}
29+
let like_expression = LikeExpressionType {
30+
expression: Box::new(expression),
31+
not: is_not,
32+
like_expression: Box::new(pattern),
33+
escape_expression,
4334
};
4435

45-
let matching_expression = if is_not {
46-
BinaryMatchingExpression::Not(Box::new(matching_expression))
47-
} else {
48-
matching_expression
49-
};
50-
51-
Ok(Expression::BinaryMatchingExpression(
52-
Box::new(expression),
53-
matching_expression,
54-
))
36+
Ok(Expression::LikeExpression(like_expression))
5537
}
5638
}
5739

5840
#[cfg(test)]
5941
mod like_expression_tests {
6042
use crate::parser::test_utils::run_sunny_day_test;
6143
use crate::select::test_utils::select_expr;
62-
use crate::{BinaryMatchingExpression, EscapeExpression, Expression, LikeExpressionType};
44+
use crate::{Expression, LikeExpressionType};
6345

6446
use crate::parser::expression::test_utils::*;
6547

66-
fn like_expr(
67-
expression: Expression,
68-
like_expression_type: LikeExpressionType,
69-
inverted: bool,
70-
) -> Expression {
71-
let binary_matching_expression = if inverted {
72-
BinaryMatchingExpression::Not(Box::new(BinaryMatchingExpression::Like(
73-
like_expression_type,
74-
)))
75-
} else {
76-
BinaryMatchingExpression::Like(like_expression_type)
77-
};
78-
79-
Expression::BinaryMatchingExpression(Box::new(expression), binary_matching_expression)
48+
fn like_expr(expr: Expression, like_expr: Expression) -> LikeExpressionType {
49+
LikeExpressionType {
50+
expression: Box::new(expr),
51+
not: false,
52+
like_expression: Box::new(like_expr),
53+
escape_expression: None,
54+
}
8055
}
8156

8257
#[test]
8358
fn like_expr_test() {
84-
run_sunny_day_test(
85-
"SELECT 1 LIKE 'a%';",
86-
select_expr(like_expr(
87-
numeric_expr("1"),
88-
LikeExpressionType::Expression(Box::new(string_expr("'a%'"))),
89-
false,
90-
))
91-
.into(),
92-
);
59+
let expr = like_expr(numeric_expr("1"), string_expr("'a%'"));
60+
run_sunny_day_test("SELECT 1 LIKE 'a%';", select_expr(expr.into()).into());
9361
}
9462

9563
#[test]
9664
fn not_like_expr() {
97-
run_sunny_day_test(
98-
"SELECT 1 NOT LIKE 'a%';",
99-
select_expr(like_expr(
100-
numeric_expr("1"),
101-
LikeExpressionType::Expression(Box::new(string_expr("'a%'"))),
102-
true,
103-
))
104-
.into(),
105-
);
65+
let mut expr = like_expr(numeric_expr("1"), string_expr("'a%'"));
66+
expr.not = true;
67+
68+
run_sunny_day_test("SELECT 1 NOT LIKE 'a%';", select_expr(expr.into()).into());
10669
}
10770

10871
#[test]
10972
fn like_with_escape_expr_test() {
73+
let mut like_expr = like_expr(numeric_expr("1"), string_expr("'a%'"));
74+
like_expr.escape_expression = Some(Box::new(string_expr("'b'")));
75+
11076
run_sunny_day_test(
11177
"SELECT 1 LIKE 'a%' ESCAPE 'b';",
112-
select_expr(like_expr(
113-
numeric_expr("1"),
114-
LikeExpressionType::EscapeExpression(EscapeExpression {
115-
expression: Box::new(string_expr("'a%'")),
116-
escape_expression: Some(Box::new(string_expr("'b'"))),
117-
}),
118-
false,
119-
))
120-
.into(),
78+
select_expr(like_expr.into()).into(),
12179
);
12280
}
12381
}

0 commit comments

Comments
 (0)