Use `LitIR` throughout `dml`

next
Sayan Nandan 2 years ago
parent 40b4c5042a
commit 3257798ee0
No known key found for this signature in database
GPG Key ID: 8BC07A0A4D41DD52

@ -32,7 +32,7 @@
use { use {
super::{ super::{
ast::Entity, ast::Entity,
lexer::{Lit, LitIR, Symbol, Token}, lexer::{LitIR, Symbol, Token},
LangError, LangResult, RawSlice, LangError, LangResult, RawSlice,
}, },
crate::{ crate::{
@ -676,13 +676,13 @@ pub struct AssignmentExpression<'a> {
/// the LHS ident /// the LHS ident
pub(super) lhs: RawSlice, pub(super) lhs: RawSlice,
/// the RHS lit /// the RHS lit
pub(super) rhs: &'a Lit, pub(super) rhs: LitIR<'a>,
/// operator /// operator
pub(super) operator_fn: Operator, pub(super) operator_fn: Operator,
} }
impl<'a> AssignmentExpression<'a> { impl<'a> AssignmentExpression<'a> {
pub(super) fn new(lhs: RawSlice, rhs: &'a Lit, operator_fn: Operator) -> Self { pub(super) fn new(lhs: RawSlice, rhs: LitIR<'a>, operator_fn: Operator) -> Self {
Self { Self {
lhs, lhs,
rhs, rhs,
@ -740,7 +740,7 @@ impl<'a> AssignmentExpression<'a> {
*/ */
AssignmentExpression { AssignmentExpression {
lhs: extract!(tok[0], Token::Ident(ref r) => r.clone()), lhs: extract!(tok[0], Token::Ident(ref r) => r.clone()),
rhs: extract!(tok[i], Token::Lit(ref l) => l), rhs: extract!(tok[i], Token::Lit(ref l) => l.as_ir()),
operator_fn: OPERATOR[operator_code as usize], operator_fn: OPERATOR[operator_code as usize],
} }
}; };

@ -565,7 +565,7 @@ mod expression_tests {
super::*, super::*,
crate::engine::ql::{ crate::engine::ql::{
dml::{self, AssignmentExpression, Operator}, dml::{self, AssignmentExpression, Operator},
lexer::Lit, lexer::LitIR,
}, },
}; };
#[test] #[test]
@ -576,7 +576,7 @@ mod expression_tests {
r, r,
AssignmentExpression { AssignmentExpression {
lhs: "username".into(), lhs: "username".into(),
rhs: &Lit::Str("sayan".into()), rhs: LitIR::Str("sayan"),
operator_fn: Operator::Assign operator_fn: Operator::Assign
} }
); );
@ -589,7 +589,7 @@ mod expression_tests {
r, r,
AssignmentExpression { AssignmentExpression {
lhs: "followers".into(), lhs: "followers".into(),
rhs: &(100.into()), rhs: LitIR::UInt(100),
operator_fn: Operator::AddAssign operator_fn: Operator::AddAssign
} }
); );
@ -602,7 +602,7 @@ mod expression_tests {
r, r,
AssignmentExpression { AssignmentExpression {
lhs: "following".into(), lhs: "following".into(),
rhs: &(150.into()), rhs: LitIR::UInt(150),
operator_fn: Operator::SubAssign operator_fn: Operator::SubAssign
} }
); );
@ -615,7 +615,7 @@ mod expression_tests {
r, r,
AssignmentExpression { AssignmentExpression {
lhs: "product_qty".into(), lhs: "product_qty".into(),
rhs: &(2.into()), rhs: LitIR::UInt(2),
operator_fn: Operator::MulAssign operator_fn: Operator::MulAssign
} }
); );
@ -628,7 +628,7 @@ mod expression_tests {
r, r,
AssignmentExpression { AssignmentExpression {
lhs: "image_crop_factor".into(), lhs: "image_crop_factor".into(),
rhs: &(2.into()), rhs: LitIR::UInt(2),
operator_fn: Operator::DivAssign operator_fn: Operator::DivAssign
} }
); );
@ -653,13 +653,12 @@ mod update_statement {
"#, "#,
) )
.unwrap(); .unwrap();
let note = "this is my new note".to_string().into();
let r = dml::parse_update_full(&tok[1..]).unwrap(); let r = dml::parse_update_full(&tok[1..]).unwrap();
let e = UpdateStatement { let e = UpdateStatement {
entity: Entity::Single("app".into()), entity: Entity::Single("app".into()),
expressions: vec![AssignmentExpression { expressions: vec![AssignmentExpression {
lhs: "notes".into(), lhs: "notes".into(),
rhs: &note, rhs: LitIR::Str("this is my new note"),
operator_fn: Operator::AddAssign, operator_fn: Operator::AddAssign,
}], }],
wc: WhereClause::new(dict! { wc: WhereClause::new(dict! {
@ -687,13 +686,19 @@ mod update_statement {
) )
.unwrap(); .unwrap();
let r = dml::parse_update_full(&tok[1..]).unwrap(); let r = dml::parse_update_full(&tok[1..]).unwrap();
let field_note = "this is my new note".into();
let field_email = "sayan@example.com".into();
let e = UpdateStatement { let e = UpdateStatement {
entity: ("jotsy", "app").into(), entity: ("jotsy", "app").into(),
expressions: vec![ expressions: vec![
AssignmentExpression::new("notes".into(), &field_note, Operator::AddAssign), AssignmentExpression::new(
AssignmentExpression::new("email".into(), &field_email, Operator::Assign), "notes".into(),
LitIR::Str("this is my new note"),
Operator::AddAssign,
),
AssignmentExpression::new(
"email".into(),
LitIR::Str("sayan@example.com"),
Operator::Assign,
),
], ],
wc: WhereClause::new(dict! { wc: WhereClause::new(dict! {
"username".as_bytes() => RelationalExpr::new( "username".as_bytes() => RelationalExpr::new(

Loading…
Cancel
Save