From e3d7ed8e695fb4c59c8bc89377ac49736580575c Mon Sep 17 00:00:00 2001 From: akashkumarsearce Date: Fri, 17 Feb 2023 18:04:58 +0530 Subject: [PATCH 1/8] primarykey package test --- webv2/primarykey/primarykey_test.go | 116 +++++++++++++++++++++++++--- 1 file changed, 106 insertions(+), 10 deletions(-) diff --git a/webv2/primarykey/primarykey_test.go b/webv2/primarykey/primarykey_test.go index 52d145b5a..da66ec67e 100644 --- a/webv2/primarykey/primarykey_test.go +++ b/webv2/primarykey/primarykey_test.go @@ -256,6 +256,23 @@ func TestPrimarykey(t *testing.T) { c := &internal.Conv{ SpSchema: map[string]ddl.CreateTable{ + // "t1": { + // Name: "film_actor", + // ColIds: []string{"c1", "c2", "c3"}, + // ColDefs: map[string]ddl.ColumnDef{ + // "c1": {Name: "film_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c1"}, + // "c2": {Name: "actor_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c2"}, + // //"c3": {Name: "synth_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c3"}, + // }, + // PrimaryKeys: []ddl.IndexKey{ /*{ColId: "c3", Order: 1, Desc: true},*/ {ColId: "c2", Order: 2, Desc: true}}, + // Id: "t1", + // }}, + // SyntheticPKeys: map[string]internal.SyntheticPKey{ + // "t1": {ColId: " c3", Sequence: 0}, + // }, + // Audit: internal.Audit{ + // MigrationType: migration.MigrationData_MIGRATION_TYPE_UNSPECIFIED.Enum(), + // }, "t1": { Name: "film_actor", ColIds: []string{"c1", "c2", "c3"}, @@ -275,11 +292,11 @@ func TestPrimarykey(t *testing.T) { sessionState.Conv = c tc := []struct { - name string - input PrimaryKeyRequest - statusCode int - res PrimaryKeyResponse - expectedRes PrimaryKeyResponse + name string + input PrimaryKeyRequest + statusCode int + conv internal.Conv + expectedConv internal.Conv }{ { name: "Table Id Not found", @@ -296,10 +313,86 @@ func TestPrimarykey(t *testing.T) { Columns: []Column{}}, statusCode: http.StatusBadRequest, }, - } - - for _, tt := range tc { + { + name: "unmarshalling error", + input: PrimaryKeyRequest{ + TableId: "t1", + Columns: []Column{{Order: 1, Desc: true, ColumnId: "-12"}}, + }, + statusCode: http.StatusBadRequest, + }, + { + name: "Not valid column order", + input: PrimaryKeyRequest{ + TableId: "t1", + Columns: []Column{{ColumnId: "c1", Order: 2, Desc: true}, {ColumnId: "c2", Desc: false, Order: 2}}, + }, + statusCode: http.StatusBadRequest, + }, + // { + // name: "request body error", + // input: PrimaryKeyRequest{ + // TableId: "t1", + // }, + // statusCode: http.StatusInternalServerError, + // }, + { + name: "invalid columnid error", + input: PrimaryKeyRequest{ + TableId: "t1", + Columns: []Column{{ColumnId: "c4", Desc: false, Order: 1}}, + }, + statusCode: http.StatusBadRequest, + }, + /*{ + name: "Test removed synthpk", + input: PrimaryKeyRequest{ + TableId: "t1", + Columns: []Column{{ColumnId: "c2", Desc: true, Order: 1}}, + }, + statusCode: http.StatusOK, + conv: internal.Conv{ + + SpSchema: map[string]ddl.CreateTable{ + "t1": { + Name: "film_actor", + ColIds: []string{"c1", "c2", "c3"}, + ColDefs: map[string]ddl.ColumnDef{ + "c1": {Name: "film_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c1"}, + "c2": {Name: "actor_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c2"}, + "c3": {Name: "synth_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c3"}, + }, + PrimaryKeys: []ddl.IndexKey{{ColId: "c3", Order: 1, Desc: true}, {ColId: "c2", Order: 2, Desc: true}}, + Id: "t1", + }}, + SyntheticPKeys: map[string]internal.SyntheticPKey{ + "t1": {ColId: " c3", Sequence: 0}, + }, + }, + expectedConv: internal.Conv{ + + SpSchema: map[string]ddl.CreateTable{ + "t1": { + Name: "film_actor", + ColIds: []string{"c1", "c2"}, + ColDefs: map[string]ddl.ColumnDef{ + "c1": {Name: "film_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c1"}, + "c2": {Name: "actor_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c2"}, + }, + PrimaryKeys: []ddl.IndexKey{{ColId: "c2", Order: 1, Desc: true}}, + Id: "t1", + }}, + Audit: internal.Audit{ + MigrationType: migration.MigrationData_MIGRATION_TYPE_UNSPECIFIED.Enum(), + }, + }, + }, + */} + for i, tt := range tc { + if i != len(tc)-1 { + continue + } inputBytes, err := json.Marshal(tt.input) if err != nil { t.Fatal(err) @@ -316,8 +409,11 @@ func TestPrimarykey(t *testing.T) { handler := http.HandlerFunc(PrimaryKey) handler.ServeHTTP(rr, req) - - json.Unmarshal(rr.Body.Bytes(), &tt.res) + var conv internal.Conv + json.Unmarshal(rr.Body.Bytes(), &conv) assert.Equal(t, tt.statusCode, rr.Code) + if tt.statusCode == http.StatusOK { + assert.Equal(t, tt.expectedConv, conv) + } } } From 5ed37be107b69d0a6deee1b7e4b5aa7a2be5ab6f Mon Sep 17 00:00:00 2001 From: akashkumarsearce Date: Tue, 21 Feb 2023 17:54:57 +0530 Subject: [PATCH 2/8] test case for remove interleave function --- webv2/primarykey/primarykey_service.go | 6 +- webv2/primarykey/primarykey_test.go | 230 +++++++++++++++++++++---- 2 files changed, 202 insertions(+), 34 deletions(-) diff --git a/webv2/primarykey/primarykey_service.go b/webv2/primarykey/primarykey_service.go index fe9b908ea..4bbab7c83 100644 --- a/webv2/primarykey/primarykey_service.go +++ b/webv2/primarykey/primarykey_service.go @@ -84,17 +84,17 @@ func RemoveInterleave(conv *internal.Conv, spannertable ddl.CreateTable) { var parentPkFirstColumn string for i := 0; i < len(spannertable.PrimaryKeys); i++ { if spannertable.PrimaryKeys[i].Order == 1 { - childPkFirstColumn = spannertable.PrimaryKeys[i].ColId + childPkFirstColumn = spannertable.ColDefs[spannertable.PrimaryKeys[i].ColId].Name } } for i := 0; i < len(conv.SpSchema[spannertable.ParentId].PrimaryKeys); i++ { if conv.SpSchema[spannertable.ParentId].PrimaryKeys[i].Order == 1 { - parentPkFirstColumn = conv.SpSchema[spannertable.ParentId].PrimaryKeys[i].ColId + parentPkFirstColumn = conv.SpSchema[spannertable.ParentId].ColDefs[conv.SpSchema[spannertable.ParentId].PrimaryKeys[i].ColId].Name } } if childPkFirstColumn != parentPkFirstColumn { spannertable.ParentId = "" - conv.SpSchema[spannertable.Name] = spannertable + conv.SpSchema[spannertable.Id] = spannertable } } } diff --git a/webv2/primarykey/primarykey_test.go b/webv2/primarykey/primarykey_test.go index da66ec67e..b6b727bbd 100644 --- a/webv2/primarykey/primarykey_test.go +++ b/webv2/primarykey/primarykey_test.go @@ -254,25 +254,7 @@ func TestPrimarykey(t *testing.T) { sessionState := session.GetSessionState() c := &internal.Conv{ - SpSchema: map[string]ddl.CreateTable{ - // "t1": { - // Name: "film_actor", - // ColIds: []string{"c1", "c2", "c3"}, - // ColDefs: map[string]ddl.ColumnDef{ - // "c1": {Name: "film_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c1"}, - // "c2": {Name: "actor_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c2"}, - // //"c3": {Name: "synth_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c3"}, - // }, - // PrimaryKeys: []ddl.IndexKey{ /*{ColId: "c3", Order: 1, Desc: true},*/ {ColId: "c2", Order: 2, Desc: true}}, - // Id: "t1", - // }}, - // SyntheticPKeys: map[string]internal.SyntheticPKey{ - // "t1": {ColId: " c3", Sequence: 0}, - // }, - // Audit: internal.Audit{ - // MigrationType: migration.MigrationData_MIGRATION_TYPE_UNSPECIFIED.Enum(), - // }, "t1": { Name: "film_actor", ColIds: []string{"c1", "c2", "c3"}, @@ -344,11 +326,47 @@ func TestPrimarykey(t *testing.T) { }, statusCode: http.StatusBadRequest, }, - /*{ + } + + for _, tt := range tc { + inputBytes, err := json.Marshal(tt.input) + if err != nil { + t.Fatal(err) + } + buffer := bytes.NewBuffer(inputBytes) + + req, err := http.NewRequest("POST", "/primarykey", buffer) + if err != nil { + t.Fatal(err) + } + + req.Header.Set("Content-Type", "application/json") + rr := httptest.NewRecorder() + + handler := http.HandlerFunc(PrimaryKey) + handler.ServeHTTP(rr, req) + var conv internal.Conv + json.Unmarshal(rr.Body.Bytes(), &conv) + assert.Equal(t, tt.statusCode, rr.Code) + if tt.statusCode == http.StatusOK { + assert.Equal(t, tt.expectedConv, conv) + } + } +} + +func TestPrimarykeyUpdate(t *testing.T) { + tc := []struct { + name string + input PrimaryKeyRequest + statusCode int + conv internal.Conv + expectedConv internal.Conv + }{ + { name: "Test removed synthpk", input: PrimaryKeyRequest{ TableId: "t1", - Columns: []Column{{ColumnId: "c2", Desc: true, Order: 1}}, + Columns: []Column{{ColumnId: "c1", Desc: true, Order: 1}}, }, statusCode: http.StatusOK, conv: internal.Conv{ @@ -362,15 +380,101 @@ func TestPrimarykey(t *testing.T) { "c2": {Name: "actor_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c2"}, "c3": {Name: "synth_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c3"}, }, - PrimaryKeys: []ddl.IndexKey{{ColId: "c3", Order: 1, Desc: true}, {ColId: "c2", Order: 2, Desc: true}}, + PrimaryKeys: []ddl.IndexKey{{ColId: "c3", Order: 1, Desc: true}, {ColId: "c1", Order: 2, Desc: true}}, Id: "t1", }}, SyntheticPKeys: map[string]internal.SyntheticPKey{ - "t1": {ColId: " c3", Sequence: 0}, + "t1": {ColId: "c3", Sequence: 0}, + }, + Audit: internal.Audit{ + MigrationType: migration.MigrationData_MIGRATION_TYPE_UNSPECIFIED.Enum(), }, }, expectedConv: internal.Conv{ + SpSchema: map[string]ddl.CreateTable{ + "t1": { + Name: "film_actor", + ColIds: []string{"c1", "c2"}, + ColDefs: map[string]ddl.ColumnDef{ + "c1": {Name: "film_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c1"}, + "c2": {Name: "actor_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c2"}, + }, + PrimaryKeys: []ddl.IndexKey{{ColId: "c1", Order: 1, Desc: true}}, + Id: "t1", + }}, + SyntheticPKeys: map[string]internal.SyntheticPKey{}, + }, + }, + } + for _, tt := range tc { + inputBytes, err := json.Marshal(tt.input) + if err != nil { + t.Fatal(err) + } + buffer := bytes.NewBuffer(inputBytes) + sessionState := session.GetSessionState() + + sessionState.Conv = &tt.conv + req, err := http.NewRequest("POST", "/primarykey", buffer) + if err != nil { + t.Fatal(err) + } + + req.Header.Set("Content-Type", "application/json") + rr := httptest.NewRecorder() + + handler := http.HandlerFunc(PrimaryKey) + handler.ServeHTTP(rr, req) + assert.Equal(t, tt.statusCode, rr.Code) + if tt.statusCode == http.StatusOK { + var res internal.Conv + json.Unmarshal(rr.Body.Bytes(), &res) + assert.Equal(t, tt.expectedConv, res) + } + } +} + +func TestPrimaryKeyUpdatetwo(t *testing.T) { + + tc := []struct { + name string + input PrimaryKeyRequest + statusCode int + conv internal.Conv + expectedConv internal.Conv + }{ + /*{ + name: "Synthetic PK removed success", + input: PrimaryKeyRequest{ + TableId: "t1", + Columns: []Column{{ColumnId: "c1", Desc: true, Order: 1}}, + }, + statusCode: http.StatusOK, + conv: internal.Conv{ + SpSchema: map[string]ddl.CreateTable{ + "t1": { + Name: "film_actor", + ColIds: []string{"c1", "c2", "c3"}, + ColDefs: map[string]ddl.ColumnDef{ + "c1": {Name: "film_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c1"}, + "c2": {Name: "actor_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c2"}, + "c3": {Name: "synth_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c3"}, + }, + PrimaryKeys: []ddl.IndexKey{{ColId: "c3", Order: 1, Desc: true}, {ColId: "c1", Order: 2, Desc: true}}, + Id: "t1", + }}, + SyntheticPKeys: map[string]internal.SyntheticPKey{ + "t1": { + ColId: "c3", + Sequence: 0, + }, + }, + Audit: internal.Audit{ + MigrationType: migration.MigrationData_MIGRATION_TYPE_UNSPECIFIED.Enum(), + }, + }, + expectedConv: internal.Conv{ SpSchema: map[string]ddl.CreateTable{ "t1": { Name: "film_actor", @@ -379,26 +483,89 @@ func TestPrimarykey(t *testing.T) { "c1": {Name: "film_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c1"}, "c2": {Name: "actor_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c2"}, }, - PrimaryKeys: []ddl.IndexKey{{ColId: "c2", Order: 1, Desc: true}}, + PrimaryKeys: []ddl.IndexKey{{ColId: "c1", Order: 1, Desc: true}}, Id: "t1", }}, + SyntheticPKeys: map[string]internal.SyntheticPKey{}, + }, + },*/ + { + name: "remove interleave function success", + input: PrimaryKeyRequest{ + TableId: "t1", + Columns: []Column{{ColumnId: "c2", Desc: true, Order: 1}}, + }, + statusCode: http.StatusOK, + conv: internal.Conv{ + SpSchema: map[string]ddl.CreateTable{ + "t1": { + Name: "parent_table", + ColIds: []string{"c1", "c2", "c3"}, + ColDefs: map[string]ddl.ColumnDef{ + "c1": {Name: "film_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c1"}, + "c2": {Name: "actor_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c2"}, + "c3": {Name: "last_update", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c3"}, + }, + PrimaryKeys: []ddl.IndexKey{{ColId: "c1", Order: 1, Desc: true}, {ColId: "c2", Order: 2, Desc: true}}, + Id: "t1", + ParentId: "t2", + }, + "t2": { + Name: "child_table", + ColIds: []string{"c1", "c2"}, + ColDefs: map[string]ddl.ColumnDef{ + "c1": {Name: "film_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c1"}, + "c2": {Name: "film_details", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c2"}, + }, + PrimaryKeys: []ddl.IndexKey{{ColId: "c1", Order: 1, Desc: true}}, + Id: "t2", + }, + }, Audit: internal.Audit{ MigrationType: migration.MigrationData_MIGRATION_TYPE_UNSPECIFIED.Enum(), }, }, + expectedConv: internal.Conv{ + SpSchema: map[string]ddl.CreateTable{ + "t1": { + Name: "parent_table", + ColIds: []string{"c1", "c2", "c3"}, + ColDefs: map[string]ddl.ColumnDef{ + "c1": {Name: "film_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c1"}, + "c2": {Name: "actor_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c2"}, + "c3": {Name: "last_update", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c3"}, + }, + PrimaryKeys: []ddl.IndexKey{{ColId: "c2", Order: 1, Desc: true}}, + Id: "t1", + }, + "t2": { + Name: "child_table", + ColIds: []string{"c1", "c2"}, + ColDefs: map[string]ddl.ColumnDef{ + "c1": {Name: "film_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c1"}, + "c2": {Name: "film_details", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c2"}, + }, + PrimaryKeys: []ddl.IndexKey{{ColId: "c1", Order: 1, Desc: true}}, + Id: "t2", + //ForeignKeys: []ddl.Foreignkey{{ColIds: []string{"c1"}}}, + }, + }, + }, }, - */} + } + + for _, tt := range tc { - for i, tt := range tc { - if i != len(tc)-1 { - continue - } inputBytes, err := json.Marshal(tt.input) if err != nil { t.Fatal(err) } buffer := bytes.NewBuffer(inputBytes) + sessionState := session.GetSessionState() + + sessionState.Conv = &tt.conv + req, err := http.NewRequest("POST", "/primarykey", buffer) if err != nil { t.Fatal(err) @@ -409,11 +576,12 @@ func TestPrimarykey(t *testing.T) { handler := http.HandlerFunc(PrimaryKey) handler.ServeHTTP(rr, req) - var conv internal.Conv - json.Unmarshal(rr.Body.Bytes(), &conv) + assert.Equal(t, tt.statusCode, rr.Code) if tt.statusCode == http.StatusOK { - assert.Equal(t, tt.expectedConv, conv) + var res internal.Conv + json.Unmarshal(rr.Body.Bytes(), &res) + assert.Equal(t, tt.expectedConv, res) } } } From 44734aa146e2a087e1bd410c072903b1f246c48d Mon Sep 17 00:00:00 2001 From: akashkumarsearce Date: Tue, 21 Feb 2023 17:58:24 +0530 Subject: [PATCH 3/8] removed commited code from test file --- webv2/primarykey/primarykey_test.go | 53 ----------------------------- 1 file changed, 53 deletions(-) diff --git a/webv2/primarykey/primarykey_test.go b/webv2/primarykey/primarykey_test.go index b6b727bbd..8f357cc36 100644 --- a/webv2/primarykey/primarykey_test.go +++ b/webv2/primarykey/primarykey_test.go @@ -311,13 +311,6 @@ func TestPrimarykey(t *testing.T) { }, statusCode: http.StatusBadRequest, }, - // { - // name: "request body error", - // input: PrimaryKeyRequest{ - // TableId: "t1", - // }, - // statusCode: http.StatusInternalServerError, - // }, { name: "invalid columnid error", input: PrimaryKeyRequest{ @@ -444,51 +437,6 @@ func TestPrimaryKeyUpdatetwo(t *testing.T) { conv internal.Conv expectedConv internal.Conv }{ - /*{ - name: "Synthetic PK removed success", - input: PrimaryKeyRequest{ - TableId: "t1", - Columns: []Column{{ColumnId: "c1", Desc: true, Order: 1}}, - }, - statusCode: http.StatusOK, - conv: internal.Conv{ - SpSchema: map[string]ddl.CreateTable{ - "t1": { - Name: "film_actor", - ColIds: []string{"c1", "c2", "c3"}, - ColDefs: map[string]ddl.ColumnDef{ - "c1": {Name: "film_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c1"}, - "c2": {Name: "actor_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c2"}, - "c3": {Name: "synth_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c3"}, - }, - PrimaryKeys: []ddl.IndexKey{{ColId: "c3", Order: 1, Desc: true}, {ColId: "c1", Order: 2, Desc: true}}, - Id: "t1", - }}, - SyntheticPKeys: map[string]internal.SyntheticPKey{ - "t1": { - ColId: "c3", - Sequence: 0, - }, - }, - Audit: internal.Audit{ - MigrationType: migration.MigrationData_MIGRATION_TYPE_UNSPECIFIED.Enum(), - }, - }, - expectedConv: internal.Conv{ - SpSchema: map[string]ddl.CreateTable{ - "t1": { - Name: "film_actor", - ColIds: []string{"c1", "c2"}, - ColDefs: map[string]ddl.ColumnDef{ - "c1": {Name: "film_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c1"}, - "c2": {Name: "actor_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c2"}, - }, - PrimaryKeys: []ddl.IndexKey{{ColId: "c1", Order: 1, Desc: true}}, - Id: "t1", - }}, - SyntheticPKeys: map[string]internal.SyntheticPKey{}, - }, - },*/ { name: "remove interleave function success", input: PrimaryKeyRequest{ @@ -547,7 +495,6 @@ func TestPrimaryKeyUpdatetwo(t *testing.T) { }, PrimaryKeys: []ddl.IndexKey{{ColId: "c1", Order: 1, Desc: true}}, Id: "t2", - //ForeignKeys: []ddl.Foreignkey{{ColIds: []string{"c1"}}}, }, }, }, From 60c10112d882cd3ef87be6ffaa05a8262847a228 Mon Sep 17 00:00:00 2001 From: akashkumarsearce Date: Wed, 22 Feb 2023 17:07:47 +0530 Subject: [PATCH 4/8] hotspot test changes --- webv2/primarykey/hotspot_test.go | 111 +++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 webv2/primarykey/hotspot_test.go diff --git a/webv2/primarykey/hotspot_test.go b/webv2/primarykey/hotspot_test.go new file mode 100644 index 000000000..e9c6de93e --- /dev/null +++ b/webv2/primarykey/hotspot_test.go @@ -0,0 +1,111 @@ +package primarykey + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "testing" + + "github.com/cloudspannerecosystem/harbourbridge/internal" + "github.com/cloudspannerecosystem/harbourbridge/proto/migration" + "github.com/cloudspannerecosystem/harbourbridge/spanner/ddl" + "github.com/cloudspannerecosystem/harbourbridge/webv2/session" + "github.com/stretchr/testify/assert" +) + +func Test_hotspotTimestamp(t *testing.T) { + tc := []struct { + name string + + statusCode int + conv internal.Conv + expectedConv internal.Conv + }{ + + { + name: "detecthotspot timestamp test success", + statusCode: http.StatusOK, + + conv: internal.Conv{ + SpSchema: map[string]ddl.CreateTable{ + "t1": { + Name: "film_table", + ColIds: []string{"c1", "c2", "c3"}, + ColDefs: map[string]ddl.ColumnDef{ + "c1": {Name: "film_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c1"}, + "c2": {Name: "actor_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c2"}, + "c3": {Name: "last_update", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c3"}, + }, + PrimaryKeys: []ddl.IndexKey{{ColId: "c1", Order: 1, Desc: true}, {ColId: "c2", Order: 2, Desc: true}}, + Id: "t1", + }, + }, + //SchemaIssues: map[string][]internal.SchemaIssues{ + SchemaIssues: map[string]map[string][]internal.SchemaIssue{ + "t1": map[string][]internal.SchemaIssue{ + "c1": {}, + "c2": {}, + "c3": {}, + }, + }, + /*expectedIssues : map[string][]internal.SchemaIssues{ + "t1": map[string][]string{ + "c1": {}, + "c2": {}, + "c3": {internal.HotspotTimestamp}, + }, + },*/ + Audit: internal.Audit{ + MigrationType: migration.MigrationData_MIGRATION_TYPE_UNSPECIFIED.Enum(), + }, + }, + //SchemaIssues: map[string]map[string][]SchemaIssue, + expectedConv: internal.Conv{ + SpSchema: map[string]ddl.CreateTable{ + "t1": { + Name: "film_table", + ColIds: []string{"c1", "c2", "c3"}, + ColDefs: map[string]ddl.ColumnDef{ + "c1": {Name: "film_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c1"}, + "c2": {Name: "actor_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c2"}, + "c3": {Name: "last_update", T: ddl.Type{Name: ddl.Timestamp, Len: ddl.MaxLength}, Id: "c3"}, + }, + PrimaryKeys: []ddl.IndexKey{{ColId: "c2", Order: 1, Desc: true}}, + Id: "t1", + }, + }, + + SchemaIssues: map[string]map[string][]internal.SchemaIssue{ + "t1": { + "c1": {}, + "c2": {}, + "c3": {internal.HotspotTimestamp}, + }, + }, + }, + }, + } + for _, tt := range tc { + sessionState := session.GetSessionState() + + sessionState.Conv = &tt.conv + + req, err := http.NewRequest("GET", "/convert/infoschema", nil) + if err != nil { + t.Fatal(err) + } + + req.Header.Set("Content-Type", "application/json") + rr := httptest.NewRecorder() + + handler := http.HandlerFunc(PrimaryKey) + handler.ServeHTTP(rr, req) + + assert.Equal(t, tt.statusCode, rr.Code) + if tt.statusCode == http.StatusOK { + var res internal.Conv + json.Unmarshal(rr.Body.Bytes(), &res) + assert.Equal(t, tt.expectedConv, res) + } + } +} From bee0e34b7b662db3473ac61691a72dda57a05ec0 Mon Sep 17 00:00:00 2001 From: akashkumarsearce Date: Thu, 23 Feb 2023 19:02:12 +0530 Subject: [PATCH 5/8] changes made in hotspot test --- webv2/primarykey/hotspot_test.go | 182 +++++++++++++++---------------- 1 file changed, 86 insertions(+), 96 deletions(-) diff --git a/webv2/primarykey/hotspot_test.go b/webv2/primarykey/hotspot_test.go index e9c6de93e..2fef31d63 100644 --- a/webv2/primarykey/hotspot_test.go +++ b/webv2/primarykey/hotspot_test.go @@ -1,111 +1,101 @@ package primarykey -import ( - "encoding/json" - "net/http" - "net/http/httptest" - "testing" +import "github.com/cloudspannerecosystem/harbourbridge/spanner/ddl" - "github.com/cloudspannerecosystem/harbourbridge/internal" - "github.com/cloudspannerecosystem/harbourbridge/proto/migration" - "github.com/cloudspannerecosystem/harbourbridge/spanner/ddl" - "github.com/cloudspannerecosystem/harbourbridge/webv2/session" - "github.com/stretchr/testify/assert" -) - -func Test_hotspotTimestamp(t *testing.T) { - tc := []struct { - name string - - statusCode int - conv internal.Conv - expectedConv internal.Conv - }{ - - { - name: "detecthotspot timestamp test success", - statusCode: http.StatusOK, - - conv: internal.Conv{ - SpSchema: map[string]ddl.CreateTable{ - "t1": { - Name: "film_table", - ColIds: []string{"c1", "c2", "c3"}, - ColDefs: map[string]ddl.ColumnDef{ - "c1": {Name: "film_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c1"}, - "c2": {Name: "actor_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c2"}, - "c3": {Name: "last_update", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c3"}, - }, - PrimaryKeys: []ddl.IndexKey{{ColId: "c1", Order: 1, Desc: true}, {ColId: "c2", Order: 2, Desc: true}}, - Id: "t1", - }, - }, - //SchemaIssues: map[string][]internal.SchemaIssues{ - SchemaIssues: map[string]map[string][]internal.SchemaIssue{ - "t1": map[string][]internal.SchemaIssue{ - "c1": {}, - "c2": {}, - "c3": {}, - }, - }, - /*expectedIssues : map[string][]internal.SchemaIssues{ - "t1": map[string][]string{ - "c1": {}, - "c2": {}, - "c3": {internal.HotspotTimestamp}, - }, - },*/ - Audit: internal.Audit{ - MigrationType: migration.MigrationData_MIGRATION_TYPE_UNSPECIFIED.Enum(), +func TestDetectHotspot(t *testing.T){ + input1 :=[]ddl.CreateTable {{ + Name: "hotspot_t1", + Id: "t1", + ColIds: []string{"c1", "c2", "c3"}, + ColDefs: map[string]ddl.ColumnDef{ + "c1": {Name: "film_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c1"}, + "c2": {Name: "actor_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c2"}, + "c3": {Name: "last_update", T: ddl.Type{Name: ddl.Timestamp, Len: ddl.MaxLength}, Id: "c3"}, }, + PrimaryKeys: []ddl.IndexKey{{ColId: "c3", Order: 1, Desc: false}, {ColId: "c2", Order: 2, Desc: false}}, + }, + { + Name: "hotspot_t1", + Id: "t1", + ColIds: []string{"c1", "c2", "c3"}, + ColDefs: map[string]ddl.ColumnDef{ + "c1": {Name: "film_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c1"}, + "c2": {Name: "actor_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c2"}, + "c3": {Name: "last_update", T: ddl.Type{Name: ddl.Timestamp, Len: ddl.MaxLength}, Id: "c3"}, + }, + PrimaryKeys: []ddl.IndexKey{{ColId: "c3", Order: 1, Desc: false}, {ColId: "c2", Order: 2, Desc: false}}, + }, + } + tc:=[]struct{ + input []ddl.CreateTable + }{{ + input:input1, + }, + } + sessionState := session.GetSessionState() + for _,tt:=range tc{ + sessionState.Conv = &internal.Conv{ + SpSchema: ddl.Schema{ + "t1": tt.input[], }, - //SchemaIssues: map[string]map[string][]SchemaIssue, - expectedConv: internal.Conv{ - SpSchema: map[string]ddl.CreateTable{ - "t1": { - Name: "film_table", - ColIds: []string{"c1", "c2", "c3"}, - ColDefs: map[string]ddl.ColumnDef{ - "c1": {Name: "film_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c1"}, - "c2": {Name: "actor_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c2"}, - "c3": {Name: "last_update", T: ddl.Type{Name: ddl.Timestamp, Len: ddl.MaxLength}, Id: "c3"}, - }, - PrimaryKeys: []ddl.IndexKey{{ColId: "c2", Order: 1, Desc: true}}, - Id: "t1", - }, - }, - - SchemaIssues: map[string]map[string][]internal.SchemaIssue{ - "t1": { - "c1": {}, - "c2": {}, - "c3": {internal.HotspotTimestamp}, - }, - }, + SchemaIssues: map[string]map[string][]internal.SchemaIssue{ + "t1": {}, }, - }, + } } - for _, tt := range tc { - sessionState := session.GetSessionState() - sessionState.Conv = &tt.conv - req, err := http.NewRequest("GET", "/convert/infoschema", nil) - if err != nil { - t.Fatal(err) + + sessionState.Conv = &internal.Conv{ + SpSchema: ddl.Schema{ + "t1": spannerTable, + }, + SchemaIssues: map[string]map[string][]internal.SchemaIssue{ + "t1": {}, + }, } + isHotSpot(spannerTable.PrimaryKeys,spannerTable) + expected := []internal.SchemaIssue{internal.HotspotTimestamp} + if !reflect.DeepEqual(sessionState.Conv.SchemaIssues[spannerTable.Id]["c3"], expected) { + t.Errorf("hotspotTimestamp failed, expected: %v, got: %v", expected, sessionState.Conv.SchemaIssues[spannerTable.Id][spannerTable.Id]) + } + } - req.Header.Set("Content-Type", "application/json") - rr := httptest.NewRecorder() +func TestHotspotTimestamp(t *testing.T) { + // Create test data + insert := []ddl.IndexKey{ + {ColId: "c3", Desc: false, Order: 1}, + {ColId: "c2", Desc: false, Order: 2}, + } + spannerTable := ddl.CreateTable{ + Name: "hotspot_t1", + Id: "t1", + ColIds: []string{"c1", "c2", "c3"}, + ColDefs: map[string]ddl.ColumnDef{ + "c1": {Name: "film_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c1"}, + "c2": {Name: "actor_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c2"}, + "c3": {Name: "last_update", T: ddl.Type{Name: ddl.Timestamp, Len: ddl.MaxLength}, Id: "c3"}, + }, + PrimaryKeys: []ddl.IndexKey{{ColId: "c3", Order: 1, Desc: false}, {ColId: "c2", Order: 2, Desc: false}}, + } - handler := http.HandlerFunc(PrimaryKey) - handler.ServeHTTP(rr, req) + sessionState := session.GetSessionState() + sessionState.Conv = &internal.Conv{ + SpSchema: ddl.Schema{ + "t1": spannerTable, + }, + SchemaIssues: map[string]map[string][]internal.SchemaIssue{ + "t1": {}, + }, + } + // Call the function + hotspotTimestamp(insert, spannerTable) - assert.Equal(t, tt.statusCode, rr.Code) - if tt.statusCode == http.StatusOK { - var res internal.Conv - json.Unmarshal(rr.Body.Bytes(), &res) - assert.Equal(t, tt.expectedConv, res) - } + // Verify the results + expected := []internal.SchemaIssue{internal.HotspotTimestamp} + if !reflect.DeepEqual(sessionState.Conv.SchemaIssues[spannerTable.Id]["c3"], expected) { + t.Errorf("hotspotTimestamp failed, expected: %v, got: %v", expected, sessionState.Conv.SchemaIssues[spannerTable.Id][spannerTable.Id]) } + fmt.Println("++++++", sessionState.Conv.SchemaIssues[spannerTable.Id]["c3"]) } + From 96fd51a3da3410759105add70c6cf978b1f50dfa Mon Sep 17 00:00:00 2001 From: sushil-searce Date: Thu, 23 Feb 2023 19:24:21 +0530 Subject: [PATCH 6/8] update DetectHotSpot testcase --- webv2/primarykey/hotspot_test.go | 106 +++++++++---------------------- 1 file changed, 31 insertions(+), 75 deletions(-) diff --git a/webv2/primarykey/hotspot_test.go b/webv2/primarykey/hotspot_test.go index 2fef31d63..0357d4a25 100644 --- a/webv2/primarykey/hotspot_test.go +++ b/webv2/primarykey/hotspot_test.go @@ -1,21 +1,17 @@ package primarykey -import "github.com/cloudspannerecosystem/harbourbridge/spanner/ddl" - -func TestDetectHotspot(t *testing.T){ - input1 :=[]ddl.CreateTable {{ - Name: "hotspot_t1", - Id: "t1", - ColIds: []string{"c1", "c2", "c3"}, - ColDefs: map[string]ddl.ColumnDef{ - "c1": {Name: "film_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c1"}, - "c2": {Name: "actor_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c2"}, - "c3": {Name: "last_update", T: ddl.Type{Name: ddl.Timestamp, Len: ddl.MaxLength}, Id: "c3"}, - }, - PrimaryKeys: []ddl.IndexKey{{ColId: "c3", Order: 1, Desc: false}, {ColId: "c2", Order: 2, Desc: false}}, - }, - { - Name: "hotspot_t1", +import ( + "reflect" + "testing" + + "github.com/cloudspannerecosystem/harbourbridge/internal" + "github.com/cloudspannerecosystem/harbourbridge/spanner/ddl" + "github.com/cloudspannerecosystem/harbourbridge/webv2/session" +) + +func TestDetectHotspot(t *testing.T) { + input1 := []ddl.CreateTable{{ + Name: "TimeStamp_t1", Id: "t1", ColIds: []string{"c1", "c2", "c3"}, ColDefs: map[string]ddl.ColumnDef{ @@ -25,77 +21,37 @@ func TestDetectHotspot(t *testing.T){ }, PrimaryKeys: []ddl.IndexKey{{ColId: "c3", Order: 1, Desc: false}, {ColId: "c2", Order: 2, Desc: false}}, }, - } - tc:=[]struct{ - input []ddl.CreateTable - }{{ - input:input1, - }, - } - sessionState := session.GetSessionState() - for _,tt:=range tc{ - sessionState.Conv = &internal.Conv{ - SpSchema: ddl.Schema{ - "t1": tt.input[], - }, - SchemaIssues: map[string]map[string][]internal.SchemaIssue{ - "t1": {}, - }, - } - } - - - - sessionState.Conv = &internal.Conv{ - SpSchema: ddl.Schema{ - "t1": spannerTable, - }, - SchemaIssues: map[string]map[string][]internal.SchemaIssue{ - "t1": {}, + { + Name: "AutoIncrement_t2", + Id: "t2", + ColIds: []string{"c1", "c2", "c3"}, + ColDefs: map[string]ddl.ColumnDef{ + "c1": {Name: "film_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c1"}, + "c2": {Name: "actor_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c2"}, + "c3": {Name: "last_update", T: ddl.Type{Name: ddl.Timestamp, Len: ddl.MaxLength}, Id: "c3"}, }, - } - isHotSpot(spannerTable.PrimaryKeys,spannerTable) - expected := []internal.SchemaIssue{internal.HotspotTimestamp} - if !reflect.DeepEqual(sessionState.Conv.SchemaIssues[spannerTable.Id]["c3"], expected) { - t.Errorf("hotspotTimestamp failed, expected: %v, got: %v", expected, sessionState.Conv.SchemaIssues[spannerTable.Id][spannerTable.Id]) - } - } - -func TestHotspotTimestamp(t *testing.T) { - // Create test data - insert := []ddl.IndexKey{ - {ColId: "c3", Desc: false, Order: 1}, - {ColId: "c2", Desc: false, Order: 2}, - } - spannerTable := ddl.CreateTable{ - Name: "hotspot_t1", - Id: "t1", - ColIds: []string{"c1", "c2", "c3"}, - ColDefs: map[string]ddl.ColumnDef{ - "c1": {Name: "film_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c1"}, - "c2": {Name: "actor_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c2"}, - "c3": {Name: "last_update", T: ddl.Type{Name: ddl.Timestamp, Len: ddl.MaxLength}, Id: "c3"}, + PrimaryKeys: []ddl.IndexKey{{ColId: "c3", Order: 1, Desc: false}, {ColId: "c2", Order: 2, Desc: false}}, }, - PrimaryKeys: []ddl.IndexKey{{ColId: "c3", Order: 1, Desc: false}, {ColId: "c2", Order: 2, Desc: false}}, } sessionState := session.GetSessionState() sessionState.Conv = &internal.Conv{ SpSchema: ddl.Schema{ - "t1": spannerTable, + "t1": input1[0], + "t2": input1[1], }, SchemaIssues: map[string]map[string][]internal.SchemaIssue{ "t1": {}, + "t2": {}, }, } - // Call the function - hotspotTimestamp(insert, spannerTable) - // Verify the results - expected := []internal.SchemaIssue{internal.HotspotTimestamp} - if !reflect.DeepEqual(sessionState.Conv.SchemaIssues[spannerTable.Id]["c3"], expected) { - t.Errorf("hotspotTimestamp failed, expected: %v, got: %v", expected, sessionState.Conv.SchemaIssues[spannerTable.Id][spannerTable.Id]) + for _, input := range input1 { + isHotSpot(input.PrimaryKeys, input) + expected := []internal.SchemaIssue{internal.HotspotTimestamp} + if !reflect.DeepEqual(sessionState.Conv.SchemaIssues[input.Id]["c3"], expected) { + t.Errorf("hotspotTimestamp failed, expected: %v, got: %v", expected, sessionState.Conv.SchemaIssues[input.Id][input.Id]) + } } - fmt.Println("++++++", sessionState.Conv.SchemaIssues[spannerTable.Id]["c3"]) -} +} From aeffa7732de82990e9dd29afee51b33cb64c868c Mon Sep 17 00:00:00 2001 From: akashkumarsearce Date: Thu, 23 Feb 2023 19:50:35 +0530 Subject: [PATCH 7/8] changes made on autoincrement test --- webv2/primarykey/hotspot_test.go | 59 +++++++++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 5 deletions(-) diff --git a/webv2/primarykey/hotspot_test.go b/webv2/primarykey/hotspot_test.go index 0357d4a25..b20b52344 100644 --- a/webv2/primarykey/hotspot_test.go +++ b/webv2/primarykey/hotspot_test.go @@ -11,7 +11,7 @@ import ( func TestDetectHotspot(t *testing.T) { input1 := []ddl.CreateTable{{ - Name: "TimeStamp_t1", + Name: "Hotspot_t1", Id: "t1", ColIds: []string{"c1", "c2", "c3"}, ColDefs: map[string]ddl.ColumnDef{ @@ -22,7 +22,7 @@ func TestDetectHotspot(t *testing.T) { PrimaryKeys: []ddl.IndexKey{{ColId: "c3", Order: 1, Desc: false}, {ColId: "c2", Order: 2, Desc: false}}, }, { - Name: "AutoIncrement_t2", + Name: "Hotspot_t2", Id: "t2", ColIds: []string{"c1", "c2", "c3"}, ColDefs: map[string]ddl.ColumnDef{ @@ -48,10 +48,59 @@ func TestDetectHotspot(t *testing.T) { for _, input := range input1 { isHotSpot(input.PrimaryKeys, input) - expected := []internal.SchemaIssue{internal.HotspotTimestamp} - if !reflect.DeepEqual(sessionState.Conv.SchemaIssues[input.Id]["c3"], expected) { - t.Errorf("hotspotTimestamp failed, expected: %v, got: %v", expected, sessionState.Conv.SchemaIssues[input.Id][input.Id]) + if input.ColDefs["c3"].T.Name == ddl.Timestamp { + expected := []internal.SchemaIssue{internal.HotspotTimestamp} + if !reflect.DeepEqual(sessionState.Conv.SchemaIssues[input.Id]["c3"], expected) { + t.Errorf("hotspotTimestamp failed, expected: %v, got: %v", expected, sessionState.Conv.SchemaIssues[input.Id][input.Id]) + } } + /*if input.ColDefs["c3"].T.Name == ddl.Autoincrement { + expected := []internal.SchemaIssue{internal.HotspotAutoIncrement} + if !reflect.DeepEqual(sessionState.Conv.SchemaIssues[input.Id]["c3"], expected) { + t.Errorf("hotspotTimestamp failed, expected: %v, got: %v", expected, sessionState.Conv.SchemaIssues[input.Id][input.Id]) + } + + }*/ + } +} + +/* +func TestHotspotTimestamp(t *testing.T) { + // Create test data + insert := []ddl.IndexKey{ + {ColId: "c3", Desc: false, Order: 1}, + {ColId: "c2", Desc: false, Order: 2}, + } + spannerTable := ddl.CreateTable{ + Name: "hotspot_t1", + Id: "t1", + ColIds: []string{"c1", "c2", "c3"}, + ColDefs: map[string]ddl.ColumnDef{ + "c1": {Name: "film_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c1"}, + "c2": {Name: "actor_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c2"}, + "c3": {Name: "last_update", T: ddl.Type{Name: ddl.Timestamp, Len: ddl.MaxLength}, Id: "c3"}, + }, + PrimaryKeys: []ddl.IndexKey{{ColId: "c3", Order: 1, Desc: false}, {ColId: "c2", Order: 2, Desc: false}}, + } + + sessionState := session.GetSessionState() + sessionState.Conv = &internal.Conv{ + SpSchema: ddl.Schema{ + "t1": spannerTable, + }, + SchemaIssues: map[string]map[string][]internal.SchemaIssue{ + "t1": {}, + }, + } + // Call the function + hotspotTimestamp(insert, spannerTable) + // Verify the results + expected := []internal.SchemaIssue{internal.HotspotTimestamp} + if !reflect.DeepEqual(sessionState.Conv.SchemaIssues[spannerTable.Id]["c3"], expected) { + t.Errorf("hotspotTimestamp failed, expected: %v, got: %v", expected, sessionState.Conv.SchemaIssues[spannerTable.Id][spannerTable.Id]) + } + fmt.Println("++++++", sessionState.Conv.SchemaIssues[spannerTable.Id]["c3"]) } +*/ From a87af08e7ee31fa74d11eaf8b553e0d223dd1e3f Mon Sep 17 00:00:00 2001 From: akashkumarsearce Date: Fri, 24 Feb 2023 15:34:01 +0530 Subject: [PATCH 8/8] testing autoincrement and change in hotspot.go --- webv2/primarykey/hotspot.go | 2 +- webv2/primarykey/hotspot_test.go | 124 +++++++++++++++++-------------- 2 files changed, 68 insertions(+), 58 deletions(-) diff --git a/webv2/primarykey/hotspot.go b/webv2/primarykey/hotspot.go index 2ce04d93d..af75ee862 100644 --- a/webv2/primarykey/hotspot.go +++ b/webv2/primarykey/hotspot.go @@ -71,7 +71,7 @@ func hotspotAutoincrement(insert []ddl.IndexKey, spannerTable ddl.CreateTable) { for i := 0; i < len(insert); i++ { for _, c := range spannerTable.ColDefs { - if insert[i].ColId == c.Name { + if insert[i].ColId == c.Id { spannerColumnId := c.Id detecthotspotAutoincrement(spannerTable, spannerColumnId) } diff --git a/webv2/primarykey/hotspot_test.go b/webv2/primarykey/hotspot_test.go index b20b52344..924a4c70b 100644 --- a/webv2/primarykey/hotspot_test.go +++ b/webv2/primarykey/hotspot_test.go @@ -5,13 +5,14 @@ import ( "testing" "github.com/cloudspannerecosystem/harbourbridge/internal" + "github.com/cloudspannerecosystem/harbourbridge/schema" "github.com/cloudspannerecosystem/harbourbridge/spanner/ddl" "github.com/cloudspannerecosystem/harbourbridge/webv2/session" ) func TestDetectHotspot(t *testing.T) { input1 := []ddl.CreateTable{{ - Name: "Hotspot_t1", + Name: "TimeStamp_t1", Id: "t1", ColIds: []string{"c1", "c2", "c3"}, ColDefs: map[string]ddl.ColumnDef{ @@ -22,85 +23,94 @@ func TestDetectHotspot(t *testing.T) { PrimaryKeys: []ddl.IndexKey{{ColId: "c3", Order: 1, Desc: false}, {ColId: "c2", Order: 2, Desc: false}}, }, { - Name: "Hotspot_t2", - Id: "t2", - ColIds: []string{"c1", "c2", "c3"}, + Name: "AutoIncrement_t2", + Id: "t1", + ColIds: []string{"c1"}, ColDefs: map[string]ddl.ColumnDef{ "c1": {Name: "film_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c1"}, - "c2": {Name: "actor_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c2"}, - "c3": {Name: "last_update", T: ddl.Type{Name: ddl.Timestamp, Len: ddl.MaxLength}, Id: "c3"}, }, - PrimaryKeys: []ddl.IndexKey{{ColId: "c3", Order: 1, Desc: false}, {ColId: "c2", Order: 2, Desc: false}}, + PrimaryKeys: []ddl.IndexKey{{ColId: "c1", Order: 1, Desc: false}}, }, } sessionState := session.GetSessionState() + sourcetable := schema.Table{ + Name: "t1", + Schema: "s", + ColIds: []string{"c1"}, + ColDefs: map[string]schema.Column{ + "c1": {Name: "film_id", Type: schema.Type{Name: ddl.String}, Id: "c1", Ignored: schema.Ignored{AutoIncrement: true}}, + }, + PrimaryKeys: []schema.Key{{ColId: "c1", Order: 1, Desc: false}}, + } + + //sourcetable := sessionState.Conv.SrcSchema[] sessionState.Conv = &internal.Conv{ SpSchema: ddl.Schema{ - "t1": input1[0], - "t2": input1[1], + "t1": input1[1], + //"t2": input1[1], + }, + SrcSchema: map[string]schema.Table{ + "t1": sourcetable, }, SchemaIssues: map[string]map[string][]internal.SchemaIssue{ "t1": {}, - "t2": {}, + //"t2": {}, }, } - for _, input := range input1 { + for i, input := range input1 { + if i != 1 { + continue + } isHotSpot(input.PrimaryKeys, input) - if input.ColDefs["c3"].T.Name == ddl.Timestamp { - expected := []internal.SchemaIssue{internal.HotspotTimestamp} - if !reflect.DeepEqual(sessionState.Conv.SchemaIssues[input.Id]["c3"], expected) { - t.Errorf("hotspotTimestamp failed, expected: %v, got: %v", expected, sessionState.Conv.SchemaIssues[input.Id][input.Id]) - } + expected := []internal.SchemaIssue{internal.HotspotAutoIncrement} + if !reflect.DeepEqual(sessionState.Conv.SchemaIssues[input.Id]["c1"], expected) { + t.Errorf("hotspotTimestamp failed, expected: %v, got: %v", expected, sessionState.Conv.SchemaIssues[input.Id][input.Id]) } - /*if input.ColDefs["c3"].T.Name == ddl.Autoincrement { - expected := []internal.SchemaIssue{internal.HotspotAutoIncrement} - if !reflect.DeepEqual(sessionState.Conv.SchemaIssues[input.Id]["c3"], expected) { - t.Errorf("hotspotTimestamp failed, expected: %v, got: %v", expected, sessionState.Conv.SchemaIssues[input.Id][input.Id]) - } - - }*/ } + } /* -func TestHotspotTimestamp(t *testing.T) { - // Create test data - insert := []ddl.IndexKey{ - {ColId: "c3", Desc: false, Order: 1}, - {ColId: "c2", Desc: false, Order: 2}, - } - spannerTable := ddl.CreateTable{ - Name: "hotspot_t1", - Id: "t1", - ColIds: []string{"c1", "c2", "c3"}, - ColDefs: map[string]ddl.ColumnDef{ - "c1": {Name: "film_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c1"}, - "c2": {Name: "actor_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c2"}, - "c3": {Name: "last_update", T: ddl.Type{Name: ddl.Timestamp, Len: ddl.MaxLength}, Id: "c3"}, - }, - PrimaryKeys: []ddl.IndexKey{{ColId: "c3", Order: 1, Desc: false}, {ColId: "c2", Order: 2, Desc: false}}, - } +func TestDetecthotspotAutoincrement(t *testing.T) { + // Define test input + spannerTable := ddl.CreateTable{ + Name: "film_actor", + ColIds: []string{"c1", "c2", "c3"}, + ColDefs: map[string]ddl.ColumnDef{ + "c1": {Name: "film_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c1"}, + "c2": {Name: "actor_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c2"}, + "c3": {Name: "last_update", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c3"}, + }, + PrimaryKeys: []ddl.IndexKey{{ColId: "c1", Order: 1, Desc: true}, {ColId: "c2", Order: 2, Desc: true}}, + Id: "t1", + } - sessionState := session.GetSessionState() - sessionState.Conv = &internal.Conv{ - SpSchema: ddl.Schema{ - "t1": spannerTable, - }, - SchemaIssues: map[string]map[string][]internal.SchemaIssue{ - "t1": {}, - }, - } - // Call the function - hotspotTimestamp(insert, spannerTable) + spannerColumnId := "c1" - // Verify the results - expected := []internal.SchemaIssue{internal.HotspotTimestamp} - if !reflect.DeepEqual(sessionState.Conv.SchemaIssues[spannerTable.Id]["c3"], expected) { - t.Errorf("hotspotTimestamp failed, expected: %v, got: %v", expected, sessionState.Conv.SchemaIssues[spannerTable.Id][spannerTable.Id]) - } - fmt.Println("++++++", sessionState.Conv.SchemaIssues[spannerTable.Id]["c3"]) + sessionState := session.GetSessionState() + sessionState.Conv.SrcSchema = map[string]ddl.CreateTable{ + "t1":{ + Name: "film_actor", + ColDefs: map[string]ddl.ColumnDef{ + "c1": {Name: "film_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c1", Ignored: ddl.Ignored{AutoIncrement: true}}, + "c2": {Name: "actor_id", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c2"}, + "c3": {Name: "last_update", T: ddl.Type{Name: ddl.String, Len: ddl.MaxLength}, Id: "c3"}, + }, + Id: "t1", + }, + }, + + // Call the function being tested + detecthotspotAutoincrement(spannerTable, spannerColumnId) + + // Check the output for correctness + schemaIssue := sessionState.Conv.SchemaIssues[spannerTable.Id][spannerColumnId] + expectedSchemaIssue := []internal.SchemaIssue{internal.HotspotAutoIncrement} + if !reflect.DeepEqual(schemaIssue, expectedSchemaIssue) { + t.Errorf("detecthotspotAutoincrement(%v, %v) = %v, expected %v", spannerTable, spannerColumnId, schemaIssue, expectedSchemaIssue) + } } */