surrealdb_expr/expr/
constant.rs1use chrono::{TimeZone, Utc};
2use surrealdb_types::{SqlFormat, ToSql};
3
4use crate::val::{Datetime, Duration, Value};
5
6#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Hash)]
7pub enum Constant {
8 MathE,
9 MathFrac1Pi,
10 MathFrac1Sqrt2,
11 MathFrac2Pi,
12 MathFrac2SqrtPi,
13 MathFracPi2,
14 MathFracPi3,
15 MathFracPi4,
16 MathFracPi6,
17 MathFracPi8,
18 MathInfinity,
19 MathLn10,
20 MathLn2,
21 MathLog102,
22 MathLog10E,
23 MathLog210,
24 MathLog2E,
25 MathNegInfinity,
26 MathPi,
27 MathSqrt2,
28 MathTau,
29 TimeEpoch,
30 TimeMin,
31 TimeMax,
32 DurationMax,
33 }
35
36pub enum ConstantValue {
38 Float(f64),
39 Datetime(Datetime),
40 Duration(Duration),
41}
42
43impl Constant {
44 pub fn value(&self) -> ConstantValue {
45 use std::f64::consts as f64c;
46 match self {
47 Self::MathE => ConstantValue::Float(f64c::E),
48 Self::MathFrac1Pi => ConstantValue::Float(f64c::FRAC_1_PI),
49 Self::MathFrac1Sqrt2 => ConstantValue::Float(f64c::FRAC_1_SQRT_2),
50 Self::MathFrac2Pi => ConstantValue::Float(f64c::FRAC_2_PI),
51 Self::MathFrac2SqrtPi => ConstantValue::Float(f64c::FRAC_2_SQRT_PI),
52 Self::MathFracPi2 => ConstantValue::Float(f64c::FRAC_PI_2),
53 Self::MathFracPi3 => ConstantValue::Float(f64c::FRAC_PI_3),
54 Self::MathFracPi4 => ConstantValue::Float(f64c::FRAC_PI_4),
55 Self::MathFracPi6 => ConstantValue::Float(f64c::FRAC_PI_6),
56 Self::MathFracPi8 => ConstantValue::Float(f64c::FRAC_PI_8),
57 Self::MathInfinity => ConstantValue::Float(f64::INFINITY),
58 Self::MathLn10 => ConstantValue::Float(f64c::LN_10),
59 Self::MathLn2 => ConstantValue::Float(f64c::LN_2),
60 Self::MathLog102 => ConstantValue::Float(f64c::LOG10_2),
61 Self::MathLog10E => ConstantValue::Float(f64c::LOG10_E),
62 Self::MathLog210 => ConstantValue::Float(f64c::LOG2_10),
63 Self::MathLog2E => ConstantValue::Float(f64c::LOG2_E),
64 Self::MathNegInfinity => ConstantValue::Float(f64::NEG_INFINITY),
65 Self::MathPi => ConstantValue::Float(f64c::PI),
66 Self::MathSqrt2 => ConstantValue::Float(f64c::SQRT_2),
67 Self::MathTau => ConstantValue::Float(f64c::TAU),
68 Self::TimeEpoch => ConstantValue::Datetime(Datetime(Utc.timestamp_nanos(0))),
69 Self::TimeMin => ConstantValue::Datetime(Datetime::MIN_UTC),
70 Self::TimeMax => ConstantValue::Datetime(Datetime::MAX_UTC),
71 Self::DurationMax => ConstantValue::Duration(Duration::MAX),
72 }
73 }
74 pub fn compute(&self) -> Value {
76 match self.value() {
77 ConstantValue::Datetime(d) => d.into(),
78 ConstantValue::Float(f) => f.into(),
79 ConstantValue::Duration(d) => d.into(),
80 }
81 }
82}
83
84impl ToSql for Constant {
85 fn fmt_sql(&self, f: &mut String, sql_fmt: SqlFormat) {
86 let constant: crate::sql::Constant = self.clone().into();
87 constant.fmt_sql(f, sql_fmt);
88 }
89}