pipeline/etl/value/
time.rs

1// Copyright 2023 Greptime Team
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use 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}