Skip to main content

shape_ast/ast/
time.rs

1//! Time-related types for Shape AST
2
3use serde::{Deserialize, Serialize};
4
5use super::literals::Duration;
6
7// Timeframe is now defined in our internal data module
8pub use crate::data::{Timeframe, TimeframeUnit};
9
10#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
11pub enum TimeReference {
12    /// Absolute time: @"2024-01-15 09:30"
13    Absolute(String), // Will be parsed to DateTime in semantic phase
14    /// Named time: @today, @yesterday
15    Named(NamedTime),
16    /// Relative time: @"1 week ago"
17    Relative(RelativeTime),
18}
19
20#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
21pub enum DateTimeExpr {
22    /// Absolute datetime: @"2024-01-15 09:30"
23    Absolute(String),
24    /// Literal datetime string
25    Literal(String),
26    /// Named time: @today, @now
27    Named(NamedTime),
28    /// Relative time with duration
29    Relative {
30        base: Box<DateTimeExpr>,
31        offset: Duration,
32    },
33    /// Arithmetic operations on datetime
34    Arithmetic {
35        base: Box<DateTimeExpr>,
36        operator: String,
37        duration: Duration,
38    },
39}
40
41#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
42pub enum NamedTime {
43    Today,
44    Yesterday,
45    Now,
46}
47
48#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
49pub struct RelativeTime {
50    pub amount: i32,
51    pub unit: TimeUnit,
52    pub direction: TimeDirection,
53}
54
55#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
56pub enum TimeUnit {
57    Minutes,
58    Hours,
59    Days,
60    Weeks,
61    Months,
62    Samples,
63}
64
65#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
66pub enum TimeDirection {
67    Ago,
68    Future,
69}
70
71#[derive(Debug, Clone, Serialize, Deserialize)]
72pub enum TimeWindow {
73    /// last(100 rows)
74    Last { amount: i32, unit: TimeUnit },
75    /// between(@"2024-01-01", @"2024-01-31")
76    Between {
77        start: TimeReference,
78        end: TimeReference,
79    },
80    /// window(5) or window(-10, -1)
81    Window { start: i32, end: Option<i32> },
82    /// window(@"09:30", @"16:00") - session window
83    Session { start: String, end: String },
84}