Skip to content

Commit 1ccfc22

Browse files
refactor, address review
1 parent 9673684 commit 1ccfc22

3 files changed

Lines changed: 27 additions & 28 deletions

File tree

pyiceberg/catalog/sql.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -618,17 +618,18 @@ def list_namespaces(self, namespace: Union[str, Identifier] = ()) -> List[Identi
618618
namespace_stmt,
619619
)
620620
with Session(self.engine) as session:
621-
namespaces = [Catalog.identifier_to_tuple(namespace_col) for namespace_col in session.execute(stmt).scalars()]
622-
sub_namespaces_level_length = len(Catalog.identifier_to_tuple(namespace)) + 1 if namespace else 1
623-
624-
# only get sub namespaces/children
625-
namespaces = list({ns[:sub_namespaces_level_length] for ns in namespaces if len(ns) >= sub_namespaces_level_length})
626-
627-
if namespace:
628-
namespace_tuple = Catalog.identifier_to_tuple(namespace)
629-
namespace_level_length = len(namespace_tuple)
630-
# exclude fuzzy matches when `namespace` contains `%` or `_`
631-
namespaces = [ns for ns in namespaces if ns[:namespace_level_length] == namespace_tuple]
621+
namespace_tuple = Catalog.identifier_to_tuple(namespace)
622+
sub_namespaces_level_length = len(namespace_tuple) + 1
623+
624+
namespaces = list(
625+
{ # only get distinct namespaces
626+
ns[:sub_namespaces_level_length] # truncate to the required level
627+
for ns in {Catalog.identifier_to_tuple(ns) for ns in session.execute(stmt).scalars()}
628+
if len(ns) >= sub_namespaces_level_length # only get sub namespaces/children
629+
and ns[: sub_namespaces_level_length - 1] == namespace_tuple
630+
# exclude fuzzy matches when `namespace` contains `%` or `_`
631+
}
632+
)
632633

633634
return namespaces
634635

tests/catalog/test_base.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ def test_rename_table(catalog: InMemoryCatalog) -> None:
312312
assert table._identifier == Catalog.identifier_to_tuple(new_table)
313313

314314
# And
315-
assert ("new",) in catalog.list_namespaces()
315+
assert catalog._namespace_exists(table._identifier[:-1])
316316

317317
# And
318318
with pytest.raises(NoSuchTableError, match=NO_SUCH_TABLE_ERROR):
@@ -336,7 +336,7 @@ def test_rename_table_from_self_identifier(catalog: InMemoryCatalog) -> None:
336336
assert new_table._identifier == Catalog.identifier_to_tuple(new_table_name)
337337

338338
# And
339-
assert ("new",) in catalog.list_namespaces()
339+
assert catalog._namespace_exists(new_table._identifier[:-1])
340340

341341
# And
342342
with pytest.raises(NoSuchTableError, match=NO_SUCH_TABLE_ERROR):
@@ -350,7 +350,7 @@ def test_create_namespace(catalog: InMemoryCatalog) -> None:
350350
catalog.create_namespace(TEST_TABLE_NAMESPACE, TEST_TABLE_PROPERTIES)
351351

352352
# Then
353-
assert TEST_TABLE_NAMESPACE[:1] in catalog.list_namespaces()
353+
assert catalog._namespace_exists(TEST_TABLE_NAMESPACE)
354354
assert TEST_TABLE_PROPERTIES == catalog.load_namespace_properties(TEST_TABLE_NAMESPACE)
355355

356356

@@ -375,14 +375,19 @@ def test_list_namespaces(catalog: InMemoryCatalog) -> None:
375375
# Then
376376
assert TEST_TABLE_NAMESPACE[:1] in namespaces
377377

378+
# When
379+
namespaces = catalog.list_namespaces(TEST_TABLE_NAMESPACE)
380+
# Then
381+
assert not namespaces
382+
378383

379384
def test_drop_namespace(catalog: InMemoryCatalog) -> None:
380385
# Given
381386
catalog.create_namespace(TEST_TABLE_NAMESPACE, TEST_TABLE_PROPERTIES)
382387
# When
383388
catalog.drop_namespace(TEST_TABLE_NAMESPACE)
384389
# Then
385-
assert TEST_TABLE_NAMESPACE[:1] not in catalog.list_namespaces()
390+
assert not catalog._namespace_exists(TEST_TABLE_NAMESPACE)
386391

387392

388393
def test_drop_namespace_raises_error_when_namespace_does_not_exist(catalog: InMemoryCatalog) -> None:
@@ -431,7 +436,7 @@ def test_update_namespace_metadata(catalog: InMemoryCatalog) -> None:
431436
summary = catalog.update_namespace_properties(TEST_TABLE_NAMESPACE, updates=new_metadata)
432437

433438
# Then
434-
assert TEST_TABLE_NAMESPACE[:1] in catalog.list_namespaces()
439+
assert catalog._namespace_exists(TEST_TABLE_NAMESPACE)
435440
assert new_metadata.items() <= catalog.load_namespace_properties(TEST_TABLE_NAMESPACE).items()
436441
assert summary.removed == []
437442
assert sorted(summary.updated) == ["key3", "key4"]
@@ -448,7 +453,7 @@ def test_update_namespace_metadata_removals(catalog: InMemoryCatalog) -> None:
448453
summary = catalog.update_namespace_properties(TEST_TABLE_NAMESPACE, remove_metadata, new_metadata)
449454

450455
# Then
451-
assert TEST_TABLE_NAMESPACE[:1] in catalog.list_namespaces()
456+
assert catalog._namespace_exists(TEST_TABLE_NAMESPACE)
452457
assert new_metadata.items() <= catalog.load_namespace_properties(TEST_TABLE_NAMESPACE).items()
453458
assert remove_metadata.isdisjoint(catalog.load_namespace_properties(TEST_TABLE_NAMESPACE).keys())
454459
assert summary.removed == ["key1"]

tests/catalog/test_sql.py

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1118,26 +1118,19 @@ def test_create_namespace_with_empty_identifier(catalog: SqlCatalog, empty_names
11181118
],
11191119
)
11201120
def test_list_namespaces(catalog: SqlCatalog) -> None:
1121-
namespace_list = ["db", "db.ns1", "db.ns1.ns2", "db.ns2", "db2", "db2.ns1", "db%"]
1121+
namespace_list = ["db", "db.ns1", "db.ns1.ns2", "db.ns2", "db2", "db2.ns1", "db%", "db.ns1X.ns3"]
11221122
for namespace in namespace_list:
11231123
catalog.create_namespace(namespace)
11241124

11251125
ns_list = catalog.list_namespaces()
1126-
expected_list: list[tuple[str, ...]] = [("db",), ("db2",), ("db%",)]
1127-
for ns in expected_list:
1126+
for ns in [("db",), ("db%",), ("db2",)]:
11281127
assert ns in ns_list
11291128

11301129
ns_list = catalog.list_namespaces("db")
1131-
expected_list = [("db", "ns1"), ("db", "ns2")]
1132-
assert len(ns_list) == len(expected_list)
1133-
for ns in expected_list:
1134-
assert ns in ns_list
1130+
assert sorted(ns_list) == [("db", "ns1"), ("db", "ns1X"), ("db", "ns2")]
11351131

11361132
ns_list = catalog.list_namespaces("db.ns1")
1137-
expected_list = [("db", "ns1", "ns2")]
1138-
assert len(ns_list) == len(expected_list)
1139-
for ns in expected_list:
1140-
assert ns in ns_list
1133+
assert sorted(ns_list) == [("db", "ns1", "ns2")]
11411134

11421135
ns_list = catalog.list_namespaces("db.ns1.ns2")
11431136
assert len(ns_list) == 0

0 commit comments

Comments
 (0)