diff --git a/crates/build/re_types_builder/src/codegen/rust/api.rs b/crates/build/re_types_builder/src/codegen/rust/api.rs index 525385ec75c8..01c780029a1f 100644 --- a/crates/build/re_types_builder/src/codegen/rust/api.rs +++ b/crates/build/re_types_builder/src/codegen/rust/api.rs @@ -1959,11 +1959,22 @@ fn quote_builder_from_obj(reporter: &Reporter, objects: &Objects, obj: &Object) "); let columns_doc = quote_doc_lines(&columns_doc.lines().map(|l| l.to_owned()).collect_vec()); + let has_indicator = obj.fqname.as_str() != "rerun.archetypes.Scalar"; + + let num_fields = required.iter().chain(optional.iter()).count(); let fields = required.iter().chain(optional.iter()).map(|field| { let field_name = format_ident!("{}", field.name); - quote!(self.#field_name.map(|#field_name| #field_name.partitioned(_lengths.clone())).transpose()?) + let clone = if num_fields == 1 && !has_indicator { quote!(.into_iter()) } else { quote!(.clone()) }; + quote!(self.#field_name.map(|#field_name| #field_name.partitioned(_lengths #clone)).transpose()?) }); + let indicator_column = if !has_indicator { + // NOTE(#8768): Scalar indicators are extremely wasteful, and not actually used for anything. + quote!(None) + } else { + quote!(::re_types_core::indicator_column::(_lengths.into_iter().count())?) + }; + quote! { #columns_doc #[inline] @@ -1975,7 +1986,7 @@ fn quote_builder_from_obj(reporter: &Reporter, objects: &Objects, obj: &Object) I: IntoIterator + Clone, { let columns = [ #(#fields),* ]; - let indicator_column = ::re_types_core::indicator_column::(_lengths.into_iter().count())?; + let indicator_column = #indicator_column; Ok(columns.into_iter().chain([indicator_column]).flatten()) } } diff --git a/crates/store/re_types/src/archetypes/scalar.rs b/crates/store/re_types/src/archetypes/scalar.rs index c3b501249029..136d389ebfa1 100644 --- a/crates/store/re_types/src/archetypes/scalar.rs +++ b/crates/store/re_types/src/archetypes/scalar.rs @@ -71,8 +71,7 @@ use ::re_types_core::{DeserializationError, DeserializationResult}; /// [times], /// rerun::Scalar::update_fields() /// .with_many_scalar(scalars) -/// .columns(std::iter::repeat(1).take(STEPS as _))? -/// .filter(|column| !column.descriptor.component_name.contains("Indicator")), +/// .columns(std::iter::repeat(1).take(STEPS as _))?, /// )?; /// /// Ok(()) @@ -248,10 +247,9 @@ impl Scalar { { let columns = [self .scalar - .map(|scalar| scalar.partitioned(_lengths.clone())) + .map(|scalar| scalar.partitioned(_lengths.into_iter())) .transpose()?]; - let indicator_column = - ::re_types_core::indicator_column::(_lengths.into_iter().count())?; + let indicator_column = None; Ok(columns.into_iter().chain([indicator_column]).flatten()) } diff --git a/docs/snippets/all/archetypes/scalar_send_columns.rs b/docs/snippets/all/archetypes/scalar_send_columns.rs index 3836fa31f8ec..dedab32dd545 100644 --- a/docs/snippets/all/archetypes/scalar_send_columns.rs +++ b/docs/snippets/all/archetypes/scalar_send_columns.rs @@ -15,8 +15,7 @@ fn main() -> Result<(), Box> { [times], rerun::Scalar::update_fields() .with_many_scalar(scalars) - .columns(std::iter::repeat(1).take(STEPS as _))? - .filter(|column| !column.descriptor.component_name.contains("Indicator")), + .columns(std::iter::repeat(1).take(STEPS as _))?, )?; Ok(())