Skip to content

Commit

Permalink
feat:support trim clause (#720)
Browse files Browse the repository at this point in the history
* feat:support trim clause

* feat:go version 1.18
  • Loading branch information
idersec authored Jan 4, 2023
1 parent 15d19c4 commit 8b6f628
Show file tree
Hide file tree
Showing 8 changed files with 158 additions and 17 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ jobs:
tests:
strategy:
matrix:
go: ['1.19', '1.18', '1.17', '1.16']
go: ['1.19', '1.18']
platform: [ubuntu-latest] # can not run in windows OS
runs-on: ${{ matrix.platform }}

Expand All @@ -39,7 +39,7 @@ jobs:
strategy:
matrix:
dbversion: ['mysql:5.7', 'mysql:latest']
go: ['1.19', '1.18', '1.17', '1.16']
go: ['1.19', '1.18']
platform: [ubuntu-latest]
runs-on: ${{ matrix.platform }}

Expand Down
28 changes: 24 additions & 4 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
module gorm.io/gen

go 1.16
go 1.18

require (
github.com/pkg/errors v0.9.1 // indirect
golang.org/x/crypto v0.0.0-20221005025214-4161e89ecf1b // indirect
golang.org/x/sys v0.0.0-20221006211917-84dc82d7e875 // indirect
golang.org/x/tools v0.1.12
gopkg.in/yaml.v3 v3.0.1
gorm.io/datatypes v1.0.7
Expand All @@ -17,3 +14,26 @@ require (
gorm.io/hints v1.1.0
gorm.io/plugin/dbresolver v1.3.0
)

require (
github.com/denisenkom/go-mssqldb v0.12.2 // indirect
github.com/go-sql-driver/mysql v1.6.0 // indirect
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect
github.com/golang-sql/sqlexp v0.1.0 // indirect
github.com/jackc/chunkreader/v2 v2.0.1 // indirect
github.com/jackc/pgconn v1.13.0 // indirect
github.com/jackc/pgio v1.0.0 // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgproto3/v2 v2.3.1 // indirect
github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect
github.com/jackc/pgtype v1.12.0 // indirect
github.com/jackc/pgx/v4 v4.17.2 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/mattn/go-sqlite3 v1.14.15 // indirect
github.com/pkg/errors v0.9.1 // indirect
golang.org/x/crypto v0.0.0-20221005025214-4161e89ecf1b // indirect
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect
golang.org/x/sys v0.0.0-20221006211917-84dc82d7e875 // indirect
golang.org/x/text v0.3.7 // indirect
)
9 changes: 0 additions & 9 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+
github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A=
github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0=
github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo=
github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8=
Expand All @@ -52,7 +51,6 @@ github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5W
github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak=
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A=
github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78=
github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA=
github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg=
Expand Down Expand Up @@ -143,7 +141,6 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
Expand Down Expand Up @@ -183,9 +180,7 @@ golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLL
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
Expand All @@ -199,13 +194,10 @@ golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20221006211917-84dc82d7e875 h1:AzgQNqF+FKwyQ5LbVrVqOcuuFB67N47F9+htZYH0wFM=
golang.org/x/sys v0.0.0-20221006211917-84dc82d7e875/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
Expand All @@ -220,7 +212,6 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw
golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
Expand Down
6 changes: 6 additions & 0 deletions helper/clause.go
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,12 @@ func JoinSetBuilder(src *strings.Builder, setValue strings.Builder) {
}
}

// JoinTrimAllBuilder join trim builder, will trim and,or,xor, `,`
func JoinTrimAllBuilder(src *strings.Builder, setValue strings.Builder) {
src.WriteString(trimAll(setValue.String()))
src.WriteString(" ")
}

// JoinTblExpr join clause with table expression(sub query...)
type JoinTblExpr struct {
clause.Join
Expand Down
20 changes: 20 additions & 0 deletions internal/generate/clause.go
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,26 @@ func (s SetClause) Finish(name string) string {
return fmt.Sprintf("helper.JoinSetBuilder(&%s,%s)", name, s.VarName)
}

// TrimClause set clause
type TrimClause struct {
clause
Value []Clause
}

func (s TrimClause) String() string {
return fmt.Sprintf("helper.TrimALL(%s.String())", s.VarName)
}

// Create create trim clause
func (s TrimClause) Create() string {
return fmt.Sprintf("var %s strings.Builder", s.VarName)
}

// Finish finish trim clause
func (s TrimClause) Finish(name string) string {
return fmt.Sprintf("helper.JoinTrimAllBuilder(&%s,%s)", name, s.VarName)
}

// ForClause set clause
type ForClause struct {
clause
Expand Down
102 changes: 102 additions & 0 deletions internal/generate/section.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,13 @@ func (s *Section) BuildSQL() ([]Clause, error) {
}
res = append(res, setClause)
s.appendTmpl(setClause.Finish(name))
case model.TRIM:
trimClause, err := s.parseTrim()
if err != nil {
return nil, err
}
res = append(res, trimClause)
s.appendTmpl(trimClause.Finish(name))
case model.FOR:
forClause, err := s.parseFor(name)
_, _ = forClause, err
Expand Down Expand Up @@ -179,6 +186,14 @@ func (s *Section) parseIF(name string) (res IfClause, err error) {
}
res.Value = append(res.Value, forClause)
s.appendTmpl(res.Finish())
case model.TRIM:
var trimClause TrimClause
trimClause, err = s.parseTrim()
if err != nil {
return
}
res.Value = append(res.Value, trimClause)
s.appendTmpl(trimClause.Finish(name))
case model.END:
return
default:
Expand Down Expand Up @@ -250,6 +265,14 @@ func (s *Section) parseElSE(name string) (res ElseClause, err error) {
}
res.Value = append(res.Value, forClause)
s.appendTmpl(forClause.Finish())
case model.TRIM:
var trimClause TrimClause
trimClause, err = s.parseTrim()
if err != nil {
return
}
res.Value = append(res.Value, trimClause)
s.appendTmpl(trimClause.Finish(name))
default:
s.SubIndex()
return
Expand Down Expand Up @@ -295,6 +318,14 @@ func (s *Section) parseWhere() (res WhereClause, err error) {
}
res.Value = append(res.Value, forClause)
s.appendTmpl(forClause.Finish())
case model.TRIM:
var trimClause TrimClause
trimClause, err = s.parseTrim()
if err != nil {
return
}
res.Value = append(res.Value, trimClause)
s.appendTmpl(trimClause.Finish(res.VarName))
case model.END:
return
default:
Expand Down Expand Up @@ -323,6 +354,64 @@ func (s *Section) parseSet() (res SetClause, err error) {
}
c = s.next()

res.Type = c.Type
for {
switch c.Type {
case model.SQL, model.DATA, model.VARIABLE:
sqlClause := s.parseSQL(res.VarName)
res.Value = append(res.Value, sqlClause)
s.appendTmpl(sqlClause.Finish())
case model.IF:
var ifClause IfClause
ifClause, err = s.parseIF(res.VarName)
if err != nil {
return
}
res.Value = append(res.Value, ifClause)
s.appendTmpl(ifClause.Finish())
case model.FOR:
var forClause ForClause
forClause, err = s.parseFor(res.VarName)
if err != nil {
return
}
res.Value = append(res.Value, forClause)
s.appendTmpl(forClause.Finish())
case model.TRIM:
var trimClause TrimClause
trimClause, err = s.parseTrim()
if err != nil {
return
}
res.Value = append(res.Value, trimClause)
s.appendTmpl(trimClause.Finish(res.VarName))
case model.END:
return
default:
err = fmt.Errorf("unknow clause : %s", c.Value)
return
}
if !s.HasMore() {
break
}
c = s.next()
}
if c.isEnd() {
err = fmt.Errorf("incomplete SQL,set not end")
}
return
}

// parseTrim parse set clause, the clause' type must be one of if, SQL condition
func (s *Section) parseTrim() (res TrimClause, err error) {
c := s.current()
res.VarName = s.GetName(c.Type)
s.appendTmpl(res.Create())
if !s.HasMore() {
return
}
c = s.next()

res.Type = c.Type
for {
switch c.Type {
Expand Down Expand Up @@ -395,6 +484,14 @@ func (s *Section) parseFor(name string) (res ForClause, err error) {
}
res.Value = append(res.Value, forClause)
s.appendTmpl(forClause.Finish())
case model.TRIM:
var trimClause TrimClause
trimClause, err = s.parseTrim()
if err != nil {
return
}
res.Value = append(res.Value, trimClause)
s.appendTmpl(trimClause.Finish(name))
case model.END:
s.forValue = s.forValue[:len(s.forValue)-1]
return
Expand Down Expand Up @@ -469,6 +566,9 @@ func (s *Section) GetName(status model.Status) string {
case model.SET:
defer func() { s.ClauseTotal[model.SET]++ }()
return fmt.Sprintf("setSQL%d", s.ClauseTotal[model.SET])
case model.TRIM:
defer func() { s.ClauseTotal[model.TRIM]++ }()
return fmt.Sprintf("trimSQL%d", s.ClauseTotal[model.TRIM])
default:
return "generateSQL"
}
Expand Down Expand Up @@ -551,6 +651,8 @@ func (s *section) sectionType(str string) error {
s.Type = model.SET
case "end":
s.Type = model.END
case "trim":
s.Type = model.TRIM
default:
return fmt.Errorf("unknown syntax: %s", str)
}
Expand Down
2 changes: 2 additions & 0 deletions internal/model/base.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ const (
FOR
// END ...
END
// TRIM ...
TRIM
)

// SourceCode source code
Expand Down
4 changes: 2 additions & 2 deletions tests/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ module gorm.io/gen/tests
go 1.16

require (
golang.org/x/sys v0.1.0 // indirect
golang.org/x/mod v0.6.0 // indirect
gorm.io/driver/mysql v1.4.3
gorm.io/driver/sqlite v1.4.2
gorm.io/driver/sqlite v1.4.3
gorm.io/gen v0.3.16
gorm.io/gorm v1.24.0
gorm.io/hints v1.1.1 // indirect
Expand Down

0 comments on commit 8b6f628

Please sign in to comment.