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