|
@@ -1,6 +1,6 @@
|
1
|
1
|
use std::{iter::Peekable, slice::Iter};
|
2
|
2
|
|
3
|
|
-use crate::ast::{Field, KIdentifier, KNumber, KString, KValue, Select, Where};
|
|
3
|
+use crate::ast::{Equals, Field, KIdentifier, KNumber, KString, KValue, Select, Where};
|
4
|
4
|
use crate::error::KappeError;
|
5
|
5
|
use crate::token::{Token, TokenType};
|
6
|
6
|
|
|
@@ -45,25 +45,22 @@ fn parse_fields(tokens: &mut Peekable<Iter<Token>>) -> Result<Vec<Field>, KappeE
|
45
|
45
|
}
|
46
|
46
|
|
47
|
47
|
fn parse_where_clause(tokens: &mut Peekable<Iter<Token>>) -> Result<Option<Where>, KappeError> {
|
|
48
|
+ let mut predicates: Vec<Equals> = vec![];
|
48
|
49
|
let where_clause = if current_token_is(tokens, TokenType::Where) {
|
49
|
50
|
eat(tokens, TokenType::Where)?;
|
50
|
51
|
|
51
|
52
|
let predicate = parse_predicate(tokens)?;
|
|
53
|
+ predicates.push(predicate);
|
52
|
54
|
|
53
|
55
|
if current_token_is(tokens, TokenType::Comma) {
|
54
|
|
- let mut predicates: Vec<Where> = vec![];
|
55
|
|
- predicates.push(predicate);
|
56
|
|
-
|
57
|
56
|
while current_token_is(tokens, TokenType::Comma) {
|
58
|
57
|
eat(tokens, TokenType::Comma)?;
|
59
|
58
|
let predicate = parse_predicate(tokens)?;
|
60
|
59
|
predicates.push(predicate);
|
61
|
60
|
}
|
62
|
|
-
|
63
|
|
- Some(Where::And(predicates))
|
64
|
|
- } else {
|
65
|
|
- Some(predicate)
|
66
|
61
|
}
|
|
62
|
+
|
|
63
|
+ Some(Where::new(predicates))
|
67
|
64
|
} else {
|
68
|
65
|
None
|
69
|
66
|
};
|
|
@@ -71,9 +68,9 @@ fn parse_where_clause(tokens: &mut Peekable<Iter<Token>>) -> Result<Option<Where
|
71
|
68
|
Ok(where_clause)
|
72
|
69
|
}
|
73
|
70
|
|
74
|
|
-fn parse_predicate(tokens: &mut Peekable<Iter<Token>>) -> Result<Where, KappeError> {
|
|
71
|
+fn parse_predicate(tokens: &mut Peekable<Iter<Token>>) -> Result<Equals, KappeError> {
|
75
|
72
|
let field = eat(tokens, TokenType::Identfiier)?;
|
76
|
|
- let field = KValue::Identifier(KIdentifier::new(&field.value));
|
|
73
|
+ let field = KIdentifier::new(&field.value);
|
77
|
74
|
|
78
|
75
|
eat(tokens, TokenType::Equals)?;
|
79
|
76
|
|
|
@@ -82,9 +79,9 @@ fn parse_predicate(tokens: &mut Peekable<Iter<Token>>) -> Result<Where, KappeErr
|
82
|
79
|
Ok(KValue::String(KString::new(&token.value)))
|
83
|
80
|
} else if current_token_is(tokens, TokenType::Number) {
|
84
|
81
|
let token = eat(tokens, TokenType::Number)?;
|
85
|
|
- match token.value.parse::<f32>() {
|
|
82
|
+ match token.value.parse::<f64>() {
|
86
|
83
|
Ok(n) => Ok(KValue::Number(KNumber::new(n))),
|
87
|
|
- Err(_) => Err(KappeError::new("Error converting number to f32")),
|
|
84
|
+ Err(_) => Err(KappeError::new("Error converting number to f64")),
|
88
|
85
|
}
|
89
|
86
|
} else {
|
90
|
87
|
Err(KappeError::new(
|
|
@@ -92,7 +89,7 @@ fn parse_predicate(tokens: &mut Peekable<Iter<Token>>) -> Result<Where, KappeErr
|
92
|
89
|
))
|
93
|
90
|
}?;
|
94
|
91
|
|
95
|
|
- Ok(Where::Equals(field, value))
|
|
92
|
+ Ok(Equals::new(field, value))
|
96
|
93
|
}
|
97
|
94
|
|
98
|
95
|
fn current_token_is(tokens: &mut Peekable<Iter<Token>>, token_type: TokenType) -> bool {
|
|
@@ -177,10 +174,10 @@ mod tests {
|
177
|
174
|
Select {
|
178
|
175
|
fields: vec![Field::Star],
|
179
|
176
|
source: KIdentifier::new("index"),
|
180
|
|
- where_clause: Some(Where::Equals(
|
181
|
|
- KValue::Identifier(KIdentifier::new("field")),
|
|
177
|
+ where_clause: Some(Where::new(vec![Equals::new(
|
|
178
|
+ KIdentifier::new("field"),
|
182
|
179
|
KValue::String(KString::new("hello")),
|
183
|
|
- ))
|
|
180
|
+ )]))
|
184
|
181
|
},
|
185
|
182
|
)
|
186
|
183
|
}
|
|
@@ -192,10 +189,10 @@ mod tests {
|
192
|
189
|
Select {
|
193
|
190
|
fields: vec![Field::Star],
|
194
|
191
|
source: KIdentifier::new("index"),
|
195
|
|
- where_clause: Some(Where::Equals(
|
196
|
|
- KValue::Identifier(KIdentifier::new("field")),
|
197
|
|
- KValue::Number(KNumber::new(123.0)),
|
198
|
|
- ))
|
|
192
|
+ where_clause: Some(Where::new(vec![Equals::new(
|
|
193
|
+ KIdentifier::new("field"),
|
|
194
|
+ KValue::Number(KNumber::new(123.0))
|
|
195
|
+ ),]))
|
199
|
196
|
},
|
200
|
197
|
)
|
201
|
198
|
}
|
|
@@ -208,13 +205,13 @@ mod tests {
|
208
|
205
|
Select {
|
209
|
206
|
fields: vec![Field::Star],
|
210
|
207
|
source: KIdentifier::new("index"),
|
211
|
|
- where_clause: Some(Where::And(vec![
|
212
|
|
- Where::Equals(
|
213
|
|
- KValue::Identifier(KIdentifier::new("field_one")),
|
|
208
|
+ where_clause: Some(Where::new(vec![
|
|
209
|
+ Equals::new(
|
|
210
|
+ KIdentifier::new("field_one"),
|
214
|
211
|
KValue::String(KString::new("hello")),
|
215
|
212
|
),
|
216
|
|
- Where::Equals(
|
217
|
|
- KValue::Identifier(KIdentifier::new("field_two")),
|
|
213
|
+ Equals::new(
|
|
214
|
+ KIdentifier::new("field_two"),
|
218
|
215
|
KValue::String(KString::new("world")),
|
219
|
216
|
)
|
220
|
217
|
]))
|