From e908ef97131ed9d16eba7afca4686c4c09539cac Mon Sep 17 00:00:00 2001 From: sxwebdev Date: Sat, 13 Apr 2024 08:08:10 -0700 Subject: [PATCH] add drop table --- Makefile | 2 + drop_table.go | 51 ++++++++++ go.mod | 8 ++ go.sum | 10 ++ select.go | 7 +- tsdbbuilder_test.go | 229 +++++++++++++++++++++++++++++++------------- 6 files changed, 239 insertions(+), 68 deletions(-) create mode 100644 Makefile create mode 100644 drop_table.go create mode 100644 go.sum diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..414ac5b --- /dev/null +++ b/Makefile @@ -0,0 +1,2 @@ +tests: + go test -v ./... diff --git a/drop_table.go b/drop_table.go new file mode 100644 index 0000000..9260158 --- /dev/null +++ b/drop_table.go @@ -0,0 +1,51 @@ +package tsbuilder + +import ( + "bytes" + "fmt" + "strings" +) + +var _ tdEngineSqlBuilder = (*dropTableBuilder)(nil) + +type dropTableBuilder struct { + tables []string +} + +func NewDropTableBuilder() *dropTableBuilder { + return &dropTableBuilder{ + tables: make([]string, 0), + } +} + +func (s *dropTableBuilder) Tables(tables ...string) *dropTableBuilder { + s.tables = append(s.tables, tables...) + return s +} + +func (s *dropTableBuilder) Build() (string, error) { + if err := s.validate(); err != nil { + return "", fmt.Errorf("validate error: %w", err) + } + + b := bytes.NewBuffer([]byte{}) + b.WriteString("DROP TABLE ") + + for idx, table := range s.tables { + s.tables[idx] = "IF EXISTS " + table + } + + b.WriteString(strings.Join(s.tables, ", ")) + + b.WriteString(";") + + return b.String(), nil +} + +func (s *dropTableBuilder) validate() error { + if len(s.tables) == 0 { + return fmt.Errorf("tables are required") + } + + return nil +} diff --git a/go.mod b/go.mod index f3147e4..ed2f204 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,11 @@ module github.com/tkcrm/tsbuilder go 1.18 + +require github.com/stretchr/testify v1.9.0 + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..60ce688 --- /dev/null +++ b/go.sum @@ -0,0 +1,10 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/select.go b/select.go index 62c4061..9bd7ae1 100644 --- a/select.go +++ b/select.go @@ -126,12 +126,15 @@ func (s *selectBuilder) Build() (string, error) { // add offset if s.offset != nil { - b.WriteString(fmt.Sprintf("OFFSET %d", *s.offset) + " ") + b.WriteString(fmt.Sprintf("OFFSET %d", *s.offset)) } // add soffset if s.soffset != nil { - b.WriteString(fmt.Sprintf("SOFFSET %d", *s.soffset) + " ") + if s.offset != nil { + b.WriteString(" ") + } + b.WriteString(fmt.Sprintf("SOFFSET %d", *s.soffset)) } b.WriteString(";") diff --git a/tsdbbuilder_test.go b/tsdbbuilder_test.go index e8491a8..72d52e3 100644 --- a/tsdbbuilder_test.go +++ b/tsdbbuilder_test.go @@ -4,26 +4,43 @@ import ( "fmt" "testing" + "github.com/stretchr/testify/require" "github.com/tkcrm/tsbuilder" "github.com/tkcrm/tsbuilder/tsfuncs" ) func Test_Create(t *testing.T) { - b := tsbuilder.NewCreateTableBuilder(). - TableName("test_table"). - STable("s_table_name"). - Tags(map[string]any{ - "test": tsfuncs.Binary("16"), - "test2": tsfuncs.Binary("24"), - "test3": 3, - }) - - sql, err := b.Build() - if err != nil { - t.Fatal(err) + tests := []struct { + name string + stable string + tags map[string]any + expect string + }{ + { + name: "table_name", + stable: "s_table_name", + tags: map[string]any{ + "test": tsfuncs.Binary("16"), + "test2": tsfuncs.Binary("24"), + "test3": 3, + }, + expect: "CREATE TABLE IF NOT EXISTS table_name USING s_table_name (test, test2, test3) TAGS (BINARY(16), BINARY(24), 3);", + }, } - fmt.Println(sql) + for _, tc := range tests { + t.Run("", func(t *testing.T) { + b := tsbuilder.NewCreateTableBuilder(). + TableName(tc.name). + STable(tc.stable). + Tags(tc.tags) + + sql, err := b.Build() + require.NoError(t, err) + + require.Equal(t, tc.expect, sql) + }) + } } func Test_Insert(t *testing.T) { @@ -67,78 +84,158 @@ func Test_Insert(t *testing.T) { } func Test_Delete(t *testing.T) { - b := tsbuilder.NewDeleteBuilder(). - From("dbName.test_table"). - Where( - "asasd > asd", - "asdfasdf <= 1212", - ) - - sql, err := b.Build() - if err != nil { - t.Fatal(err) + tests := []struct { + from string + wheres []string + expect string + }{ + { + from: "dbName.test_table", + wheres: []string{"asasd > asd", "asdfasdf <= 1212"}, + expect: "DELETE FROM dbName.test_table WHERE asasd > asd AND asdfasdf <= 1212;", + }, } - fmt.Println(sql) + for _, tc := range tests { + t.Run("", func(t *testing.T) { + b := tsbuilder.NewDeleteBuilder(). + From(tc.from). + Where(tc.wheres...) + + sql, err := b.Build() + require.NoError(t, err) + + require.Equal(t, tc.expect, sql) + }) + } } func Test_Select(t *testing.T) { limit := uint64(10) offset := uint64(0) - b := tsbuilder.NewSelectBuilder(). - Columns("col_1", "col_2", "col_3"). - From("dbName.test_table"). - Where( - "asasd > asd", - "asdfasdf <= 1212", - ). - OrderBy("ts desc"). - Limit(&limit). - Offset(&offset) - - sql, err := b.Build() - if err != nil { - t.Fatal(err) + tests := []struct { + columns []string + from string + wheres []string + orderBy string + limit uint64 + offset uint64 + expect string + }{ + { + columns: []string{"col_1", "col_2", "col_3"}, + from: "dbName.test_table", + wheres: []string{"asasd > asd", "asdfasdf <= 1212"}, + orderBy: "ts desc", + limit: 10, + offset: 0, + expect: "SELECT col_1, col_2, col_3 FROM dbName.test_table WHERE asasd > asd AND asdfasdf <= 1212 ORDER BY ts desc LIMIT 10 OFFSET 0;", + }, } - fmt.Println(sql) + for _, tc := range tests { + t.Run("", func(t *testing.T) { + b := tsbuilder.NewSelectBuilder(). + Columns(tc.columns...). + From(tc.from). + Where(tc.wheres...). + OrderBy(tc.orderBy). + Limit(&limit). + Offset(&offset) + + sql, err := b.Build() + require.NoError(t, err) + + require.Equal(t, tc.expect, sql) + }) + } } func Test_Database(t *testing.T) { - b := tsbuilder.NewDatabaseBuilder(). - Name("db_name"). - Options( - "adsasd 12", - "fasasdas true", - ) - - sql, err := b.Build() - if err != nil { - t.Fatal(err) + tests := []struct { + name string + options []string + expect string + }{ + { + name: "db_name", + options: []string{"adsasd 12", "fasasdas true"}, + expect: "CREATE DATABASE IF NOT EXISTS db_name adsasd 12 fasasdas true;", + }, } - fmt.Println(sql) + for _, tc := range tests { + t.Run("", func(t *testing.T) { + b := tsbuilder.NewDatabaseBuilder(). + Name(tc.name). + Options(tc.options...) + + sql, err := b.Build() + require.NoError(t, err) + + require.Equal(t, tc.expect, sql) + }) + } } func Test_STable(t *testing.T) { - b := tsbuilder.NewSTableBuilder(). - Name("s_table_name"). - Definitions("vasdvasdv", "caqwqdw"). - Tags(map[string]any{ - "tag_1": 1, - "tag_2": 2, - "tag_3": 3, - }). - Options( - "adsasd 12", - "fasasdas true", - ) + tests := []struct { + name string + definitions []string + tags map[string]any + options []string + expect string + }{ + { + name: "s_table_name", + definitions: []string{"vasdvasdv", "caqwqdw"}, + tags: map[string]any{ + "tag_1": 1, + "tag_2": 2, + "tag_3": 3, + }, + options: []string{"adsasd 12", "fasasdas true"}, + expect: "CREATE STABLE IF NOT EXISTS s_table_name (vasdvasdv, caqwqdw) TAGS (tag_1 1, tag_2 2, tag_3 3) adsasd 12 fasasdas true;", + }, + } - sql, err := b.Build() - if err != nil { - t.Fatal(err) + for _, tc := range tests { + t.Run("", func(t *testing.T) { + b := tsbuilder.NewSTableBuilder(). + Name(tc.name). + Definitions(tc.definitions...). + Tags(tc.tags). + Options(tc.options...) + + sql, err := b.Build() + require.NoError(t, err) + + require.Equal(t, tc.expect, sql) + }) + } +} + +func Test_DropTable(t *testing.T) { + tests := []struct { + tables []string + expect string + }{ + { + tables: []string{"db_name.test_table", "db_name.test_table_2"}, + expect: "DROP TABLE IF EXISTS db_name.test_table, IF EXISTS db_name.test_table_2;", + }, } - fmt.Println(sql) + for _, tc := range tests { + t.Run("", func(t *testing.T) { + b := tsbuilder.NewDropTableBuilder(). + Tables(tc.tables...) + + sql, err := b.Build() + require.NoError(t, err) + + require.Equal(t, tc.expect, sql) + }) + } }