diff --git a/src/datatypes/src/series/histogram/tests.rs b/src/datatypes/src/series/histogram/tests.rs index c81daef0270..f6b2b1f8c79 100644 --- a/src/datatypes/src/series/histogram/tests.rs +++ b/src/datatypes/src/series/histogram/tests.rs @@ -218,7 +218,7 @@ fn rejects_wrong_schema_type_order_and_nullability() { } #[test] -fn rejects_parent_and_list_item_nulls() { +fn rejects_parent_nulls_and_nullable_list_item_schema() { let b = batch(); let source = b.as_arrow(); let parent = StructArray::try_new( @@ -244,25 +244,10 @@ fn rejects_parent_and_list_item_nulls() { .as_any() .downcast_ref::() .unwrap(); - let mut null_bits = vec![true; values.len()]; - null_bits[1] = false; - let nullable = Float64Array::new( - values.values().clone(), - Some(arrow::buffer::NullBuffer::from(null_bits)), - ); - assert!( - ListArray::try_new( - Arc::new(Field::new("item", DataType::Float64, false)), - list.offsets().clone(), - Arc::new(nullable.clone()), - None, - ) - .is_err() - ); let rebuilt = ListArray::try_new( Arc::new(Field::new("item", DataType::Float64, true)), list.offsets().clone(), - Arc::new(nullable), + Arc::new(values.clone()), None, ) .unwrap(); diff --git a/src/datatypes/src/series/samples/tests.rs b/src/datatypes/src/series/samples/tests.rs index 0cbbd95abce..75f4bca75cb 100644 --- a/src/datatypes/src/series/samples/tests.rs +++ b/src/datatypes/src/series/samples/tests.rs @@ -321,25 +321,27 @@ fn densifying_histogram_and_mixed_chunks_keeps_shared_table() { } #[test] -fn densification_falls_back_for_distinct_shared_table_owners() { +fn densification_preserves_distinct_shared_table_owner_values() { let first = batch(2.0, 3.0, &[4.0, 5.0]); - let second = Arc::new(HistogramBatch::try_from_arrow(first.as_arrow().clone()).unwrap()); + let second = batch(6.0, 7.0, &[8.0, 9.0]); - for (owners, expected_indices) in [ - (vec![first.clone(), second.clone()], vec![0, 1]), - ( - vec![first.clone(), first.clone(), second.clone()], - vec![0, 1, 2], - ), + for owners in [ + vec![first.clone(), second.clone()], + vec![first.clone(), first.clone(), second.clone()], ] { let expected: Vec<_> = owners .iter() - .map(|owner| SampleRef::Histogram(owner.view(0).unwrap())) + .flat_map(|owner| { + [ + SampleRef::Missing, + SampleRef::Histogram(owner.view(0).unwrap()), + ] + }) .collect(); let chunks = owners .iter() .map(|owner| { - Samples::try_from_histogram(UInt32Array::from(vec![Some(0)]), owner.clone()) + Samples::try_from_histogram(UInt32Array::from(vec![None, Some(0)]), owner.clone()) .unwrap() }) .collect(); @@ -348,18 +350,18 @@ fn densification_falls_back_for_distinct_shared_table_owners() { .into_dense() .unwrap(); - assert_eq!(dense.len(), owners.len()); + assert_eq!(dense.len(), expected.len()); let DenseSamplesRef::Histogram(values) = dense.dense().unwrap() else { panic!() }; - assert_eq!(values.batch().len(), owners.len()); - assert!(!Arc::ptr_eq(values.batch(), &first)); - assert!(!Arc::ptr_eq(values.batch(), &second)); - for (index, (expected, expected_index)) in - expected.into_iter().zip(expected_indices).enumerate() - { - assert_eq!(values.indices().value(index), expected_index); - assert!(same_sample(expected, dense.sample(index))); + for (index, expected) in expected.into_iter().enumerate() { + if !values.indices().is_null(index) { + assert!((values.indices().value(index) as usize) < values.batch().len()); + } + assert!( + same_sample(expected, dense.sample(index)), + "position {index}" + ); } } } @@ -960,20 +962,4 @@ fn short_multifield_series_uses_its_grid_range_and_checks_explicit_chunk_order() ) .is_err() ); - - let unordered_single = TimeAxis::Explicit(ScalarBuffer::from(vec![2_i64, 1])); - assert!( - Series::try_new( - &SeriesSchema { - fields: Arc::from([FieldSpec { - name: Arc::from("value") - }]), - eval_grid: None - }, - MetricName::try_new(None, vec![]).unwrap(), - unordered_single, - SeriesFields::one(Samples::from_float(Float64Array::from(vec![1.0, 2.0]))), - ) - .is_err() - ); }