Skip to content

Commit 1f55da1

Browse files
committed
refactor: optimze generics field types and remove redundant field types
1 parent 0ace647 commit 1f55da1

File tree

15 files changed

+383
-419
lines changed

15 files changed

+383
-419
lines changed

field/bool.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ package field
22

33
// Bool boolean type field
44
type Bool struct {
5-
GenericsField[bool]
5+
genericsField[bool]
66
}
77

88
// Not ...
99
func (field Bool) Not() Bool {
10-
return Bool{GenericsField[bool]{field.not()}}
10+
return Bool{genericsField[bool]{field.not()}}
1111
}
1212

1313
// Is ...
@@ -17,32 +17,32 @@ func (field Bool) Is(value bool) Expr {
1717

1818
// And boolean and
1919
func (field Bool) And(value bool) Expr {
20-
return Bool{GenericsField[bool]{field.and(value)}}
20+
return Bool{genericsField[bool]{field.and(value)}}
2121
}
2222

2323
// Or boolean or
2424
func (field Bool) Or(value bool) Expr {
25-
return Bool{GenericsField[bool]{field.or(value)}}
25+
return Bool{genericsField[bool]{field.or(value)}}
2626
}
2727

2828
// Xor ...
2929
func (field Bool) Xor(value bool) Expr {
30-
return Bool{GenericsField[bool]{field.xor(value)}}
30+
return Bool{genericsField[bool]{field.xor(value)}}
3131
}
3232

3333
// BitXor ...
3434
func (field Bool) BitXor(value bool) Expr {
35-
return Bool{GenericsField[bool]{field.bitXor(value)}}
35+
return Bool{genericsField[bool]{field.bitXor(value)}}
3636
}
3737

3838
// BitAnd ...
3939
func (field Bool) BitAnd(value bool) Expr {
40-
return Bool{GenericsField[bool]{field.bitAnd(value)}}
40+
return Bool{genericsField[bool]{field.bitAnd(value)}}
4141
}
4242

4343
// BitOr ...
4444
func (field Bool) BitOr(value bool) Expr {
45-
return Bool{GenericsField[bool]{field.bitOr(value)}}
45+
return Bool{genericsField[bool]{field.bitOr(value)}}
4646
}
4747

4848
// Zero ...

field/export.go

Lines changed: 56 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"strings"
77
"time"
88

9+
"golang.org/x/exp/constraints"
910
"gorm.io/gorm"
1011
"gorm.io/gorm/clause"
1112
)
@@ -17,6 +18,12 @@ var (
1718
ALL = Star
1819
)
1920

21+
// ScanValuer interface for Field
22+
type ScanValuer interface {
23+
Scan(src interface{}) error // sql.Scanner
24+
Value() (driver.Value, error) // driver.Valuer
25+
}
26+
2027
// Option field option
2128
type Option func(clause.Column) clause.Column
2229

@@ -30,8 +37,8 @@ var (
3037
// ======================== generic field =======================
3138

3239
// NewField create new field
33-
func NewField(table, column string, opts ...Option) Field {
34-
return Field{GenericsField: GenericsField[driver.Valuer]{expr{col: toColumn(table, column, opts...)}}}
40+
func NewField(table, column string, opts ...Option) genericsField[driver.Valuer] {
41+
return genericsField[driver.Valuer]{expr{col: toColumn(table, column, opts...)}}
3542
}
3643

3744
// NewSerializer create new field2
@@ -46,92 +53,97 @@ func NewAsterisk(table string, opts ...Option) Asterisk {
4653

4754
// ======================== integer =======================
4855

49-
// NewInt create new Int
50-
func NewInt(table, column string, opts ...Option) Int {
51-
return Int{NewGenericsInt[int](expr{col: toColumn(table, column, opts...)})}
56+
// NewNumber build number type field
57+
func NewNumber[T constraints.Integer | constraints.Float](table, column string, opts ...Option) Number[T] {
58+
return newNumber[T](expr{col: toColumn(table, column, opts...)})
59+
}
60+
61+
// NewInt create new field for int
62+
func NewInt(table, column string, opts ...Option) Number[int] {
63+
return NewNumber[int](table, column, opts...)
5264
}
5365

54-
// NewInt8 create new Int8
55-
func NewInt8(table, column string, opts ...Option) Int8 {
56-
return Int8{NewGenericsInt[int8](expr{col: toColumn(table, column, opts...)})}
66+
// NewInt8 create new field for int8
67+
func NewInt8(table, column string, opts ...Option) Number[int8] {
68+
return NewNumber[int8](table, column, opts...)
5769
}
5870

59-
// NewInt16 ...
60-
func NewInt16(table, column string, opts ...Option) Int16 {
61-
return Int16{NewGenericsInt[int16](expr{col: toColumn(table, column, opts...)})}
71+
// NewInt16 create new field for int16
72+
func NewInt16(table, column string, opts ...Option) Number[int16] {
73+
return NewNumber[int16](table, column, opts...)
6274
}
6375

64-
// NewInt32 ...
65-
func NewInt32(table, column string, opts ...Option) Int32 {
66-
return Int32{NewGenericsInt[int32](expr{col: toColumn(table, column, opts...)})}
76+
// NewInt32 create new field for int32
77+
func NewInt32(table, column string, opts ...Option) Number[int32] {
78+
return NewNumber[int32](table, column, opts...)
6779
}
6880

69-
// NewInt64 ...
70-
func NewInt64(table, column string, opts ...Option) Int64 {
71-
return Int64{NewGenericsInt[int64](expr{col: toColumn(table, column, opts...)})}
81+
// NewInt64 create new field for int64
82+
func NewInt64(table, column string, opts ...Option) Number[int64] {
83+
return NewNumber[int64](table, column, opts...)
7284
}
7385

74-
// NewUint ...
75-
func NewUint(table, column string, opts ...Option) Uint {
76-
return Uint{NewGenericsInt[uint](expr{col: toColumn(table, column, opts...)})}
86+
// NewUint create new field for uint
87+
func NewUint(table, column string, opts ...Option) Number[uint] {
88+
return NewNumber[uint](table, column, opts...)
7789
}
7890

79-
// NewUint8 ...
80-
func NewUint8(table, column string, opts ...Option) Uint8 {
81-
return Uint8{NewGenericsInt[uint8](expr{col: toColumn(table, column, opts...)})}
91+
// NewUint8 create new field for uint8
92+
func NewUint8(table, column string, opts ...Option) Number[uint8] {
93+
return NewNumber[uint8](table, column, opts...)
8294
}
8395

84-
// NewUint16 ...
85-
func NewUint16(table, column string, opts ...Option) Uint16 {
86-
return Uint16{NewGenericsInt[uint16](expr{col: toColumn(table, column, opts...)})}
96+
// NewUint16 create new field for uint16
97+
func NewUint16(table, column string, opts ...Option) Number[uint16] {
98+
return NewNumber[uint16](table, column, opts...)
8799
}
88100

89-
// NewUint32 ...
90-
func NewUint32(table, column string, opts ...Option) Uint32 {
91-
return Uint32{NewGenericsInt[uint32](expr{col: toColumn(table, column, opts...)})}
101+
// NewUint32 create new field for uint32
102+
func NewUint32(table, column string, opts ...Option) Number[uint32] {
103+
return NewNumber[uint32](table, column, opts...)
92104
}
93105

94-
// NewUint64 ...
95-
func NewUint64(table, column string, opts ...Option) Uint64 {
96-
return Uint64{NewGenericsInt[uint64](expr{col: toColumn(table, column, opts...)})}
106+
// NewUint64 create new field for uint64
107+
func NewUint64(table, column string, opts ...Option) Number[uint64] {
108+
return NewNumber[uint64](table, column, opts...)
97109
}
98110

99111
// ======================== float =======================
100112

101-
// NewFloat32 ...
102-
func NewFloat32(table, column string, opts ...Option) Float32 {
103-
return Float32{NewGenericsInt[float32](expr{col: toColumn(table, column, opts...)})}
113+
// NewFloat32 create new field for float32
114+
func NewFloat32(table, column string, opts ...Option) Number[float32] {
115+
return NewNumber[float32](table, column, opts...)
104116
}
105117

106-
// NewFloat64 ...
107-
func NewFloat64(table, column string, opts ...Option) Float64 {
108-
return Float64{NewGenericsInt[float64](expr{col: toColumn(table, column, opts...)})}
118+
// NewFloat64 create new field for float64
119+
func NewFloat64(table, column string, opts ...Option) Number[float64] {
120+
return NewNumber[float64](table, column, opts...)
109121
}
110122

111123
// ======================== string =======================
112124

113125
// NewString ...
114-
func NewString(table, column string, opts ...Option) String {
115-
return String{NewGenericsString[string](expr{col: toColumn(table, column, opts...)})}
126+
func NewString(table, column string, opts ...Option) Chars[string] {
127+
return newChars[string](expr{col: toColumn(table, column, opts...)})
116128
}
117129

118130
// NewBytes ...
119-
func NewBytes(table, column string, opts ...Option) Bytes {
120-
return Bytes{NewGenericsString[[]byte](expr{col: toColumn(table, column, opts...)})}
131+
func NewBytes(table, column string, opts ...Option) Chars[[]byte] {
132+
return newChars[[]byte](expr{col: toColumn(table, column, opts...)})
121133
}
122134

123135
// ======================== bool =======================
124136

125137
// NewBool ...
126138
func NewBool(table, column string, opts ...Option) Bool {
127-
return Bool{NewGenerics[bool](expr{col: toColumn(table, column, opts...)})}
139+
return Bool{genericsField[bool]{expr{col: toColumn(table, column, opts...)}}}
128140
}
129141

130142
// ======================== time =======================
131143

132144
// NewTime ...
133145
func NewTime(table, column string, opts ...Option) Time {
134-
return Time{NewGenerics[time.Time](expr{col: toColumn(table, column, opts...)})}
146+
return Time{genericsField[time.Time]{expr{col: toColumn(table, column, opts...)}}}
135147
}
136148

137149
func toColumn(table, column string, opts ...Option) clause.Column {

field/expr.go

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -172,35 +172,34 @@ func (e expr) IsNotNull() Expr {
172172
return e.setE(clause.Expr{SQL: "? IS NOT NULL", Vars: []interface{}{e.RawExpr()}})
173173
}
174174

175-
func (e expr) Count() Int {
176-
return Int{NewGenericsInt[int](e.setE(clause.Expr{SQL: "COUNT(?)", Vars: []interface{}{e.RawExpr()}}))}
175+
func (e expr) Count() Number[int] {
176+
return newNumber[int](e.setE(clause.Expr{SQL: "COUNT(?)", Vars: []interface{}{e.RawExpr()}}))
177177
}
178178

179-
func (e expr) Distinct() Int {
180-
return Int{NewGenericsInt[int](e.setE(clause.Expr{SQL: "DISTINCT ?", Vars: []interface{}{e.RawExpr()}}))}
181-
179+
func (e expr) Distinct() Number[int] {
180+
return newNumber[int](e.setE(clause.Expr{SQL: "DISTINCT ?", Vars: []interface{}{e.RawExpr()}}))
182181
}
183182

184-
func (e expr) Length() Int {
185-
return Int{NewGenericsInt[int](e.setE(clause.Expr{SQL: "LENGTH(?)", Vars: []interface{}{e.RawExpr()}}))}
183+
func (e expr) Length() Number[int] {
184+
return newNumber[int](e.setE(clause.Expr{SQL: "LENGTH(?)", Vars: []interface{}{e.RawExpr()}}))
186185
}
187186

188187
func (e expr) Max() Float64 {
189-
return Float64{NewGenericsInt[float64](e.setE(clause.Expr{SQL: "MAX(?)", Vars: []interface{}{e.RawExpr()}}))}
188+
return Float64{newNumber[float64](e.setE(clause.Expr{SQL: "MAX(?)", Vars: []interface{}{e.RawExpr()}}))}
190189
}
191190

192191
func (e expr) Min() Float64 {
193-
return Float64{NewGenericsInt[float64](e.setE(clause.Expr{SQL: "MIN(?)", Vars: []interface{}{e.RawExpr()}}))}
192+
return Float64{newNumber[float64](e.setE(clause.Expr{SQL: "MIN(?)", Vars: []interface{}{e.RawExpr()}}))}
194193

195194
}
196195

197196
func (e expr) Avg() Float64 {
198-
return Float64{NewGenericsInt[float64](e.setE(clause.Expr{SQL: "AVG(?)", Vars: []interface{}{e.RawExpr()}}))}
197+
return Float64{newNumber[float64](e.setE(clause.Expr{SQL: "AVG(?)", Vars: []interface{}{e.RawExpr()}}))}
199198

200199
}
201200

202201
func (e expr) Abs() Float64 {
203-
return Float64{NewGenericsInt[float64](e.setE(clause.Expr{SQL: "ABS(?)", Vars: []interface{}{e.RawExpr()}}))}
202+
return Float64{newNumber[float64](e.setE(clause.Expr{SQL: "ABS(?)", Vars: []interface{}{e.RawExpr()}}))}
204203
}
205204

206205
func (e expr) Null() AssignExpr {
@@ -242,19 +241,19 @@ func (e expr) SetCol(col Expr) AssignExpr {
242241

243242
// ======================== operate columns ========================
244243
func (e expr) AddCol(col Expr) Expr {
245-
return Field{GenericsField[driver.Valuer]{e.setE(clause.Expr{SQL: "? + ?", Vars: []interface{}{e.RawExpr(), col.RawExpr()}})}}
244+
return Field(genericsField[driver.Valuer]{e.setE(clause.Expr{SQL: "? + ?", Vars: []interface{}{e.RawExpr(), col.RawExpr()}})})
246245
}
247246

248247
func (e expr) SubCol(col Expr) Expr {
249-
return Field{GenericsField[driver.Valuer]{e.setE(clause.Expr{SQL: "? - ?", Vars: []interface{}{e.RawExpr(), col.RawExpr()}})}}
248+
return Field(genericsField[driver.Valuer]{e.setE(clause.Expr{SQL: "? - ?", Vars: []interface{}{e.RawExpr(), col.RawExpr()}})})
250249
}
251250

252251
func (e expr) MulCol(col Expr) Expr {
253-
return Field{GenericsField[driver.Valuer]{e.setE(clause.Expr{SQL: "(?) * (?)", Vars: []interface{}{e.RawExpr(), col.RawExpr()}})}}
252+
return Field(genericsField[driver.Valuer]{e.setE(clause.Expr{SQL: "(?) * (?)", Vars: []interface{}{e.RawExpr(), col.RawExpr()}})})
254253
}
255254

256255
func (e expr) DivCol(col Expr) Expr {
257-
return Field{GenericsField[driver.Valuer]{e.setE(clause.Expr{SQL: "(?) / (?)", Vars: []interface{}{e.RawExpr(), col.RawExpr()}})}}
256+
return Field(genericsField[driver.Valuer]{e.setE(clause.Expr{SQL: "(?) / (?)", Vars: []interface{}{e.RawExpr(), col.RawExpr()}})})
258257
}
259258

260259
func (e expr) ConcatCol(cols ...Expr) Expr {
@@ -264,10 +263,10 @@ func (e expr) ConcatCol(cols ...Expr) Expr {
264263
placeholders = append(placeholders, "?")
265264
vars = append(vars, col.RawExpr())
266265
}
267-
return Field{GenericsField[driver.Valuer]{e.setE(clause.Expr{
266+
return Field(genericsField[driver.Valuer]{e.setE(clause.Expr{
268267
SQL: fmt.Sprintf("CONCAT(%s)", strings.Join(placeholders, ",")),
269268
Vars: vars,
270-
})}}
269+
})})
271270
}
272271

273272
// ======================== keyword ========================

field/field.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,4 @@ package field
33
import "database/sql/driver"
44

55
// Field a standard field struct
6-
type Field struct {
7-
GenericsField[driver.Valuer]
8-
}
6+
type Field genericsField[driver.Valuer]

field/float.go

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,16 @@ package field
22

33
// Float64 float64 type field
44
type Float64 struct {
5-
GenericsInt[float64]
5+
Number[float64]
66
}
77

8-
// Floor ...
9-
func (field Float64) Floor() Int {
10-
return Int{NewGenericsInt[int](field.floor())}
11-
}
8+
// Floor implement floor method
9+
func (field Float64) Floor() Number[int] { return newNumber[int](field.floor()) }
1210

1311
// Float32 float32 type field
1412
type Float32 struct {
15-
GenericsInt[float32]
13+
Number[float32]
1614
}
1715

18-
// Floor ...
19-
func (field Float32) Floor() Int {
20-
return Int{NewGenericsInt[int](field.floor())}
21-
}
16+
// Floor implement floor method
17+
func (field Float32) Floor() Number[int] { return newNumber[int](field.floor()) }

field/function.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,21 @@ var Func = new(function)
1212
type function struct{}
1313

1414
// UnixTimestamp same as UNIX_TIMESTAMP([date])
15-
func (f *function) UnixTimestamp(date ...string) Uint64 {
15+
func (f *function) UnixTimestamp(date ...string) Number[uint64] {
1616
if len(date) > 0 {
17-
return Uint64{GenericsInt: GenericsInt[uint64]{GenericsField: GenericsField[uint64]{expr{e: clause.Expr{SQL: "UNIX_TIMESTAMP(?)", Vars: []interface{}{date[0]}}}}}}
17+
return newNumber[uint64](expr{e: clause.Expr{SQL: "UNIX_TIMESTAMP(?)", Vars: []interface{}{date[0]}}})
1818
}
19-
return Uint64{GenericsInt: GenericsInt[uint64]{GenericsField: GenericsField[uint64]{expr{e: clause.Expr{SQL: "UNIX_TIMESTAMP()"}}}}}
19+
return newNumber[uint64](expr{e: clause.Expr{SQL: "UNIX_TIMESTAMP()"}})
2020
}
2121

2222
// FromUnixTime FROM_UNIXTIME(unix_timestamp[,format])
2323
func (f *function) FromUnixTime(date uint64, format string) String {
2424
if strings.TrimSpace(format) != "" {
25-
return String{GenericsString: GenericsString[string]{GenericsField: GenericsField[string]{expr{e: clause.Expr{SQL: "FROM_UNIXTIME(?, ?)", Vars: []interface{}{date, format}}}}}}
25+
return String{Chars: Chars[string]{genericsField: genericsField[string]{expr{e: clause.Expr{SQL: "FROM_UNIXTIME(?, ?)", Vars: []interface{}{date, format}}}}}}
2626
}
27-
return String{GenericsString: GenericsString[string]{GenericsField: GenericsField[string]{expr{e: clause.Expr{SQL: "FROM_UNIXTIME(?)", Vars: []interface{}{date}}}}}}
27+
return String{Chars: Chars[string]{genericsField: genericsField[string]{expr{e: clause.Expr{SQL: "FROM_UNIXTIME(?)", Vars: []interface{}{date}}}}}}
2828
}
2929

3030
func (f *function) Rand() String {
31-
return String{GenericsString: GenericsString[string]{GenericsField: GenericsField[string]{expr{e: clause.Expr{SQL: "RAND()"}}}}}
31+
return String{Chars: Chars[string]{genericsField: genericsField[string]{expr{e: clause.Expr{SQL: "RAND()"}}}}}
3232
}

0 commit comments

Comments
 (0)