gluesql_test_suite/ast_builder/function/math/
basic_arithmetic.rs

1use {
2    crate::*,
3    gluesql_core::{
4        ast_builder::{function as f, *},
5        executor::Payload,
6        prelude::Value::*,
7    },
8};
9
10test_case!(basic_arithmetic, {
11    let glue = get_glue!();
12
13    // Create table - Number
14    let actual = table("Number")
15        .create_table()
16        .add_column("id INTEGER")
17        .add_column("number INTEGER")
18        .execute(glue)
19        .await;
20    let expected = Ok(Payload::Create);
21    assert_eq!(actual, expected, "create table - Number");
22
23    // Insert a row into the Number
24    let actual = table("Number")
25        .insert()
26        .values(vec!["0, 0", "1, 3", "2, 4", "3, 29"])
27        .execute(glue)
28        .await;
29    let expected = Ok(Payload::Insert(4));
30    assert_eq!(actual, expected, "insert into Number");
31
32    // Example Using ABS
33    let actual = values(vec!["0, 0", "1, -3", "2, 4", "3, -29"])
34        .alias_as("number")
35        .select()
36        .project("column1")
37        .project(f::abs("column2"))
38        .project(col("column2").abs())
39        .execute(glue)
40        .await;
41    let expected = Ok(select!(
42        column1 | r#"ABS("column2")"#   | r#"ABS("column2")"#
43        I64     | I64                   | I64;
44        0         0                       0;
45        1         3                       3;
46        2         4                       4;
47        3         29                      29
48    ));
49    assert_eq!(actual, expected, "Example Using ABS");
50
51    //Example Using DIV
52    let actual = table("Number")
53        .select()
54        .project("id")
55        .project(f::divide("number", 3))
56        .project(f::divide(col("number"), 3))
57        .execute(glue)
58        .await;
59    let expected = Ok(select!(
60        id  | r#"DIV("number", 3)"# | r#"DIV("number", 3)"#
61        I64 | I64                   | I64;
62        0     0                       0;
63        1     1                       1;
64        2     1                       1;
65        3     9                       9
66    ));
67    assert_eq!(actual, expected, "Example Using DIV");
68
69    //Example Using MOD
70    let actual = table("Number")
71        .select()
72        .project("id")
73        .project(f::modulo("number", 4))
74        .project(f::modulo(col("number"), 4))
75        .execute(glue)
76        .await;
77    let expected = Ok(select!(
78        id  | r#"MOD("number", 4)"# | r#"MOD("number", 4)"#
79        I64 | I64                   | I64;
80        0     0                       0;
81        1     3                       3;
82        2     0                       0;
83        3     1                       1
84    ));
85    assert_eq!(actual, expected, "Example Using MOD");
86
87    //Example Using GCD
88    let actual = table("Number")
89        .select()
90        .project("id")
91        .project(f::gcd("number", 12))
92        .project(f::gcd(col("number"), 12))
93        .execute(glue)
94        .await;
95    let expected = Ok(select!(
96        id  | r#"GCD("number", 12)"# | r#"GCD("number", 12)"#
97        I64 | I64                   | I64;
98        0     12                      12;
99        1     3                       3;
100        2     4                       4;
101        3     1                       1
102    ));
103    assert_eq!(actual, expected, "Example Using GCD");
104
105    //Example Using LCM
106    let actual = table("Number")
107        .select()
108        .project("id")
109        .project(f::lcm("number", 3))
110        .project(f::lcm(col("number"), 3))
111        .execute(glue)
112        .await;
113    let expected = Ok(select!(
114        id  | r#"LCM("number", 3)"# | r#"LCM("number", 3)"#
115        I64 | I64                   | I64;
116        0     0                       0;
117        1     3                       3;
118        2     12                      12;
119        3     87                      87
120    ));
121    assert_eq!(actual, expected, "Example Using LCM");
122});