Move statement out
This commit is contained in:
parent
94e06eb2f8
commit
24ed796198
30
api.go
30
api.go
@ -1,9 +1,5 @@
|
|||||||
package gorm
|
package gorm
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/jinzhu/gorm/builder"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Where add condition
|
// Where add condition
|
||||||
func (s *DB) Where(query interface{}, args ...interface{}) *DB {
|
func (s *DB) Where(query interface{}, args ...interface{}) *DB {
|
||||||
tx := s.init()
|
tx := s.init()
|
||||||
@ -14,21 +10,21 @@ func (s *DB) Where(query interface{}, args ...interface{}) *DB {
|
|||||||
// Not add NOT condition
|
// Not add NOT condition
|
||||||
func (s *DB) Not(query interface{}, args ...interface{}) *DB {
|
func (s *DB) Not(query interface{}, args ...interface{}) *DB {
|
||||||
tx := s.init()
|
tx := s.init()
|
||||||
tx.Statement.AddConditions(builder.Not(tx.Statement.BuildCondition(query, args...)))
|
tx.Statement.AddConditions(Not(tx.Statement.BuildCondition(query, args...)))
|
||||||
return tx
|
return tx
|
||||||
}
|
}
|
||||||
|
|
||||||
// And add AND conditions
|
// And add AND conditions
|
||||||
func (s *DB) And(conds ...builder.Condition) *DB {
|
func (s *DB) And(conds ...ConditionInterface) *DB {
|
||||||
tx := s.init()
|
tx := s.init()
|
||||||
tx.Statement.AddConditions(builder.And(conds))
|
tx.Statement.AddConditions(And(conds))
|
||||||
return tx
|
return tx
|
||||||
}
|
}
|
||||||
|
|
||||||
// Or add OR conditions
|
// Or add OR conditions
|
||||||
func (s *DB) Or(conds ...builder.Condition) *DB {
|
func (s *DB) Or(conds ...ConditionInterface) *DB {
|
||||||
tx := s.init()
|
tx := s.init()
|
||||||
tx.Statement.AddConditions(builder.Or(conds))
|
tx.Statement.AddConditions(Or(conds))
|
||||||
return tx
|
return tx
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -37,7 +33,7 @@ func (s *DB) Or(conds ...builder.Condition) *DB {
|
|||||||
func (s *DB) Joins(query string, args ...interface{}) *DB {
|
func (s *DB) Joins(query string, args ...interface{}) *DB {
|
||||||
tx := s.init()
|
tx := s.init()
|
||||||
// FIXME
|
// FIXME
|
||||||
tx.Statement.Joins = append(tx.Statement.Joins, builder.Join{Conditions: []builder.Condition{tx.Statement.BuildCondition(query, args...)}})
|
tx.Statement.Joins = append(tx.Statement.Joins, Join{Conditions: []ConditionInterface{tx.Statement.BuildCondition(query, args...)}})
|
||||||
return tx
|
return tx
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -67,7 +63,7 @@ func (s *DB) Order(value interface{}) *DB {
|
|||||||
// Reorder works like Order, but will overwrite current order information
|
// Reorder works like Order, but will overwrite current order information
|
||||||
func (s *DB) Reorder(value interface{}) *DB {
|
func (s *DB) Reorder(value interface{}) *DB {
|
||||||
tx := s.init()
|
tx := s.init()
|
||||||
tx.Statement.OrderBy = []builder.OrderCondition{value}
|
tx.Statement.OrderBy = []OrderCondition{value}
|
||||||
return tx
|
return tx
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,7 +114,7 @@ func (s *DB) Omit(columns ...string) *DB {
|
|||||||
|
|
||||||
// First find first record that match given conditions, order by primary key
|
// First find first record that match given conditions, order by primary key
|
||||||
func (s *DB) First(out interface{}, where ...interface{}) *DB {
|
func (s *DB) First(out interface{}, where ...interface{}) *DB {
|
||||||
conds := []interface{}{builder.Limit{Limit: &one}, builder.Settings{"gorm:order_by_primary_key": "ASC"}}
|
conds := []interface{}{Limit{Limit: &one}, Settings{"gorm:order_by_primary_key": "ASC"}}
|
||||||
if len(where) > 0 {
|
if len(where) > 0 {
|
||||||
conds = append(conds, s.Statement.BuildCondition(where[0], where[1:]...))
|
conds = append(conds, s.Statement.BuildCondition(where[0], where[1:]...))
|
||||||
}
|
}
|
||||||
@ -127,7 +123,7 @@ func (s *DB) First(out interface{}, where ...interface{}) *DB {
|
|||||||
|
|
||||||
// Take return a record that match given conditions, the order will depend on the database implementation
|
// Take return a record that match given conditions, the order will depend on the database implementation
|
||||||
func (s *DB) Take(out interface{}, where ...interface{}) *DB {
|
func (s *DB) Take(out interface{}, where ...interface{}) *DB {
|
||||||
conds := []interface{}{builder.Limit{Limit: &one}}
|
conds := []interface{}{Limit{Limit: &one}}
|
||||||
if len(where) > 0 {
|
if len(where) > 0 {
|
||||||
conds = append(conds, s.Statement.BuildCondition(where[0], where[1:]...))
|
conds = append(conds, s.Statement.BuildCondition(where[0], where[1:]...))
|
||||||
}
|
}
|
||||||
@ -136,7 +132,7 @@ func (s *DB) Take(out interface{}, where ...interface{}) *DB {
|
|||||||
|
|
||||||
// Last find last record that match given conditions, order by primary key
|
// Last find last record that match given conditions, order by primary key
|
||||||
func (s *DB) Last(out interface{}, where ...interface{}) *DB {
|
func (s *DB) Last(out interface{}, where ...interface{}) *DB {
|
||||||
conds := []interface{}{builder.Limit{Limit: &one}, builder.Settings{"gorm:order_by_primary_key": "DESC"}}
|
conds := []interface{}{Limit{Limit: &one}, Settings{"gorm:order_by_primary_key": "DESC"}}
|
||||||
if len(where) > 0 {
|
if len(where) > 0 {
|
||||||
conds = append(conds, s.Statement.BuildCondition(where[0], where[1:]...))
|
conds = append(conds, s.Statement.BuildCondition(where[0], where[1:]...))
|
||||||
}
|
}
|
||||||
@ -196,7 +192,7 @@ func (s *DB) Save(value interface{}) *DB {
|
|||||||
// Update update attributes with callbacks, refer: https://jinzhu.github.io/gorm/crud.html#update
|
// Update update attributes with callbacks, refer: https://jinzhu.github.io/gorm/crud.html#update
|
||||||
func (s *DB) Update(column string, value interface{}) *DB {
|
func (s *DB) Update(column string, value interface{}) *DB {
|
||||||
tx := s.init()
|
tx := s.init()
|
||||||
tx.Statement.Assignments = append(tx.Statement.Assignments, builder.Assignment{Column: column, Value: value})
|
tx.Statement.Assignments = append(tx.Statement.Assignments, Assignment{Column: column, Value: value})
|
||||||
tx.AddError(tx.Dialect().Update(tx))
|
tx.AddError(tx.Dialect().Update(tx))
|
||||||
return tx
|
return tx
|
||||||
}
|
}
|
||||||
@ -204,7 +200,7 @@ func (s *DB) Update(column string, value interface{}) *DB {
|
|||||||
// Updates update attributes with callbacks, refer: https://jinzhu.github.io/gorm/crud.html#update
|
// Updates update attributes with callbacks, refer: https://jinzhu.github.io/gorm/crud.html#update
|
||||||
func (s *DB) Updates(values interface{}) *DB {
|
func (s *DB) Updates(values interface{}) *DB {
|
||||||
tx := s.init()
|
tx := s.init()
|
||||||
tx.Statement.Assignments = append(tx.Statement.Assignments, builder.Assignment{Value: values})
|
tx.Statement.Assignments = append(tx.Statement.Assignments, Assignment{Value: values})
|
||||||
tx.AddError(tx.Dialect().Update(tx))
|
tx.AddError(tx.Dialect().Update(tx))
|
||||||
return tx
|
return tx
|
||||||
}
|
}
|
||||||
@ -305,7 +301,7 @@ func (s *DB) init() *DB {
|
|||||||
if s.Statement == nil {
|
if s.Statement == nil {
|
||||||
return &DB{
|
return &DB{
|
||||||
TxDialect: s.TxDialect,
|
TxDialect: s.TxDialect,
|
||||||
Statement: &builder.Statement{},
|
Statement: &Statement{},
|
||||||
Config: s.Config,
|
Config: s.Config,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,60 +0,0 @@
|
|||||||
package builder
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// Comparison Operators
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
// Raw raw sql
|
|
||||||
type Raw struct {
|
|
||||||
Value string
|
|
||||||
Args []interface{} // TODO NamedArg
|
|
||||||
}
|
|
||||||
|
|
||||||
// Eq equal to
|
|
||||||
type Eq struct {
|
|
||||||
Column Column
|
|
||||||
Value interface{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Neq not equal to
|
|
||||||
type Neq struct {
|
|
||||||
Column Column
|
|
||||||
Value interface{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Gt greater than
|
|
||||||
type Gt struct {
|
|
||||||
Column Column
|
|
||||||
Value interface{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Gte greater than or equal to
|
|
||||||
type Gte struct {
|
|
||||||
Column Column
|
|
||||||
Value interface{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Lt less than
|
|
||||||
type Lt struct {
|
|
||||||
Column Column
|
|
||||||
Value interface{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Lte less than or equal to
|
|
||||||
type Lte struct {
|
|
||||||
Column Column
|
|
||||||
Value interface{}
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// Logical Operators
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
// And TRUE if all the conditions is TRUE
|
|
||||||
type And []Condition
|
|
||||||
|
|
||||||
// Not TRUE if condition is false
|
|
||||||
type Not Condition
|
|
||||||
|
|
||||||
// Or TRUE if any of the conditions is TRUE
|
|
||||||
type Or []Condition
|
|
@ -1,95 +0,0 @@
|
|||||||
package builder
|
|
||||||
|
|
||||||
import "sync"
|
|
||||||
|
|
||||||
// Column column type
|
|
||||||
type Column = string
|
|
||||||
|
|
||||||
// Statement GORM statement
|
|
||||||
type Statement struct {
|
|
||||||
Dest interface{} // Insert, Select, Update, Delete
|
|
||||||
Table interface{} // Insert, Select, Update, Delete
|
|
||||||
Select SelectColumn // Insert, Select, Update
|
|
||||||
Omit []Column // Insert, Select, Update
|
|
||||||
Joins []Join // Select
|
|
||||||
GroupBy GroupBy // Select
|
|
||||||
OrderBy OrderBy // Select
|
|
||||||
Preload []Column // Select
|
|
||||||
Limit Limit // Select, Update
|
|
||||||
Conditions []Condition // Select, Update, Delete
|
|
||||||
Assignments []Assignment // Insert, Update
|
|
||||||
Returnnings []Column // Insert, Update, Delete
|
|
||||||
Settings sync.Map
|
|
||||||
}
|
|
||||||
|
|
||||||
// Condition query condition statement interface
|
|
||||||
type Condition interface {
|
|
||||||
// ToSQL()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Settings settings
|
|
||||||
type Settings map[string]interface{}
|
|
||||||
|
|
||||||
// DefaultValue default value type
|
|
||||||
type DefaultValue string
|
|
||||||
|
|
||||||
// SelectColumn select columns
|
|
||||||
type SelectColumn struct {
|
|
||||||
Columns []string
|
|
||||||
Args []interface{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Join join statement
|
|
||||||
type Join struct {
|
|
||||||
Table string
|
|
||||||
LocalField string
|
|
||||||
ForeignField string
|
|
||||||
Conditions []Condition
|
|
||||||
}
|
|
||||||
|
|
||||||
// GroupBy group by statement
|
|
||||||
type GroupBy struct {
|
|
||||||
GroupByColumns []string
|
|
||||||
Having []Condition
|
|
||||||
}
|
|
||||||
|
|
||||||
// OrderCondition order condition, could be string or sql expr
|
|
||||||
type OrderCondition interface{}
|
|
||||||
|
|
||||||
// OrderBy order by statement
|
|
||||||
type OrderBy []OrderCondition
|
|
||||||
|
|
||||||
// OrderByColumn column used for order
|
|
||||||
type OrderByColumn struct {
|
|
||||||
Name string
|
|
||||||
Asc bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// Limit limit statement
|
|
||||||
type Limit struct {
|
|
||||||
Limit *int64
|
|
||||||
Offset *int64
|
|
||||||
}
|
|
||||||
|
|
||||||
// Assignment assign statement
|
|
||||||
type Assignment struct {
|
|
||||||
Column Column
|
|
||||||
Value interface{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clone clone current statement
|
|
||||||
func (stmt *Statement) Clone() *Statement {
|
|
||||||
newStatement := *stmt
|
|
||||||
// FIXME fix settings
|
|
||||||
return &newStatement
|
|
||||||
}
|
|
||||||
|
|
||||||
// BuildCondition build condition
|
|
||||||
func (stmt *Statement) BuildCondition(query interface{}, args ...interface{}) Condition {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddConditions add conditions
|
|
||||||
func (stmt *Statement) AddConditions(conds ...Condition) {
|
|
||||||
stmt.Conditions = append(stmt.Conditions, conds...)
|
|
||||||
}
|
|
3
gorm.go
3
gorm.go
@ -3,7 +3,6 @@ package gorm
|
|||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/jinzhu/gorm/builder"
|
|
||||||
"github.com/jinzhu/gorm/logger"
|
"github.com/jinzhu/gorm/logger"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -29,7 +28,7 @@ type Config struct {
|
|||||||
// DB GORM DB definition
|
// DB GORM DB definition
|
||||||
type DB struct {
|
type DB struct {
|
||||||
TxDialect Dialect
|
TxDialect Dialect
|
||||||
Statement *builder.Statement
|
Statement *Statement
|
||||||
|
|
||||||
// Global config
|
// Global config
|
||||||
Config *Config
|
Config *Config
|
||||||
|
159
statement.go
Normal file
159
statement.go
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
package gorm
|
||||||
|
|
||||||
|
import "sync"
|
||||||
|
|
||||||
|
// Column column type
|
||||||
|
type Column = string
|
||||||
|
|
||||||
|
// Statement GORM statement
|
||||||
|
type Statement struct {
|
||||||
|
Dest interface{} // Insert, Select, Update, Delete
|
||||||
|
Table interface{} // Insert, Select, Update, Delete
|
||||||
|
Select SelectColumn // Insert, Select, Update
|
||||||
|
Omit []Column // Insert, Select, Update
|
||||||
|
Joins []Join // Select
|
||||||
|
GroupBy GroupBy // Select
|
||||||
|
OrderBy OrderBy // Select
|
||||||
|
Preload []Column // Select
|
||||||
|
Limit Limit // Select, Update
|
||||||
|
Conditions []ConditionInterface // Select, Update, Delete
|
||||||
|
Assignments []Assignment // Insert, Update
|
||||||
|
Returnnings []Column // Insert, Update, Delete
|
||||||
|
Settings sync.Map
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConditionInterface query condition statement interface
|
||||||
|
type ConditionInterface interface{}
|
||||||
|
|
||||||
|
// Settings settings
|
||||||
|
type Settings map[string]interface{}
|
||||||
|
|
||||||
|
// DefaultValue default value type
|
||||||
|
type DefaultValue string
|
||||||
|
|
||||||
|
// SelectColumn select columns
|
||||||
|
type SelectColumn struct {
|
||||||
|
Columns []string
|
||||||
|
Args []interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Join join statement
|
||||||
|
type Join struct {
|
||||||
|
Table string
|
||||||
|
LocalField string
|
||||||
|
ForeignField string
|
||||||
|
Conditions []ConditionInterface
|
||||||
|
}
|
||||||
|
|
||||||
|
// GroupBy group by statement
|
||||||
|
type GroupBy struct {
|
||||||
|
GroupByColumns []string
|
||||||
|
Having []ConditionInterface
|
||||||
|
}
|
||||||
|
|
||||||
|
// OrderCondition order condition, could be string or sql expr
|
||||||
|
type OrderCondition interface{}
|
||||||
|
|
||||||
|
// OrderBy order by statement
|
||||||
|
type OrderBy []OrderCondition
|
||||||
|
|
||||||
|
// OrderByColumn column used for order
|
||||||
|
type OrderByColumn struct {
|
||||||
|
Name string
|
||||||
|
Asc bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// Limit limit statement
|
||||||
|
type Limit struct {
|
||||||
|
Limit *int64
|
||||||
|
Offset *int64
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assignment assign statement
|
||||||
|
type Assignment struct {
|
||||||
|
Column Column
|
||||||
|
Value interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clone clone current statement
|
||||||
|
func (stmt *Statement) Clone() *Statement {
|
||||||
|
newStatement := *stmt
|
||||||
|
return &newStatement
|
||||||
|
}
|
||||||
|
|
||||||
|
// BuildCondition build condition
|
||||||
|
func (stmt *Statement) BuildCondition(query interface{}, args ...interface{}) ConditionInterface {
|
||||||
|
if sql, ok := query.(string); ok {
|
||||||
|
return Raw{Value: sql, Args: args}
|
||||||
|
}
|
||||||
|
|
||||||
|
andConds := And([]ConditionInterface{ConditionInterface(query)})
|
||||||
|
for _, arg := range args {
|
||||||
|
andConds = append(andConds, ConditionInterface(arg))
|
||||||
|
}
|
||||||
|
return andConds
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddConditions add conditions
|
||||||
|
func (stmt *Statement) AddConditions(conds ...ConditionInterface) {
|
||||||
|
stmt.Conditions = append(stmt.Conditions, conds...)
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Comparison Operators
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Raw raw sql
|
||||||
|
type Raw struct {
|
||||||
|
Value string
|
||||||
|
Args []interface{} // TODO NamedArg
|
||||||
|
}
|
||||||
|
|
||||||
|
// Eq equal to
|
||||||
|
type Eq struct {
|
||||||
|
Column Column
|
||||||
|
Value interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Neq not equal to
|
||||||
|
type Neq struct {
|
||||||
|
Column Column
|
||||||
|
Value interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gt greater than
|
||||||
|
type Gt struct {
|
||||||
|
Column Column
|
||||||
|
Value interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gte greater than or equal to
|
||||||
|
type Gte struct {
|
||||||
|
Column Column
|
||||||
|
Value interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lt less than
|
||||||
|
type Lt struct {
|
||||||
|
Column Column
|
||||||
|
Value interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lte less than or equal to
|
||||||
|
type Lte struct {
|
||||||
|
Column Column
|
||||||
|
Value interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Logical Operators
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// And TRUE if all the conditions is TRUE
|
||||||
|
type And []ConditionInterface
|
||||||
|
|
||||||
|
// Not TRUE if condition is false
|
||||||
|
type Not ConditionInterface
|
||||||
|
|
||||||
|
// Or TRUE if any of the conditions is TRUE
|
||||||
|
type Or []ConditionInterface
|
Loading…
x
Reference in New Issue
Block a user