forked from mirror/gorm
cache snake, upper values
This commit is contained in:
parent
8fd8604a70
commit
9a1c0d956d
|
@ -735,6 +735,8 @@ db.Where("email = ?", "x@example.org").Attrs(User{RegisteredIp: "111.111.111.111
|
||||||
```
|
```
|
||||||
|
|
||||||
## TODO
|
## TODO
|
||||||
|
* Rows, Row
|
||||||
|
* Cache Stmt for performance
|
||||||
* Join, Having, Group, Includes
|
* Join, Having, Group, Includes
|
||||||
* Scopes, Valiations
|
* Scopes, Valiations
|
||||||
* AlertColumn, DropColumn, AddIndex, RemoveIndex
|
* AlertColumn, DropColumn, AddIndex, RemoveIndex
|
||||||
|
|
2
field.go
2
field.go
|
@ -107,7 +107,7 @@ func parseSqlTag(str string) (typ string, addational_typ string, size int) {
|
||||||
m := make(map[string]string)
|
m := make(map[string]string)
|
||||||
for _, value := range tags {
|
for _, value := range tags {
|
||||||
v := strings.Split(value, ":")
|
v := strings.Split(value, ":")
|
||||||
k := strings.Trim(strings.ToUpper(v[0]), " ")
|
k := strings.TrimSpace(strings.ToUpper(v[0]))
|
||||||
if len(v) == 2 {
|
if len(v) == 2 {
|
||||||
m[k] = v[1]
|
m[k] = v[1]
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -1365,7 +1365,7 @@ func TestQueryChain(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkGorm(b *testing.B) {
|
func BenchmarkGorm(b *testing.B) {
|
||||||
b.N = 2000
|
b.N = 5000
|
||||||
for x := 0; x < b.N; x++ {
|
for x := 0; x < b.N; x++ {
|
||||||
e := strconv.Itoa(x) + "benchmark@example.org"
|
e := strconv.Itoa(x) + "benchmark@example.org"
|
||||||
email := BigEmail{Email: e, UserAgent: "pc", RegisteredAt: time.Now()}
|
email := BigEmail{Email: e, UserAgent: "pc", RegisteredAt: time.Now()}
|
||||||
|
@ -1388,7 +1388,7 @@ func BenchmarkRawSql(b *testing.B) {
|
||||||
update_sql := "UPDATE emails SET email = $1, updated_at = $2 WHERE id = $3"
|
update_sql := "UPDATE emails SET email = $1, updated_at = $2 WHERE id = $3"
|
||||||
delete_sql := "DELETE FROM orders WHERE id = $1"
|
delete_sql := "DELETE FROM orders WHERE id = $1"
|
||||||
|
|
||||||
b.N = 2000
|
b.N = 5000
|
||||||
for x := 0; x < b.N; x++ {
|
for x := 0; x < b.N; x++ {
|
||||||
var id int64
|
var id int64
|
||||||
e := strconv.Itoa(x) + "benchmark@example.org"
|
e := strconv.Itoa(x) + "benchmark@example.org"
|
||||||
|
|
11
model.go
11
model.go
|
@ -40,10 +40,6 @@ func (m *Model) primaryKeyDb() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Model) fields(operation string) (fields []*Field) {
|
func (m *Model) fields(operation string) (fields []*Field) {
|
||||||
if len(m._cache_fields[operation]) > 0 {
|
|
||||||
return m._cache_fields[operation]
|
|
||||||
}
|
|
||||||
|
|
||||||
indirect_value := m.reflectData()
|
indirect_value := m.reflectData()
|
||||||
if !indirect_value.IsValid() {
|
if !indirect_value.IsValid() {
|
||||||
return
|
return
|
||||||
|
@ -79,14 +75,10 @@ func (m *Model) fields(operation string) (fields []*Field) {
|
||||||
field.structField = p
|
field.structField = p
|
||||||
field.reflectValue = value
|
field.reflectValue = value
|
||||||
field.Value = value.Interface()
|
field.Value = value.Interface()
|
||||||
|
field.parseAssociation()
|
||||||
fields = append(fields, &field)
|
fields = append(fields, &field)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(m._cache_fields) == 0 {
|
|
||||||
m._cache_fields = map[string][]*Field{}
|
|
||||||
}
|
|
||||||
m._cache_fields[operation] = fields
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -225,7 +217,6 @@ func (m *Model) setValueByColumn(name string, value interface{}, out interface{}
|
||||||
|
|
||||||
func (m *Model) beforeAssociations() (fields []*Field) {
|
func (m *Model) beforeAssociations() (fields []*Field) {
|
||||||
for _, field := range m.fields("null") {
|
for _, field := range m.fields("null") {
|
||||||
field.parseAssociation()
|
|
||||||
if field.beforeAssociation && !field.isBlank() {
|
if field.beforeAssociation && !field.isBlank() {
|
||||||
fields = append(fields, field)
|
fields = append(fields, field)
|
||||||
}
|
}
|
||||||
|
|
30
utils.go
30
utils.go
|
@ -10,18 +10,37 @@ import (
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func toSnake(s string) string {
|
var toSnakeMap map[string]string
|
||||||
|
var toUpperMap map[string]string
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
toSnakeMap = map[string]string{}
|
||||||
|
toUpperMap = map[string]string{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func toSnake(u string) string {
|
||||||
|
if v := toSnakeMap[u]; v != "" {
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
||||||
buf := bytes.NewBufferString("")
|
buf := bytes.NewBufferString("")
|
||||||
for i, v := range s {
|
for i, v := range u {
|
||||||
if i > 0 && v >= 'A' && v <= 'Z' {
|
if i > 0 && v >= 'A' && v <= 'Z' {
|
||||||
buf.WriteRune('_')
|
buf.WriteRune('_')
|
||||||
}
|
}
|
||||||
buf.WriteRune(v)
|
buf.WriteRune(v)
|
||||||
}
|
}
|
||||||
return strings.ToLower(buf.String())
|
|
||||||
|
s := strings.ToLower(buf.String())
|
||||||
|
toSnakeMap[u] = s
|
||||||
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
func snakeToUpperCamel(s string) string {
|
func snakeToUpperCamel(s string) string {
|
||||||
|
if v := toUpperMap[s]; v != "" {
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
||||||
buf := bytes.NewBufferString("")
|
buf := bytes.NewBufferString("")
|
||||||
for _, v := range strings.Split(s, "_") {
|
for _, v := range strings.Split(s, "_") {
|
||||||
if len(v) > 0 {
|
if len(v) > 0 {
|
||||||
|
@ -29,7 +48,10 @@ func snakeToUpperCamel(s string) string {
|
||||||
buf.WriteString(v[1:])
|
buf.WriteString(v[1:])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return buf.String()
|
|
||||||
|
u := buf.String()
|
||||||
|
toUpperMap[s] = u
|
||||||
|
return u
|
||||||
}
|
}
|
||||||
|
|
||||||
func toSearchableMap(attrs ...interface{}) (result interface{}) {
|
func toSearchableMap(attrs ...interface{}) (result interface{}) {
|
||||||
|
|
Loading…
Reference in New Issue