Skip to content

Commit 5145108

Browse files
committed
Dense Arrays With Negative Domains Can Only Use Full Indexer
1 parent 656f54f commit 5145108

File tree

2 files changed

+68
-0
lines changed

2 files changed

+68
-0
lines changed

tiledb/libtiledb.pyx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2103,6 +2103,12 @@ cdef class DenseArrayImpl(Array):
21032103
attr_names.extend(self.schema.attr(a).name for a in attrs)
21042104

21052105
selection = index_as_tuple(selection)
2106+
2107+
for dim, sel in zip(self.schema.domain, selection):
2108+
if dim.domain[0] < 0 and sel != slice(None, None, None):
2109+
raise TileDBError("Must use full indexer for arrays containing "
2110+
"dimensions with negative integers.")
2111+
21062112
idx = replace_ellipsis(self.schema.domain.ndim, selection)
21072113
idx, drop_axes = replace_scalars_slice(self.schema.domain, idx)
21082114
dim_ranges = index_domain_subarray(self, self.schema.domain, idx)
@@ -2246,6 +2252,11 @@ cdef class DenseArrayImpl(Array):
22462252
from .subarray import Subarray
22472253
if not self.isopen or self.mode != 'w':
22482254
raise TileDBError("DenseArray is not opened for writing")
2255+
2256+
for dim, sel in zip(self.schema.domain, index_as_tuple(selection)):
2257+
if dim.domain[0] < 0 and sel != slice(None, None, None):
2258+
raise TileDBError("Must use full indexer for arrays containing "
2259+
"dimensions with signed integers.")
22492260

22502261
domain = self.domain
22512262
cdef tuple idx = replace_ellipsis(domain.ndim, index_as_tuple(selection))

tiledb/tests/test_libtiledb.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2492,6 +2492,63 @@ def test_index_2d(self):
24922492
with self.assertRaises(IndexError):
24932493
T[idx]
24942494

2495+
def test_dense_array_with_negative_domain(self):
2496+
path = self.path("test_dense_array_with_negative_domain")
2497+
attr = tiledb.Attr(dtype=np.uint8)
2498+
dom = tiledb.Domain(tiledb.Dim("X", domain=(-10, 10), dtype=np.int64))
2499+
schema = tiledb.ArraySchema(domain=dom, sparse=False, attrs=[attr])
2500+
tiledb.Array.create(path, schema)
2501+
data = np.random.randint(10, size=21)
2502+
2503+
with tiledb.open(path, "w") as A:
2504+
with pytest.raises(tiledb.TileDBError):
2505+
A[-5:5] = np.random.randint(10, size=11)
2506+
with pytest.raises(tiledb.TileDBError):
2507+
A[:0] = np.random.randint(10, size=11)
2508+
with pytest.raises(tiledb.TileDBError):
2509+
A[0:] = np.random.randint(10, size=11)
2510+
with pytest.raises(tiledb.TileDBError):
2511+
A[0] = np.random.randint(10, size=1)
2512+
A[:] = data
2513+
2514+
with tiledb.open(path, "r") as A:
2515+
with pytest.raises(tiledb.TileDBError):
2516+
A[-5:5]
2517+
with pytest.raises(tiledb.TileDBError):
2518+
A[:0]
2519+
with pytest.raises(tiledb.TileDBError):
2520+
A[0:]
2521+
with pytest.raises(tiledb.TileDBError):
2522+
A[0]
2523+
assert_array_equal(A[:], data[:])
2524+
2525+
def test_dense_array_with_2d_negative_domain(self):
2526+
path = self.path("test_dense_array_with_2d_negative_domain")
2527+
attr = tiledb.Attr(dtype=np.uint8)
2528+
dim1 = tiledb.Dim("X", domain=(-10, 10), dtype=np.int64)
2529+
dim2 = tiledb.Dim("Y", domain=(0, 10), dtype=np.int64)
2530+
dom = tiledb.Domain(dim1, dim2)
2531+
schema = tiledb.ArraySchema(domain=dom, sparse=False, attrs=[attr])
2532+
tiledb.Array.create(path, schema)
2533+
data = np.random.randint(10, size=(21,11))
2534+
2535+
with tiledb.open(path, "w") as A:
2536+
with pytest.raises(tiledb.TileDBError):
2537+
A[:,-5:5] = np.random.randint(10, size=11)
2538+
with pytest.raises(tiledb.TileDBError):
2539+
A[:0, :] = np.random.randint(10, size=11)
2540+
with pytest.raises(tiledb.TileDBError):
2541+
A[0] = np.random.randint(10, size=1)
2542+
A[:] = data
2543+
2544+
with tiledb.open(path, "r") as A:
2545+
with pytest.raises(tiledb.TileDBError):
2546+
A[:,-5:5]
2547+
with pytest.raises(tiledb.TileDBError):
2548+
A[:0, :]
2549+
with pytest.raises(tiledb.TileDBError):
2550+
A[0]
2551+
assert_array_equal(A[:], data[:])
24952552

24962553
class TestDatetimeSlicing(DiskTestCase):
24972554
def test_dense_datetime_vector(self):

0 commit comments

Comments
 (0)