From 57cc104c0aedfe706f153dbe90d0bf3ca86ac62a Mon Sep 17 00:00:00 2001 From: Mike Schmidt Date: Wed, 17 Jan 2024 14:55:41 -0700 Subject: [PATCH] fix: Fixed error when appending to boolean columns. Addresses #161 by adding match for allow appending booleans to any boolean categorical column inside `maybe_add_category`. --- lace/src/interface/engine/data.rs | 69 ++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/lace/src/interface/engine/data.rs b/lace/src/interface/engine/data.rs index 2b70ab41..7ae5d846 100644 --- a/lace/src/interface/engine/data.rs +++ b/lace/src/interface/engine/data.rs @@ -755,7 +755,10 @@ pub(crate) fn maybe_add_categories( } Ok(()) }, - (Datum::Missing, _) => Ok(()), + (Datum::Missing, _) | + (Datum::Categorical(Category::Bool(_)), ValueMap::Bool) => { + Ok(()) + }, _ => { Err( InsertDataError::DatumIncompatibleWithColumn { @@ -1064,9 +1067,13 @@ pub(crate) fn check_if_removes_row( #[cfg(test)] mod tests { + use crate::data::data_source; + use super::*; use lace_codebook::{ColMetadata, ColType, ValueMap}; + use lace_stats::prior::csd::CsdHyper; + use rand::SeedableRng; #[cfg(feature = "examples")] mod requiring_examples { @@ -1696,4 +1703,64 @@ mod tests { _ => panic!("should've been categorical with valmap"), }; } + + #[test] + fn append_bool() { + let coltype = ColType::Categorical { + k: 2, + hyper: Some(CsdHyper::default()), + prior: None, + value_map: ValueMap::Bool, + }; + let md0 = ColMetadata { + name: "bool_col".to_string(), + coltype: coltype.clone(), + notes: None, + missing_not_at_random: false, + }; + + let mut engine = Engine::new( + 1, + Codebook::new( + "test".to_string(), + ColMetadataList::new(vec![]).unwrap(), + ), + data_source::DataSource::Empty, + 0, + rand_xoshiro::Xoshiro256Plus::seed_from_u64(0x1234), + ) + .unwrap(); + + // Insert once with specific metadata. + engine + .insert_data( + vec![( + "abc", + vec![( + "bool_col", + Datum::Categorical(Category::Bool(false)), + )], + ) + .into()], + Some(ColMetadataList::new(vec![md0]).unwrap()), + WriteMode::unrestricted(), + ) + .unwrap(); + + // Insert again without metadata for the bool column. + engine + .insert_data( + vec![( + "def", + vec![( + "bool_col", + Datum::Categorical(Category::Bool(false)), + )], + ) + .into()], + None, + WriteMode::unrestricted(), + ) + .unwrap(); + } }