ora_client/
schedule_query.rs1use std::time::SystemTime;
4
5use ora_proto::{
6 common::v1::TimeRange,
7 server::v1::{self, ScheduleQueryOrder},
8};
9use uuid::Uuid;
10
11use crate::{IndexSet, JobType};
12
13#[derive(Debug, Clone, Default)]
15#[must_use]
16pub struct ScheduleFilter {
17 pub schedule_ids: IndexSet<Uuid>,
19 pub job_ids: IndexSet<Uuid>,
23 pub job_type_ids: IndexSet<String>,
27 pub labels: Vec<ScheduleLabelFilter>,
32 pub active: Option<bool>,
36 pub created_after: Option<SystemTime>,
40 pub created_before: Option<SystemTime>,
44}
45
46impl ScheduleFilter {
47 pub fn new() -> Self {
49 Self::default()
50 }
51
52 pub fn with_job_id(mut self, job_id: Uuid) -> Self {
54 self.job_ids.insert(job_id);
55 self
56 }
57
58 pub fn with_job_ids(mut self, job_ids: impl IntoIterator<Item = Uuid>) -> Self {
60 self.job_ids.extend(job_ids);
61 self
62 }
63
64 pub fn with_job_type_id(mut self, job_type_id: impl Into<String>) -> Self {
66 self.job_type_ids.insert(job_type_id.into());
67 self
68 }
69
70 pub fn with_job_type_ids(mut self, job_type_ids: impl IntoIterator<Item = String>) -> Self {
72 self.job_type_ids.extend(job_type_ids);
73 self
74 }
75
76 pub fn with_schedule_id(mut self, schedule_id: Uuid) -> Self {
78 self.schedule_ids.insert(schedule_id);
79 self
80 }
81
82 pub fn with_schedule_ids(mut self, schedule_ids: impl IntoIterator<Item = Uuid>) -> Self {
84 self.schedule_ids.extend(schedule_ids);
85 self
86 }
87
88 pub fn active_only(mut self) -> Self {
90 self.active = Some(true);
91 self
92 }
93
94 pub fn inactive_only(mut self) -> Self {
96 self.active = Some(false);
97 self
98 }
99
100 pub fn with_label_value(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
102 self.labels.push(ScheduleLabelFilter {
103 key: key.into(),
104 value: ScheduleLabelFilterValue::Equals(value.into()),
105 });
106 self
107 }
108
109 pub fn with_label(mut self, key: impl Into<String>) -> Self {
111 self.labels.push(ScheduleLabelFilter {
112 key: key.into(),
113 value: ScheduleLabelFilterValue::Exists,
114 });
115 self
116 }
117
118 pub fn created_after(mut self, time: SystemTime) -> Self {
122 self.created_after = Some(time);
123 self
124 }
125
126 pub fn created_before(mut self, time: SystemTime) -> Self {
130 self.created_before = Some(time);
131 self
132 }
133
134 pub fn include_job_type<J: JobType>(self) -> Self {
136 self.with_job_type_id(J::id())
137 }
138}
139
140impl From<ScheduleFilter> for v1::ScheduleQueryFilter {
141 fn from(filter: ScheduleFilter) -> Self {
142 Self {
143 job_ids: filter
144 .job_ids
145 .into_iter()
146 .map(|id| id.to_string())
147 .collect(),
148 job_type_ids: filter
149 .job_type_ids
150 .into_iter()
151 .map(|id| id.to_string())
152 .collect(),
153
154 schedule_ids: filter
155 .schedule_ids
156 .into_iter()
157 .map(|id| id.to_string())
158 .collect(),
159 labels: filter.labels.into_iter().map(Into::into).collect(),
160 active: filter.active,
161 created_at: Some(TimeRange {
162 start: filter.created_after.map(Into::into),
163 end: filter.created_before.map(Into::into),
164 }),
165 }
166 }
167}
168
169#[derive(Debug, Clone)]
171pub struct ScheduleLabelFilter {
172 pub key: String,
174 pub value: ScheduleLabelFilterValue,
176}
177
178#[derive(Debug, Clone)]
180pub enum ScheduleLabelFilterValue {
181 Exists,
183 Equals(String),
185}
186
187impl From<ScheduleLabelFilter> for v1::ScheduleLabelFilter {
188 fn from(filter: ScheduleLabelFilter) -> Self {
189 Self {
190 key: filter.key,
191 value: match filter.value {
192 ScheduleLabelFilterValue::Exists => Some(v1::schedule_label_filter::Value::Exists(
193 v1::LabelFilterExistCondition::Exists.into(),
194 )),
195 ScheduleLabelFilterValue::Equals(value) => {
196 Some(v1::schedule_label_filter::Value::Equals(value))
197 }
198 },
199 }
200 }
201}
202
203#[derive(Debug, Default, Clone, Copy)]
205pub enum ScheduleOrder {
206 CreatedAtAsc,
208 #[default]
210 CreatedAtDesc,
211}
212
213impl From<ScheduleOrder> for ScheduleQueryOrder {
214 fn from(value: ScheduleOrder) -> Self {
215 match value {
216 ScheduleOrder::CreatedAtAsc => Self::CreatedAtAsc,
217 ScheduleOrder::CreatedAtDesc => Self::CreatedAtDesc,
218 }
219 }
220}