Skip to content

Commit

Permalink
Implement clause.Expression interface for field.Expr (#750)
Browse files Browse the repository at this point in the history
  • Loading branch information
jinzhu authored Jan 31, 2023
1 parent a983af4 commit a2b98ad
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 19 deletions.
25 changes: 18 additions & 7 deletions do.go
Original file line number Diff line number Diff line change
Expand Up @@ -256,11 +256,16 @@ func (d *DO) Order(columns ...field.Expr) Dao {

func (d *DO) toOrderValue(columns ...field.Expr) string {
// eager build Columns
orderArray := make([]string, len(columns))
stmt := &gorm.Statement{DB: d.db.Statement.DB, Table: d.db.Statement.Table, Schema: d.db.Statement.Schema}

for i, c := range columns {
orderArray[i] = c.Build(d.db.Statement).String()
if i != 0 {
stmt.WriteByte(',')
}
c.Build(stmt)
}
return strings.Join(orderArray, ",")

return stmt.SQL.String()
}

// Distinct ...
Expand All @@ -281,11 +286,17 @@ func (d *DO) Group(columns ...field.Expr) Dao {
if len(columns) == 0 {
return d
}
name := string(columns[0].Build(d.db.Statement))
for _, col := range columns[1:] {
name += "," + string(col.Build(d.db.Statement))

stmt := &gorm.Statement{DB: d.db.Statement.DB, Table: d.db.Statement.Table, Schema: d.db.Statement.Schema}

for i, c := range columns {
if i != 0 {
stmt.WriteByte(',')
}
c.Build(stmt)
}
return d.getInstance(d.db.Group(name))

return d.getInstance(d.db.Group(stmt.SQL.String()))
}

// Having ...
Expand Down
16 changes: 10 additions & 6 deletions field/expr.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,12 @@ type AssignExpr interface {

// Expr a query expression about field
type Expr interface {
// Clause Expression interface
Build(clause.Builder)

As(alias string) Expr
ColumnName() sql
BuildColumn(*gorm.Statement, ...BuildOpt) sql
Build(*gorm.Statement) sql
BuildWithArgs(*gorm.Statement) (query sql, args []interface{})
RawExpr() expression

Expand Down Expand Up @@ -110,13 +112,15 @@ func (e expr) BuildColumn(stmt *gorm.Statement, opts ...BuildOpt) sql {
return sql(stmt.Quote(col))
}

func (e expr) Build(stmt *gorm.Statement) sql {
func (e expr) Build(builder clause.Builder) {
if e.e == nil {
return sql(e.BuildColumn(stmt, WithAll))
if stmt, ok := builder.(*gorm.Statement); ok {
builder.WriteString(string(e.BuildColumn(stmt, WithAll)))
return
}
}
newStmt := &gorm.Statement{DB: stmt.DB, Table: stmt.Table, Schema: stmt.Schema}
e.e.Build(newStmt)
return sql(newStmt.SQL.String())

e.e.Build(builder)
}

func (e expr) BuildWithArgs(stmt *gorm.Statement) (sql, []interface{}) {
Expand Down
14 changes: 8 additions & 6 deletions tests/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@ module gorm.io/gen/tests
go 1.16

require (
golang.org/x/mod v0.6.0 // indirect
gorm.io/driver/mysql v1.4.3
gorm.io/driver/sqlite v1.4.3
gorm.io/gen v0.3.16
gorm.io/gorm v1.24.0
github.com/mattn/go-sqlite3 v1.14.16 // indirect
golang.org/x/tools v0.5.0 // indirect
gorm.io/datatypes v1.1.0 // indirect
gorm.io/driver/mysql v1.4.5
gorm.io/driver/sqlite v1.4.4
gorm.io/gen v0.3.19
gorm.io/gorm v1.24.3
gorm.io/hints v1.1.1 // indirect
gorm.io/plugin/dbresolver v1.3.0
gorm.io/plugin/dbresolver v1.4.0
)

replace gorm.io/gen => ../

0 comments on commit a2b98ad

Please sign in to comment.