re_types_core/datatypes/
time_range.rs1#![allow(unused_braces)]
5#![allow(unused_imports)]
6#![allow(unused_parens)]
7#![allow(clippy::clone_on_copy)]
8#![allow(clippy::cloned_instead_of_copied)]
9#![allow(clippy::map_flatten)]
10#![allow(clippy::needless_question_mark)]
11#![allow(clippy::new_without_default)]
12#![allow(clippy::redundant_closure)]
13#![allow(clippy::too_many_arguments)]
14#![allow(clippy::too_many_lines)]
15
16use crate::try_serialize_field;
17use crate::SerializationResult;
18use crate::{ComponentBatch as _, SerializedComponentBatch};
19use crate::{ComponentDescriptor, ComponentType};
20use crate::{DeserializationError, DeserializationResult};
21
22#[derive(Clone, Debug, PartialEq, Eq)]
24pub struct TimeRange {
25 pub start: crate::datatypes::TimeRangeBoundary,
27
28 pub end: crate::datatypes::TimeRangeBoundary,
30}
31
32crate::macros::impl_into_cow!(TimeRange);
33
34impl crate::Loggable for TimeRange {
35 #[inline]
36 fn arrow_datatype() -> arrow::datatypes::DataType {
37 #![allow(clippy::wildcard_imports)]
38 use arrow::datatypes::*;
39 DataType::Struct(Fields::from(vec![
40 Field::new(
41 "start",
42 <crate::datatypes::TimeRangeBoundary>::arrow_datatype(),
43 true,
44 ),
45 Field::new(
46 "end",
47 <crate::datatypes::TimeRangeBoundary>::arrow_datatype(),
48 true,
49 ),
50 ]))
51 }
52
53 fn to_arrow_opt<'a>(
54 data: impl IntoIterator<Item = Option<impl Into<::std::borrow::Cow<'a, Self>>>>,
55 ) -> SerializationResult<arrow::array::ArrayRef>
56 where
57 Self: Clone + 'a,
58 {
59 #![allow(clippy::wildcard_imports)]
60 #![allow(clippy::manual_is_variant_and)]
61 use crate::{arrow_helpers::as_array_ref, Loggable as _, ResultExt as _};
62 use arrow::{array::*, buffer::*, datatypes::*};
63 Ok({
64 let fields = Fields::from(vec![
65 Field::new(
66 "start",
67 <crate::datatypes::TimeRangeBoundary>::arrow_datatype(),
68 true,
69 ),
70 Field::new(
71 "end",
72 <crate::datatypes::TimeRangeBoundary>::arrow_datatype(),
73 true,
74 ),
75 ]);
76 let (somes, data): (Vec<_>, Vec<_>) = data
77 .into_iter()
78 .map(|datum| {
79 let datum: Option<::std::borrow::Cow<'a, Self>> = datum.map(Into::into);
80 (datum.is_some(), datum)
81 })
82 .unzip();
83 let validity: Option<arrow::buffer::NullBuffer> = {
84 let any_nones = somes.iter().any(|some| !*some);
85 any_nones.then(|| somes.into())
86 };
87 as_array_ref(StructArray::new(
88 fields,
89 vec![
90 {
91 let (somes, start): (Vec<_>, Vec<_>) = data
92 .iter()
93 .map(|datum| {
94 let datum = datum.as_ref().map(|datum| datum.start.clone());
95 (datum.is_some(), datum)
96 })
97 .unzip();
98 let start_validity: Option<arrow::buffer::NullBuffer> = {
99 let any_nones = somes.iter().any(|some| !*some);
100 any_nones.then(|| somes.into())
101 };
102 {
103 _ = start_validity;
104 crate::datatypes::TimeRangeBoundary::to_arrow_opt(start)?
105 }
106 },
107 {
108 let (somes, end): (Vec<_>, Vec<_>) = data
109 .iter()
110 .map(|datum| {
111 let datum = datum.as_ref().map(|datum| datum.end.clone());
112 (datum.is_some(), datum)
113 })
114 .unzip();
115 let end_validity: Option<arrow::buffer::NullBuffer> = {
116 let any_nones = somes.iter().any(|some| !*some);
117 any_nones.then(|| somes.into())
118 };
119 {
120 _ = end_validity;
121 crate::datatypes::TimeRangeBoundary::to_arrow_opt(end)?
122 }
123 },
124 ],
125 validity,
126 ))
127 })
128 }
129
130 fn from_arrow_opt(
131 arrow_data: &dyn arrow::array::Array,
132 ) -> DeserializationResult<Vec<Option<Self>>>
133 where
134 Self: Sized,
135 {
136 #![allow(clippy::wildcard_imports)]
137 use crate::{arrow_zip_validity::ZipValidity, Loggable as _, ResultExt as _};
138 use arrow::{array::*, buffer::*, datatypes::*};
139 Ok({
140 let arrow_data = arrow_data
141 .as_any()
142 .downcast_ref::<arrow::array::StructArray>()
143 .ok_or_else(|| {
144 let expected = Self::arrow_datatype();
145 let actual = arrow_data.data_type().clone();
146 DeserializationError::datatype_mismatch(expected, actual)
147 })
148 .with_context("rerun.datatypes.TimeRange")?;
149 if arrow_data.is_empty() {
150 Vec::new()
151 } else {
152 let (arrow_data_fields, arrow_data_arrays) =
153 (arrow_data.fields(), arrow_data.columns());
154 let arrays_by_name: ::std::collections::HashMap<_, _> = arrow_data_fields
155 .iter()
156 .map(|field| field.name().as_str())
157 .zip(arrow_data_arrays)
158 .collect();
159 let start = {
160 if !arrays_by_name.contains_key("start") {
161 return Err(DeserializationError::missing_struct_field(
162 Self::arrow_datatype(),
163 "start",
164 ))
165 .with_context("rerun.datatypes.TimeRange");
166 }
167 let arrow_data = &**arrays_by_name["start"];
168 crate::datatypes::TimeRangeBoundary::from_arrow_opt(arrow_data)
169 .with_context("rerun.datatypes.TimeRange#start")?
170 .into_iter()
171 };
172 let end = {
173 if !arrays_by_name.contains_key("end") {
174 return Err(DeserializationError::missing_struct_field(
175 Self::arrow_datatype(),
176 "end",
177 ))
178 .with_context("rerun.datatypes.TimeRange");
179 }
180 let arrow_data = &**arrays_by_name["end"];
181 crate::datatypes::TimeRangeBoundary::from_arrow_opt(arrow_data)
182 .with_context("rerun.datatypes.TimeRange#end")?
183 .into_iter()
184 };
185 ZipValidity::new_with_validity(::itertools::izip!(start, end), arrow_data.nulls())
186 .map(|opt| {
187 opt.map(|(start, end)| {
188 Ok(Self {
189 start: start
190 .ok_or_else(DeserializationError::missing_data)
191 .with_context("rerun.datatypes.TimeRange#start")?,
192 end: end
193 .ok_or_else(DeserializationError::missing_data)
194 .with_context("rerun.datatypes.TimeRange#end")?,
195 })
196 })
197 .transpose()
198 })
199 .collect::<DeserializationResult<Vec<_>>>()
200 .with_context("rerun.datatypes.TimeRange")?
201 }
202 })
203 }
204}
205
206impl ::re_byte_size::SizeBytes for TimeRange {
207 #[inline]
208 fn heap_size_bytes(&self) -> u64 {
209 self.start.heap_size_bytes() + self.end.heap_size_bytes()
210 }
211
212 #[inline]
213 fn is_pod() -> bool {
214 <crate::datatypes::TimeRangeBoundary>::is_pod()
215 && <crate::datatypes::TimeRangeBoundary>::is_pod()
216 }
217}