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