Skip to content

Commit a355893

Browse files
authored
Use safe repr if ArraySchema was not properly constructed (#1896)
* Use safe repr if ArraySchema was not properly constructed
1 parent 7f0598e commit a355893

File tree

8 files changed

+69
-24
lines changed

8 files changed

+69
-24
lines changed

tiledb/array_schema.py

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,25 @@
1313
from .domain import Domain
1414
from .filter import Filter, FilterList
1515

16+
_tiledb_order_to_string = {
17+
lt.LayoutType.ROW_MAJOR: "row-major",
18+
lt.LayoutType.COL_MAJOR: "col-major",
19+
lt.LayoutType.GLOBAL_ORDER: "global",
20+
lt.LayoutType.UNORDERED: "unordered",
21+
lt.LayoutType.HILBERT: "hilbert",
22+
}
23+
24+
_string_to_tiledb_order = {v: k for k, v in _tiledb_order_to_string.items()}
25+
_string_to_tiledb_order.update(
26+
{
27+
"C": lt.LayoutType.ROW_MAJOR,
28+
"R": lt.LayoutType.COL_MAJOR,
29+
"H": lt.LayoutType.HILBERT,
30+
"U": lt.LayoutType.UNORDERED,
31+
None: lt.LayoutType.ROW_MAJOR, # default (fixed in SC-27374)
32+
}
33+
)
34+
1635

1736
class ArraySchema(CtxMixin, lt.ArraySchema):
1837
"""
@@ -68,12 +87,14 @@ def __init__(
6887
)
6988
self._add_attr(att)
7089

71-
self._cell_order = _string_to_tiledb_order.get(cell_order)
72-
if self._cell_order is None:
90+
try:
91+
self._cell_order = _string_to_tiledb_order.get(cell_order)
92+
except (TypeError, ValueError):
7393
raise ValueError(f"unknown tiledb layout: {cell_order}")
7494

75-
self._tile_order = _string_to_tiledb_order.get(tile_order)
76-
if self._tile_order is None:
95+
try:
96+
self._tile_order = _string_to_tiledb_order.get(tile_order)
97+
except (TypeError, ValueError):
7798
raise ValueError(f"unknown tiledb layout: {tile_order}")
7899

79100
if capacity > 0:
@@ -384,6 +405,16 @@ def dump(self):
384405
print(self._dump(), "\n")
385406

386407
def __repr__(self):
408+
# use safe repr if pybind11 constructor failed or the array schema did
409+
# not construct properly
410+
try:
411+
self._check()
412+
except lt.TileDBError:
413+
return object.__repr__(self)
414+
415+
if self._ctx is None:
416+
return object.__repr__(self)
417+
387418
# TODO support/use __qualname__
388419
output = io.StringIO()
389420
output.write("ArraySchema(\n")
@@ -454,23 +485,3 @@ def _repr_html_(self):
454485
output.write("</table>")
455486

456487
return output.getvalue()
457-
458-
459-
_tiledb_order_to_string = {
460-
lt.LayoutType.ROW_MAJOR: "row-major",
461-
lt.LayoutType.COL_MAJOR: "col-major",
462-
lt.LayoutType.GLOBAL_ORDER: "global",
463-
lt.LayoutType.UNORDERED: "unordered",
464-
lt.LayoutType.HILBERT: "hilbert",
465-
}
466-
467-
_string_to_tiledb_order = {v: k for k, v in _tiledb_order_to_string.items()}
468-
_string_to_tiledb_order.update(
469-
{
470-
"C": lt.LayoutType.ROW_MAJOR,
471-
"R": lt.LayoutType.COL_MAJOR,
472-
"H": lt.LayoutType.HILBERT,
473-
"U": lt.LayoutType.UNORDERED,
474-
None: lt.LayoutType.ROW_MAJOR, # default (fixed in SC-27374)
475-
}
476-
)

tiledb/attribute.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,10 @@ def enum_label(self):
259259
return self._get_enumeration_name(self._ctx)
260260

261261
def __repr__(self):
262+
# use safe repr if pybind11 constructor failed
263+
if self._ctx is None:
264+
return object.__repr__(self)
265+
262266
filters_str = ""
263267
if self.filters:
264268
filters_str = ", filters=FilterList(["

tiledb/dimension.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,10 @@ def __init__(
8585
self._filters = FilterList(filters)
8686

8787
def __repr__(self) -> str:
88+
# use safe repr if pybind11 constructor failed
89+
if self._ctx is None:
90+
return object.__repr__(self)
91+
8892
filters_str = ""
8993
if self.filters:
9094
filters_str = ", filters=FilterList(["

tiledb/domain.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ def clone_dim_with_name(dim, name):
6464
self._add_dim(d)
6565

6666
def __repr__(self):
67+
# use safe repr if pybind11 constructor failed
68+
if self._ctx is None:
69+
return object.__repr__(self)
70+
6771
dims = ",\n ".join(repr(self.dim(i)) for i in range(self.ndim))
6872
return "Domain({0!s})".format(dims)
6973

tiledb/enumeration.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,10 @@ def __eq__(self, other):
127127
)
128128

129129
def __repr__(self):
130+
# use safe repr if pybind11 constructor failed
131+
if self._ctx is None:
132+
return object.__repr__(self)
133+
130134
return f"Enumeration(name='{self.name}', cell_val_num={self.cell_val_num}, ordered={self.ordered}, values={list(self.values())})"
131135

132136
def _repr_html_(self):

tiledb/filter.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ def __init__(self, type: lt.FilterOption, ctx: Optional[Ctx] = None):
1818
super().__init__(ctx, type)
1919

2020
def __repr__(self) -> str:
21+
# use safe repr if pybind11 constructor failed
22+
if self._ctx is None:
23+
return object.__repr__(self)
24+
2125
output = io.StringIO()
2226
output.write(f"{type(self).__name__}(")
2327
if hasattr(self, "_attrs_"):

tiledb/group.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,10 @@ def __iter__(self):
230230
yield key
231231

232232
def __repr__(self):
233+
# use safe repr if pybind11 constructor failed
234+
if self._ctx is None:
235+
return object.__repr__(self)
236+
233237
return str(dict(self._iter(keys_only=False)))
234238

235239
def setdefault(self, key, default=None):

tiledb/tests/test_array_schema.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,16 @@ def test_dense_array_schema_fp_domain_error(self):
7575
with self.assertRaises(tiledb.TileDBError):
7676
tiledb.ArraySchema(domain=dom, attrs=(att,))
7777

78+
def test_dense_array_schema_invalid_cell_and_tile_order(self):
79+
dom = tiledb.Domain(tiledb.Dim(domain=(1, 8), tile=2, dtype=np.float64))
80+
att = tiledb.Attr("val", dtype=np.float64)
81+
82+
with self.assertRaises(ValueError):
83+
tiledb.ArraySchema(domain=dom, attrs=(att,), cell_order="invalid")
84+
85+
with self.assertRaises(ValueError):
86+
tiledb.ArraySchema(domain=dom, attrs=(att,), tile_order="invalid")
87+
7888
def test_sparse_schema(self):
7989
# create dimensions
8090
d1 = tiledb.Dim("d1", domain=(1, 1000), tile=10, dtype="uint64")

0 commit comments

Comments
 (0)