pipeline/etl/value/
time.rs1use common_time::timestamp::TimeUnit;
16
17#[derive(Debug, Clone, PartialEq)]
18pub enum Timestamp {
19 Nanosecond(i64),
20 Microsecond(i64),
21 Millisecond(i64),
22 Second(i64),
23}
24
25pub(crate) const NANOSECOND_RESOLUTION: &str = "nanosecond";
26pub(crate) const NANO_RESOLUTION: &str = "nano";
27pub(crate) const NS_RESOLUTION: &str = "ns";
28pub(crate) const MICROSECOND_RESOLUTION: &str = "microsecond";
29pub(crate) const MICRO_RESOLUTION: &str = "micro";
30pub(crate) const US_RESOLUTION: &str = "us";
31pub(crate) const MILLISECOND_RESOLUTION: &str = "millisecond";
32pub(crate) const MILLI_RESOLUTION: &str = "milli";
33pub(crate) const MS_RESOLUTION: &str = "ms";
34pub(crate) const SECOND_RESOLUTION: &str = "second";
35pub(crate) const SEC_RESOLUTION: &str = "sec";
36pub(crate) const S_RESOLUTION: &str = "s";
37
38pub(crate) const VALID_RESOLUTIONS: [&str; 12] = [
39 NANOSECOND_RESOLUTION,
40 NANO_RESOLUTION,
41 NS_RESOLUTION,
42 MICROSECOND_RESOLUTION,
43 MICRO_RESOLUTION,
44 US_RESOLUTION,
45 MILLISECOND_RESOLUTION,
46 MILLI_RESOLUTION,
47 MS_RESOLUTION,
48 SECOND_RESOLUTION,
49 SEC_RESOLUTION,
50 S_RESOLUTION,
51];
52
53impl Timestamp {
54 pub(crate) fn timestamp_nanos(&self) -> i64 {
55 match self {
56 Timestamp::Nanosecond(v) => *v,
57 Timestamp::Microsecond(v) => *v * 1_000,
58 Timestamp::Millisecond(v) => *v * 1_000_000,
59 Timestamp::Second(v) => *v * 1_000_000_000,
60 }
61 }
62
63 pub(crate) fn timestamp_micros(&self) -> i64 {
64 match self {
65 Timestamp::Nanosecond(v) => *v / 1_000,
66 Timestamp::Microsecond(v) => *v,
67 Timestamp::Millisecond(v) => *v * 1_000,
68 Timestamp::Second(v) => *v * 1_000_000,
69 }
70 }
71
72 pub(crate) fn timestamp_millis(&self) -> i64 {
73 match self {
74 Timestamp::Nanosecond(v) => *v / 1_000_000,
75 Timestamp::Microsecond(v) => *v / 1_000,
76 Timestamp::Millisecond(v) => *v,
77 Timestamp::Second(v) => *v * 1_000,
78 }
79 }
80
81 pub(crate) fn timestamp(&self) -> i64 {
82 match self {
83 Timestamp::Nanosecond(v) => *v / 1_000_000_000,
84 Timestamp::Microsecond(v) => *v / 1_000_000,
85 Timestamp::Millisecond(v) => *v / 1_000,
86 Timestamp::Second(v) => *v,
87 }
88 }
89
90 pub(crate) fn to_unit(&self, unit: &TimeUnit) -> i64 {
91 match unit {
92 TimeUnit::Second => self.timestamp(),
93 TimeUnit::Millisecond => self.timestamp_millis(),
94 TimeUnit::Microsecond => self.timestamp_micros(),
95 TimeUnit::Nanosecond => self.timestamp_nanos(),
96 }
97 }
98
99 pub fn get_unit(&self) -> TimeUnit {
100 match self {
101 Timestamp::Nanosecond(_) => TimeUnit::Nanosecond,
102 Timestamp::Microsecond(_) => TimeUnit::Microsecond,
103 Timestamp::Millisecond(_) => TimeUnit::Millisecond,
104 Timestamp::Second(_) => TimeUnit::Second,
105 }
106 }
107}
108
109impl Default for Timestamp {
110 fn default() -> Self {
111 Timestamp::Nanosecond(chrono::Utc::now().timestamp_nanos_opt().unwrap_or_default())
112 }
113}
114
115impl std::fmt::Display for Timestamp {
116 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
117 let (value, resolution) = match self {
118 Timestamp::Nanosecond(v) => (v, NANOSECOND_RESOLUTION),
119 Timestamp::Microsecond(v) => (v, MICROSECOND_RESOLUTION),
120 Timestamp::Millisecond(v) => (v, MILLISECOND_RESOLUTION),
121 Timestamp::Second(v) => (v, SECOND_RESOLUTION),
122 };
123
124 write!(f, "{}, resolution: {}", value, resolution)
125 }
126}