Skip to content

Commit 7cd0206

Browse files
authored
Merge pull request #1192 from ydb-platform/rename-tables
* Supported `table.Session.RenameTables` method
2 parents f36255b + 9cfc4c2 commit 7cd0206

File tree

5 files changed

+209
-1
lines changed

5 files changed

+209
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
* Supported `table.Session.RenameTables` method
12
* Fixed out of range panic if next query result set part is empty
23
* Updated the indirect dependencies `golang.org/x/net` to `v0.17.0` and `golang.org/x/sys` to `v0.13.0` due to vulnerability issue
34

internal/table/session.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -602,6 +602,56 @@ func (s *session) CopyTables(
602602
return nil
603603
}
604604

605+
func renameTables(
606+
ctx context.Context,
607+
sessionID string,
608+
operationTimeout time.Duration,
609+
operationCancelAfter time.Duration,
610+
service interface {
611+
RenameTables(
612+
ctx context.Context, in *Ydb_Table.RenameTablesRequest, opts ...grpc.CallOption,
613+
) (*Ydb_Table.RenameTablesResponse, error)
614+
},
615+
opts ...options.RenameTablesOption,
616+
) (err error) {
617+
request := Ydb_Table.RenameTablesRequest{
618+
SessionId: sessionID,
619+
OperationParams: operation.Params(
620+
ctx,
621+
operationTimeout,
622+
operationCancelAfter,
623+
operation.ModeSync,
624+
),
625+
}
626+
for _, opt := range opts {
627+
if opt != nil {
628+
opt((*options.RenameTablesDesc)(&request))
629+
}
630+
}
631+
if len(request.GetTables()) == 0 {
632+
return xerrors.WithStackTrace(fmt.Errorf("no RenameTablesItem: %w", errParamsRequired))
633+
}
634+
_, err = service.RenameTables(ctx, &request)
635+
if err != nil {
636+
return xerrors.WithStackTrace(err)
637+
}
638+
639+
return nil
640+
}
641+
642+
// RenameTables renames tables.
643+
func (s *session) RenameTables(
644+
ctx context.Context,
645+
opts ...options.RenameTablesOption,
646+
) (err error) {
647+
err = renameTables(ctx, s.id, s.config.OperationTimeout(), s.config.OperationCancelAfter(), s.tableService, opts...)
648+
if err != nil {
649+
return xerrors.WithStackTrace(err)
650+
}
651+
652+
return nil
653+
}
654+
605655
// Explain explains data query represented by text.
606656
func (s *session) Explain(
607657
ctx context.Context,

internal/table/session_test.go

Lines changed: 135 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -639,7 +639,7 @@ func (mock *copyTablesMock) CopyTables(
639639
return nil, fmt.Errorf("%w: %s, exp: %s", errUnexpectedRequest, in, mock.String())
640640
}
641641

642-
func Test_copyTables(t *testing.T) {
642+
func TestCopyTables(t *testing.T) {
643643
ctx := xtest.Context(t)
644644
for _, tt := range []struct {
645645
sessionID string
@@ -758,3 +758,137 @@ func Test_copyTables(t *testing.T) {
758758
})
759759
}
760760
}
761+
762+
type renameTablesMock struct {
763+
*Ydb_Table.RenameTablesRequest
764+
}
765+
766+
func (mock *renameTablesMock) RenameTables(
767+
_ context.Context, in *Ydb_Table.RenameTablesRequest, opts ...grpc.CallOption,
768+
) (*Ydb_Table.RenameTablesResponse, error) {
769+
if in.String() == mock.String() {
770+
return &Ydb_Table.RenameTablesResponse{}, nil
771+
}
772+
773+
return nil, fmt.Errorf("%w: %s, exp: %s", errUnexpectedRequest, in, mock.String())
774+
}
775+
776+
func TestRenameTables(t *testing.T) {
777+
ctx := xtest.Context(t)
778+
for _, tt := range []struct {
779+
sessionID string
780+
operationTimeout time.Duration
781+
operationCancelAfter time.Duration
782+
service *renameTablesMock
783+
opts []options.RenameTablesOption
784+
err error
785+
}{
786+
{
787+
sessionID: "1",
788+
operationTimeout: time.Second,
789+
operationCancelAfter: time.Second,
790+
service: &renameTablesMock{
791+
RenameTablesRequest: &Ydb_Table.RenameTablesRequest{
792+
SessionId: "1",
793+
Tables: []*Ydb_Table.RenameTableItem{
794+
{
795+
SourcePath: "from",
796+
DestinationPath: "to",
797+
ReplaceDestination: true,
798+
},
799+
},
800+
OperationParams: &Ydb_Operations.OperationParams{
801+
OperationMode: Ydb_Operations.OperationParams_SYNC,
802+
OperationTimeout: durationpb.New(time.Second),
803+
CancelAfter: durationpb.New(time.Second),
804+
},
805+
},
806+
},
807+
opts: []options.RenameTablesOption{
808+
options.RenameTablesItem("from", "to", true),
809+
},
810+
err: nil,
811+
},
812+
{
813+
sessionID: "2",
814+
operationTimeout: 2 * time.Second,
815+
operationCancelAfter: 2 * time.Second,
816+
service: &renameTablesMock{
817+
RenameTablesRequest: &Ydb_Table.RenameTablesRequest{
818+
SessionId: "2",
819+
Tables: []*Ydb_Table.RenameTableItem{
820+
{
821+
SourcePath: "from1",
822+
DestinationPath: "to1",
823+
ReplaceDestination: true,
824+
},
825+
{
826+
SourcePath: "from2",
827+
DestinationPath: "to2",
828+
ReplaceDestination: false,
829+
},
830+
{
831+
SourcePath: "from3",
832+
DestinationPath: "to3",
833+
ReplaceDestination: true,
834+
},
835+
},
836+
OperationParams: &Ydb_Operations.OperationParams{
837+
OperationMode: Ydb_Operations.OperationParams_SYNC,
838+
OperationTimeout: durationpb.New(2 * time.Second),
839+
CancelAfter: durationpb.New(2 * time.Second),
840+
},
841+
},
842+
},
843+
opts: []options.RenameTablesOption{
844+
options.RenameTablesItem("from1", "to1", true),
845+
options.RenameTablesItem("from2", "to2", false),
846+
options.RenameTablesItem("from3", "to3", true),
847+
},
848+
err: nil,
849+
},
850+
{
851+
sessionID: "3",
852+
operationTimeout: time.Second,
853+
operationCancelAfter: time.Second,
854+
service: &renameTablesMock{
855+
RenameTablesRequest: &Ydb_Table.RenameTablesRequest{
856+
SessionId: "1",
857+
Tables: []*Ydb_Table.RenameTableItem{
858+
{
859+
SourcePath: "from",
860+
DestinationPath: "to",
861+
ReplaceDestination: true,
862+
},
863+
},
864+
OperationParams: &Ydb_Operations.OperationParams{
865+
OperationMode: Ydb_Operations.OperationParams_SYNC,
866+
OperationTimeout: durationpb.New(time.Second),
867+
CancelAfter: durationpb.New(time.Second),
868+
},
869+
},
870+
},
871+
opts: []options.RenameTablesOption{
872+
options.RenameTablesItem("from1", "to1", true),
873+
},
874+
err: errUnexpectedRequest,
875+
},
876+
{
877+
sessionID: "4",
878+
operationTimeout: time.Second,
879+
operationCancelAfter: time.Second,
880+
service: &renameTablesMock{},
881+
opts: nil,
882+
err: errParamsRequired,
883+
},
884+
} {
885+
t.Run("", func(t *testing.T) {
886+
err := renameTables(ctx, tt.sessionID, tt.operationTimeout, tt.operationCancelAfter, tt.service, tt.opts...)
887+
if tt.err != nil {
888+
require.ErrorIs(t, err, tt.err)
889+
} else {
890+
require.NoError(t, err)
891+
}
892+
})
893+
}
894+
}

table/options/options.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -810,6 +810,21 @@ func CopyTablesItem(src, dst string, omitIndexes bool) CopyTablesOption {
810810
}
811811
}
812812

813+
type (
814+
RenameTablesDesc Ydb_Table.RenameTablesRequest
815+
RenameTablesOption func(desc *RenameTablesDesc)
816+
)
817+
818+
func RenameTablesItem(src, dst string, replaceDestination bool) RenameTablesOption {
819+
return func(desc *RenameTablesDesc) {
820+
desc.Tables = append(desc.Tables, &Ydb_Table.RenameTableItem{
821+
SourcePath: src,
822+
DestinationPath: dst,
823+
ReplaceDestination: replaceDestination,
824+
})
825+
}
826+
}
827+
813828
type (
814829
ExecuteSchemeQueryDesc Ydb_Table.ExecuteSchemeQueryRequest
815830
ExecuteSchemeQueryOption func(*ExecuteSchemeQueryDesc)

table/table.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,9 @@ type Session interface {
112112
opts ...options.AlterTableOption,
113113
) (err error)
114114

115+
// Deprecated: use CopyTables method instead
116+
// Will be removed after Oct 2024.
117+
// Read about versioning policy: https://github.com/ydb-platform/ydb-go-sdk/blob/master/VERSIONING.md#deprecated
115118
CopyTable(
116119
ctx context.Context,
117120
dst, src string,
@@ -123,6 +126,11 @@ type Session interface {
123126
opts ...options.CopyTablesOption,
124127
) (err error)
125128

129+
RenameTables(
130+
ctx context.Context,
131+
opts ...options.RenameTablesOption,
132+
) (err error)
133+
126134
Explain(
127135
ctx context.Context,
128136
query string,

0 commit comments

Comments
 (0)