@@ -1816,6 +1816,97 @@ TEST(ArrayTest, ArrayViewTestBasic) {
1816
1816
ArrowArrayViewReset (&array_view);
1817
1817
}
1818
1818
1819
+ TEST (ArrayTest, ArrayViewTestComputeNullCount) {
1820
+ struct ArrowError error;
1821
+
1822
+ int32_t values[] = {17 , 87 , 23 , 53 };
1823
+ uint8_t all_valid = 0b1111'1111 ;
1824
+ uint8_t all_null = 0b0000'0000 ;
1825
+ uint8_t half_valid = 0b1010'1010 ;
1826
+ uint8_t * all_valid_because_missing = nullptr ;
1827
+
1828
+ const void * buffers[2 ];
1829
+ buffers[1 ] = values;
1830
+
1831
+ nanoarrow::UniqueArray array;
1832
+ array->length = 4 ;
1833
+ array->offset = 0 ;
1834
+ array->n_buffers = 2 ;
1835
+ array->n_children = 0 ;
1836
+ array->buffers = buffers;
1837
+ array->children = nullptr ;
1838
+ array->dictionary = nullptr ;
1839
+ array->release = [](struct ArrowArray *) {};
1840
+
1841
+ for (auto [buffer, null_count] : {
1842
+ std::pair{&all_valid, int64_t (0 )},
1843
+ std::pair{&all_null, array->length },
1844
+ std::pair{&half_valid, array->length / 2 },
1845
+ std::pair{all_valid_because_missing, int64_t (0 )},
1846
+ }) {
1847
+ array->null_count = null_count;
1848
+ buffers[0 ] = buffer;
1849
+ nanoarrow::UniqueArrayView array_view;
1850
+ ArrowArrayViewInitFromType (array_view.get (), NANOARROW_TYPE_INT32);
1851
+ EXPECT_EQ (ArrowArrayViewSetArray (array_view.get (), array.get (), &error), NANOARROW_OK)
1852
+ << error.message ;
1853
+ EXPECT_EQ (ArrowArrayViewComputeNullCount (array_view.get ()), null_count);
1854
+ }
1855
+
1856
+ array->length = 0 ;
1857
+ array->null_count = 0 ;
1858
+ buffers[0 ] = &all_null;
1859
+ nanoarrow::UniqueArrayView array_view;
1860
+ ArrowArrayViewInitFromType (array_view.get (), NANOARROW_TYPE_INT32);
1861
+ EXPECT_EQ (ArrowArrayViewSetArray (array_view.get (), array.get (), &error), NANOARROW_OK)
1862
+ << error.message ;
1863
+ EXPECT_EQ (ArrowArrayViewComputeNullCount (array_view.get ()), 0 );
1864
+ }
1865
+
1866
+ TEST (ArrayTest, ArrayViewTestComputeNullCountUnion) {
1867
+ struct ArrowError error;
1868
+
1869
+ // Build a simple union with one int and one string
1870
+ nanoarrow::UniqueSchema schema;
1871
+ ArrowSchemaInit (schema.get ());
1872
+ ASSERT_EQ (ArrowSchemaSetTypeUnion (schema.get (), NANOARROW_TYPE_DENSE_UNION, 2 ),
1873
+ NANOARROW_OK);
1874
+ ASSERT_EQ (ArrowSchemaSetType (schema->children [0 ], NANOARROW_TYPE_INT32), NANOARROW_OK);
1875
+ ASSERT_EQ (ArrowSchemaSetType (schema->children [1 ], NANOARROW_TYPE_STRING), NANOARROW_OK);
1876
+
1877
+ nanoarrow::UniqueArray array;
1878
+ ASSERT_EQ (ArrowArrayInitFromSchema (array.get (), schema.get (), &error), NANOARROW_OK);
1879
+ ASSERT_EQ (ArrowArrayStartAppending (array.get ()), NANOARROW_OK);
1880
+ ASSERT_EQ (ArrowArrayAppendNull (array->children [0 ], 1 ), NANOARROW_OK);
1881
+ ASSERT_EQ (ArrowArrayFinishUnionElement (array.get (), 0 ), NANOARROW_OK);
1882
+ ASSERT_EQ (ArrowArrayAppendNull (array->children [1 ], 1 ), NANOARROW_OK);
1883
+ ASSERT_EQ (ArrowArrayFinishUnionElement (array.get (), 1 ), NANOARROW_OK);
1884
+ ASSERT_EQ (ArrowArrayFinishBuildingDefault (array.get (), &error), NANOARROW_OK);
1885
+
1886
+ nanoarrow::UniqueArrayView array_view;
1887
+ ASSERT_EQ (ArrowArrayViewInitFromSchema (array_view.get (), schema.get (), &error),
1888
+ NANOARROW_OK);
1889
+ ASSERT_EQ (ArrowArrayViewSetArray (array_view.get (), array.get (), &error), NANOARROW_OK);
1890
+ EXPECT_EQ (ArrowArrayViewComputeNullCount (array_view.get ()), 0 );
1891
+ }
1892
+
1893
+ TEST (ArrayTest, ArrayViewTestComputeNullCountNull) {
1894
+ struct ArrowError error;
1895
+ nanoarrow::UniqueArray array;
1896
+ ASSERT_EQ (ArrowArrayInitFromType (array.get (), NANOARROW_TYPE_NA), NANOARROW_OK);
1897
+
1898
+ EXPECT_EQ (ArrowArrayStartAppending (array.get ()), NANOARROW_OK);
1899
+ EXPECT_EQ (ArrowArrayAppendNull (array.get (), 11 ), NANOARROW_OK);
1900
+ EXPECT_EQ (ArrowArrayAppendNull (array.get (), 42 ), NANOARROW_OK);
1901
+ EXPECT_EQ (ArrowArrayFinishBuildingDefault (array.get (), &error), NANOARROW_OK)
1902
+ << error.message ;
1903
+
1904
+ nanoarrow::UniqueArrayView array_view;
1905
+ ArrowArrayViewInitFromType (array_view.get (), NANOARROW_TYPE_NA);
1906
+ ASSERT_EQ (ArrowArrayViewSetArray (array_view.get (), array.get (), &error), NANOARROW_OK);
1907
+ EXPECT_EQ (ArrowArrayViewComputeNullCount (array_view.get ()), 53 );
1908
+ }
1909
+
1819
1910
TEST (ArrayTest, ArrayViewTestMove) {
1820
1911
struct ArrowArrayView array_view;
1821
1912
ArrowArrayViewInitFromType (&array_view, NANOARROW_TYPE_STRING);
@@ -2407,7 +2498,7 @@ TEST(ArrayTest, ArrayViewTestUnionChildIndices) {
2407
2498
ASSERT_EQ (ArrowArrayFinishUnionElement (&array, 1 ), NANOARROW_OK);
2408
2499
ASSERT_EQ (ArrowArrayFinishBuildingDefault (&array, nullptr ), NANOARROW_OK);
2409
2500
2410
- // The ArrayView for a union could in theroy be created without a schema.
2501
+ // The ArrayView for a union could in theory be created without a schema.
2411
2502
// Currently FULL validation will fail here since we can't guarantee that
2412
2503
// these are valid.
2413
2504
ArrowArrayViewInitFromType (&array_view, NANOARROW_TYPE_DENSE_UNION);
0 commit comments