|
2 | 2 | import random |
3 | 3 |
|
4 | 4 | import numpy as np |
| 5 | +import pytest |
5 | 6 | from numpy.testing import assert_array_equal |
6 | 7 |
|
7 | 8 | import tiledb |
@@ -157,3 +158,31 @@ def test_import_buffer(self): |
157 | 158 | self.assertTrue("foo" in r) |
158 | 159 | self.assertTrue("str" not in r) |
159 | 160 | del q |
| 161 | + |
| 162 | + def test_nullable_arrow_buffer(self): |
| 163 | + # BufferHolder must hold reference to converted bitmap, not original. |
| 164 | + # Corrupted validity buffer causes wrong null positions in .to_pandas(). |
| 165 | + pyarrow = pytest.importorskip("pyarrow") |
| 166 | + |
| 167 | + def _read_arrow(self, uri): |
| 168 | + with tiledb.open(uri, "r") as A: |
| 169 | + q = core.PyQuery(A.ctx, A, ("a",), (), 0, True) |
| 170 | + sub = tiledb.Subarray(A) |
| 171 | + sub.add_dim_range(0, (0, 4)) |
| 172 | + q.set_subarray(sub) |
| 173 | + q.submit() |
| 174 | + return q._buffers_to_pa_table() |
| 175 | + |
| 176 | + uri = self.path("test_nullable_arrow_buffer") |
| 177 | + dom = tiledb.Domain(tiledb.Dim("d", domain=(0, 4), tile=1, dtype=np.uint64)) |
| 178 | + attr = tiledb.Attr("a", dtype="ascii", var=True, nullable=True) |
| 179 | + tiledb.Array.create( |
| 180 | + uri, tiledb.ArraySchema(domain=dom, attrs=[attr], sparse=True) |
| 181 | + ) |
| 182 | + |
| 183 | + with tiledb.open(uri, "w") as A: |
| 184 | + A[np.arange(5)] = {"a": pyarrow.array(["x", "y", None, None, ""])} |
| 185 | + |
| 186 | + df = self._read_arrow(uri).to_pandas() |
| 187 | + |
| 188 | + assert df["a"].isna().tolist() == [False, False, True, True, False] |
0 commit comments