Skip to main content

surrealdb_expr/expr/
constant.rs

1use 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	// Add new variants here
34}
35
36/// A type of constant that may be converted to a value or JSON.
37pub 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	/// Process this type returning a computed simple Value
75	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}