timeseries_table_datafusion/
test_utils.rs1use chrono::{DateTime, Utc};
2use datafusion::logical_expr::{Expr, Operator};
3
4use crate::ts_table_provider::{IntervalTruth, ParsedTz, TimePred, UnifiedInterval};
5
6#[derive(Debug, PartialEq)]
8pub enum CompiledTimePred {
9 True,
11 False,
13 NonTime,
15 Unknown,
17 Cmp {
19 op: Operator,
21 ts: DateTime<Utc>,
23 },
24 Other,
26}
27
28#[derive(Debug, PartialEq, Eq)]
30pub enum CompiledIntervalTruth {
31 AlwaysTrue,
33 AlwaysFalse,
35 MaybeTrue,
37}
38
39pub fn compile_time_pred_for_tests(expr: &Expr, ts_col: &str) -> CompiledTimePred {
41 compile_time_pred_for_tests_with_tz(expr, ts_col, None)
42}
43
44pub(crate) fn compile_time_pred_for_tests_with_tz(
46 expr: &Expr,
47 ts_col: &str,
48 tz: Option<&ParsedTz>,
49) -> CompiledTimePred {
50 match crate::ts_table_provider::compile_time_pred(expr, ts_col, tz) {
51 TimePred::True => CompiledTimePred::True,
52 TimePred::False => CompiledTimePred::False,
53 TimePred::NonTime => CompiledTimePred::NonTime,
54 TimePred::Unknown => CompiledTimePred::Unknown,
55 TimePred::Cmp { op, ts } => CompiledTimePred::Cmp { op, ts },
56 _ => CompiledTimePred::Other,
57 }
58}
59
60pub fn eval_time_pred_on_segment_for_tests(
62 expr: &Expr,
63 ts_col: &str,
64 seg_min: DateTime<Utc>,
65 seg_max: DateTime<Utc>,
66) -> CompiledIntervalTruth {
67 eval_time_pred_on_segment_for_tests_with_tz(expr, ts_col, seg_min, seg_max, None)
68}
69
70pub(crate) fn eval_time_pred_on_segment_for_tests_with_tz(
72 expr: &Expr,
73 ts_col: &str,
74 seg_min: DateTime<Utc>,
75 seg_max: DateTime<Utc>,
76 tz: Option<&ParsedTz>,
77) -> CompiledIntervalTruth {
78 let pred = crate::ts_table_provider::compile_time_pred(expr, ts_col, tz);
79 match crate::ts_table_provider::eval_time_pred_on_segment(&pred, seg_min, seg_max) {
80 IntervalTruth::AlwaysTrue => CompiledIntervalTruth::AlwaysTrue,
81 IntervalTruth::AlwaysFalse => CompiledIntervalTruth::AlwaysFalse,
82 IntervalTruth::MaybeTrue => CompiledIntervalTruth::MaybeTrue,
83 }
84}
85
86pub fn eval_time_pred_on_segment_for_tests_utc(
88 expr: &Expr,
89 ts_col: &str,
90 seg_min: DateTime<Utc>,
91 seg_max: DateTime<Utc>,
92) -> CompiledIntervalTruth {
93 eval_time_pred_on_segment_for_tests_with_tz(
94 expr,
95 ts_col,
96 seg_min,
97 seg_max,
98 Some(&ParsedTz::Utc),
99 )
100}
101
102pub struct TestInterval {
104 pub months: i32,
106 pub days: i32,
108 pub nanos: i64,
110}
111
112pub fn add_interval_for_tests(
114 dt: DateTime<Utc>,
115 interval: TestInterval,
116 sign: i32,
117) -> Option<DateTime<Utc>> {
118 crate::ts_table_provider::add_interval(
119 dt,
120 UnifiedInterval {
121 months: interval.months,
122 days: interval.days,
123 nanos: interval.nanos,
124 },
125 sign,
126 )
127}