Skip to content

Commit dc65c49

Browse files
committed
Rename indexes feat
1 parent ae2c132 commit dc65c49

File tree

5 files changed

+134
-0
lines changed

5 files changed

+134
-0
lines changed

tests/aio/test_table_client.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,55 @@ async def test_copy_table(self, driver: ydb.aio.Driver):
8989
copied_description = await client.describe_table(table_name + "_copy")
9090

9191
assert description.columns == copied_description.columns
92+
93+
94+
@pytest.mark.asyncio
95+
async def test_rename_index(self, driver: ydb.aio.Driver):
96+
client = driver.table_client
97+
table_name = "/local/testtableclient"
98+
try:
99+
await client.drop_table(table_name)
100+
except ydb.SchemeError:
101+
pass
102+
103+
description = (
104+
ydb.TableDescription()
105+
.with_primary_keys("key1", "key2")
106+
.with_columns(
107+
ydb.Column("key1", ydb.OptionalType(ydb.PrimitiveType.Uint64)),
108+
ydb.Column("key2", ydb.OptionalType(ydb.PrimitiveType.Uint64)),
109+
ydb.Column("value", ydb.OptionalType(ydb.PrimitiveType.Utf8)),
110+
)
111+
.with_index(
112+
ydb.TableIndex("index1").with_index_columns("key1")
113+
)
114+
.with_index(
115+
ydb.TableIndex("index2").with_index_columns("key1")
116+
)
117+
)
118+
119+
await client.create_table(table_name, description)
120+
121+
await client.alter_table(
122+
table_name,
123+
rename_indexes=[
124+
ydb.RenameIndexItem("index1", "index1_1")
125+
]
126+
)
127+
128+
description = await client.describe_table(table_name)
129+
names = [index.name for index in description.indexes]
130+
assert len(names) == 2
131+
for name in ["index1_1", "index2"]:
132+
assert name in names
133+
134+
await client.alter_table(
135+
table_name,
136+
rename_indexes=[
137+
ydb.RenameIndexItem("index1_1", "index2", replace_destination=True)
138+
]
139+
)
140+
141+
description = await client.describe_table(table_name)
142+
assert len(description.indexes) == 1
143+
assert description.indexes[0].name == "index2"

tests/table/test_table_client.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,3 +130,53 @@ def test_describe_table_creation_time(self, driver_sync: ydb.Driver):
130130
assert desc_after.table_stats is not None
131131

132132
assert desc_before.table_stats.creation_time == desc_after.table_stats.creation_time
133+
134+
def test_rename_index(self, driver_sync: ydb.Driver):
135+
client = driver_sync.table_client
136+
table_name = "/local/testtableclient"
137+
try:
138+
client.drop_table(table_name)
139+
except ydb.SchemeError:
140+
pass
141+
142+
description = (
143+
ydb.TableDescription()
144+
.with_primary_keys("key1", "key2")
145+
.with_columns(
146+
ydb.Column("key1", ydb.OptionalType(ydb.PrimitiveType.Uint64)),
147+
ydb.Column("key2", ydb.OptionalType(ydb.PrimitiveType.Uint64)),
148+
ydb.Column("value", ydb.OptionalType(ydb.PrimitiveType.Utf8)),
149+
)
150+
.with_index(
151+
ydb.TableIndex("index1").with_index_columns("key1")
152+
)
153+
.with_index(
154+
ydb.TableIndex("index2").with_index_columns("key1")
155+
)
156+
)
157+
158+
client.create_table(table_name, description)
159+
160+
client.alter_table(
161+
table_name,
162+
rename_indexes=[
163+
ydb.RenameIndexItem("index1", "index1_1")
164+
]
165+
)
166+
167+
description = client.describe_table(table_name)
168+
names = [index.name for index in description.indexes]
169+
assert len(names) == 2
170+
for name in ["index1_1", "index2"]:
171+
assert name in names
172+
173+
client.alter_table(
174+
table_name,
175+
rename_indexes=[
176+
ydb.RenameIndexItem("index1_1", "index2", replace_destination=True)
177+
]
178+
)
179+
180+
description = client.describe_table(table_name)
181+
assert len(description.indexes) == 1
182+
assert description.indexes[0].name == "index2"

ydb/_session_impl.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,7 @@ def alter_table_request_factory(
268268
alter_partitioning_settings,
269269
set_key_bloom_filter,
270270
set_read_replicas_settings,
271+
rename_indexes,
271272
):
272273
request = session_state.attach_request(_apis.ydb_table.AlterTableRequest(path=path))
273274
if add_columns is not None:
@@ -316,6 +317,10 @@ def alter_table_request_factory(
316317
if set_read_replicas_settings is not None:
317318
request.set_read_replicas_settings.MergeFrom(set_read_replicas_settings.to_pb())
318319

320+
if rename_indexes is not None:
321+
for rename_index in rename_indexes:
322+
request.rename_indexes.add().MergeFrom(rename_index.to_pb())
323+
319324
return request
320325

321326

ydb/aio/table.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ async def alter_table(
105105
alter_partitioning_settings=None,
106106
set_key_bloom_filter=None,
107107
set_read_replicas_settings=None,
108+
rename_indexes=None,
108109
): # pylint: disable=W0236,R0913,R0914
109110
return await super().alter_table(
110111
path,
@@ -123,6 +124,7 @@ async def alter_table(
123124
alter_partitioning_settings,
124125
set_key_bloom_filter,
125126
set_read_replicas_settings,
127+
rename_indexes,
126128
)
127129

128130
def transaction(self, tx_mode=None, *, allow_split_transactions=None):
@@ -250,6 +252,7 @@ async def alter_table(
250252
alter_partitioning_settings: Optional["ydb.PartitioningSettings"] = None,
251253
set_key_bloom_filter: Optional["ydb.FeatureFlag"] = None,
252254
set_read_replicas_settings: Optional["ydb.ReadReplicasSettings"] = None,
255+
rename_indexes: Optional[List["ydb.RenameIndexItem"]] = None,
253256
) -> "ydb.Operation":
254257
"""
255258
Alter a YDB table.
@@ -269,6 +272,7 @@ async def alter_table(
269272
:param set_compaction_policy: Compaction policy
270273
:param alter_partitioning_settings: ydb.PartitioningSettings to alter
271274
:param set_key_bloom_filter: ydb.FeatureFlag to set key bloom filter
275+
:param rename_indexes: List of ydb.RenameIndexItem to rename
272276
273277
:return: Operation or YDB error otherwise.
274278
"""
@@ -293,6 +297,7 @@ async def callee(session: Session):
293297
alter_partitioning_settings=alter_partitioning_settings,
294298
set_key_bloom_filter=set_key_bloom_filter,
295299
set_read_replicas_settings=set_read_replicas_settings,
300+
rename_indexes=rename_indexes,
296301
)
297302

298303
return await self._pool.retry_operation(callee)

ydb/table.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,20 @@ def to_pb(self):
327327
return self._pb
328328

329329

330+
class RenameIndexItem:
331+
def __init__(self, source_name: str, destination_name: str, replace_destination: bool = False):
332+
self._source_name = source_name
333+
self._destination_name = destination_name
334+
self._replace_destination = replace_destination
335+
336+
def to_pb(self):
337+
return _apis.ydb_table.RenameIndexItem(
338+
source_name=self._source_name,
339+
destination_name=self._destination_name,
340+
replace_destination=self._replace_destination,
341+
)
342+
343+
330344
class ReplicationPolicy(object):
331345
def __init__(self):
332346
self._pb = _apis.ydb_table.ReplicationPolicy()
@@ -1124,6 +1138,7 @@ def alter_table(
11241138
alter_partitioning_settings=None,
11251139
set_key_bloom_filter=None,
11261140
set_read_replicas_settings=None,
1141+
rename_indexes=None,
11271142
):
11281143
pass
11291144

@@ -1321,6 +1336,7 @@ def alter_table(
13211336
alter_partitioning_settings: Optional["ydb.PartitioningSettings"] = None,
13221337
set_key_bloom_filter: Optional["ydb.FeatureFlag"] = None,
13231338
set_read_replicas_settings: Optional["ydb.ReadReplicasSettings"] = None,
1339+
rename_indexes: Optional[List["ydb.RenameIndexItem"]] = None,
13241340
) -> "ydb.Operation":
13251341
"""
13261342
Alter a YDB table.
@@ -1340,6 +1356,7 @@ def alter_table(
13401356
:param set_compaction_policy: Compaction policy
13411357
:param alter_partitioning_settings: ydb.PartitioningSettings to alter
13421358
:param set_key_bloom_filter: ydb.FeatureFlag to set key bloom filter
1359+
:param rename_indexes: List of ydb.RenameIndexItem to rename
13431360
13441361
:return: Operation or YDB error otherwise.
13451362
"""
@@ -1364,6 +1381,7 @@ def callee(session: Session):
13641381
alter_partitioning_settings=alter_partitioning_settings,
13651382
set_key_bloom_filter=set_key_bloom_filter,
13661383
set_read_replicas_settings=set_read_replicas_settings,
1384+
rename_indexes=rename_indexes,
13671385
)
13681386

13691387
return self._pool.retry_operation_sync(callee)
@@ -1857,6 +1875,7 @@ def alter_table(
18571875
alter_partitioning_settings=None,
18581876
set_key_bloom_filter=None,
18591877
set_read_replicas_settings=None,
1878+
rename_indexes=None,
18601879
):
18611880
return self._driver(
18621881
_session_impl.alter_table_request_factory(
@@ -1876,6 +1895,7 @@ def alter_table(
18761895
alter_partitioning_settings,
18771896
set_key_bloom_filter,
18781897
set_read_replicas_settings,
1898+
rename_indexes,
18791899
),
18801900
_apis.TableService.Stub,
18811901
_apis.TableService.AlterTable,
@@ -2088,6 +2108,7 @@ def async_alter_table(
20882108
alter_partitioning_settings=None,
20892109
set_key_bloom_filter=None,
20902110
set_read_replicas_settings=None,
2111+
rename_indexes=None,
20912112
):
20922113
return self._driver.future(
20932114
_session_impl.alter_table_request_factory(
@@ -2107,6 +2128,7 @@ def async_alter_table(
21072128
alter_partitioning_settings,
21082129
set_key_bloom_filter,
21092130
set_read_replicas_settings,
2131+
rename_indexes,
21102132
),
21112133
_apis.TableService.Stub,
21122134
_apis.TableService.AlterTable,

0 commit comments

Comments
 (0)