From e9dbd365a32d425f30226b7c06bff46ad984458c Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sun, 24 Apr 2022 16:28:06 +0800 Subject: [PATCH] Some slight improvments --- integrations/session_insert_test.go | 61 +++++++++++++++++++++++------ internal/statements/insert.go | 10 ++--- internal/statements/query.go | 24 ++++++------ session_insert.go | 30 +++++++------- 4 files changed, 82 insertions(+), 43 deletions(-) diff --git a/integrations/session_insert_test.go b/integrations/session_insert_test.go index 2495c1df..d8ad12bf 100644 --- a/integrations/session_insert_test.go +++ b/integrations/session_insert_test.go @@ -11,6 +11,7 @@ import ( "time" "xorm.io/xorm" + "xorm.io/xorm/log" "xorm.io/xorm/schemas" "github.com/stretchr/testify/assert" @@ -142,8 +143,13 @@ func TestInsert(t *testing.T) { assert.NoError(t, PrepareEngine()) assertSync(t, new(Userinfo)) - user := Userinfo{0, "xiaolunwen", "dev", "lunny", time.Now(), - Userdetail{Id: 1}, 1.78, []byte{1, 2, 3}, true} + user := Userinfo{ + 0, "xiaolunwen", "dev", "lunny", time.Now(), + Userdetail{Id: 1}, + 1.78, + []byte{1, 2, 3}, + true, + } cnt, err := testEngine.Insert(&user) assert.NoError(t, err) assert.EqualValues(t, 1, cnt, "insert not returned 1") @@ -161,8 +167,10 @@ func TestInsertAutoIncr(t *testing.T) { assertSync(t, new(Userinfo)) // auto increment insert - user := Userinfo{Username: "xiaolunwen2", Departname: "dev", Alias: "lunny", Created: time.Now(), - Detail: Userdetail{Id: 1}, Height: 1.78, Avatar: []byte{1, 2, 3}, IsMan: true} + user := Userinfo{ + Username: "xiaolunwen2", Departname: "dev", Alias: "lunny", Created: time.Now(), + Detail: Userdetail{Id: 1}, Height: 1.78, Avatar: []byte{1, 2, 3}, IsMan: true, + } cnt, err := testEngine.Insert(&user) assert.NoError(t, err) assert.EqualValues(t, 1, cnt) @@ -184,7 +192,7 @@ func TestInsertDefault(t *testing.T) { err := testEngine.Sync(di) assert.NoError(t, err) - var di2 = DefaultInsert{Name: "test"} + di2 := DefaultInsert{Name: "test"} _, err = testEngine.Omit(testEngine.GetColumnMapper().Obj2Table("Status")).Insert(&di2) assert.NoError(t, err) @@ -210,7 +218,7 @@ func TestInsertDefault2(t *testing.T) { err := testEngine.Sync(di) assert.NoError(t, err) - var di2 = DefaultInsert2{Name: "test"} + di2 := DefaultInsert2{Name: "test"} _, err = testEngine.Omit(testEngine.GetColumnMapper().Obj2Table("CheckTime")).Insert(&di2) assert.NoError(t, err) @@ -438,7 +446,7 @@ func TestCreatedJsonTime(t *testing.T) { assert.True(t, has) assert.EqualValues(t, time.Time(ci5.Created).Unix(), time.Time(di5.Created).Unix()) - var dis = make([]MyJSONTime, 0) + dis := make([]MyJSONTime, 0) err = testEngine.Find(&dis) assert.NoError(t, err) } @@ -761,7 +769,7 @@ func TestInsertWhere(t *testing.T) { assert.NoError(t, PrepareEngine()) assertSync(t, new(InsertWhere)) - var i = InsertWhere{ + i := InsertWhere{ RepoId: 1, Width: 10, Height: 20, @@ -871,7 +879,7 @@ func TestInsertExpr2(t *testing.T) { assertSync(t, new(InsertExprsRelease)) - var ie = InsertExprsRelease{ + ie := InsertExprsRelease{ RepoId: 1, IsTag: true, } @@ -1046,7 +1054,7 @@ func TestInsertIntSlice(t *testing.T) { assert.NoError(t, testEngine.Sync(new(InsertIntSlice))) - var v = InsertIntSlice{ + v := InsertIntSlice{ NameIDs: []int{1, 2}, } cnt, err := testEngine.Insert(&v) @@ -1063,7 +1071,7 @@ func TestInsertIntSlice(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, 1, cnt) - var v3 = InsertIntSlice{ + v3 := InsertIntSlice{ NameIDs: nil, } cnt, err = testEngine.Insert(&v3) @@ -1201,3 +1209,34 @@ func TestInsertMultipleMap(t *testing.T) { Name: "xiaolunwen", }, res[1]) } + +func BenchmarkInsertSingle(b *testing.B) { + b.StopTimer() + type BenchmarkInsertStruct struct { + Id int64 + Login string + Name string + Age int + Nation string + Created time.Time `xorm:"created"` + Updated time.Time `xorm:"updated"` + } + + if err := testEngine.Sync(new(BenchmarkInsertStruct)); err != nil { + b.Error(err) + } + + testEngine.SetLogLevel(log.LOG_OFF) + + b.StartTimer() + for n := 0; n < b.N; n++ { + if _, err := testEngine.Insert(&BenchmarkInsertStruct{ + Login: "test", + Name: "the test account", + Age: 40, + Nation: "China", + }); err != nil { + b.Error(err) + } + } +} diff --git a/internal/statements/insert.go b/internal/statements/insert.go index 91a33319..b4482d11 100644 --- a/internal/statements/insert.go +++ b/internal/statements/insert.go @@ -43,8 +43,8 @@ func (statement *Statement) GenInsertSQL(colNames []string, args []interface{}) return "", nil, err } - var hasInsertColumns = len(colNames) > 0 - var needSeq = len(table.AutoIncrement) > 0 && (statement.dialect.URI().DBType == schemas.ORACLE || statement.dialect.URI().DBType == schemas.DAMENG) + hasInsertColumns := len(colNames) > 0 + needSeq := len(table.AutoIncrement) > 0 && (statement.dialect.URI().DBType == schemas.ORACLE || statement.dialect.URI().DBType == schemas.DAMENG) if needSeq { for _, col := range colNames { if strings.EqualFold(col, table.AutoIncrement) { @@ -188,7 +188,7 @@ func (statement *Statement) GenInsertMapSQL(columns []string, args []interface{} tableName = statement.TableName() ) - if _, err := buf.WriteString(fmt.Sprintf("INSERT INTO %s (", statement.quote(tableName))); err != nil { + if _, err := fmt.Fprint(buf, "INSERT INTO ", statement.quote(tableName), " ("); err != nil { return "", nil, err } @@ -215,7 +215,7 @@ func (statement *Statement) GenInsertMapSQL(columns []string, args []interface{} } } - if _, err := buf.WriteString(fmt.Sprintf(" FROM %s WHERE ", statement.quote(tableName))); err != nil { + if _, err := fmt.Fprint(buf, " FROM ", statement.quote(tableName), " WHERE "); err != nil { return "", nil, err } @@ -253,7 +253,7 @@ func (statement *Statement) GenInsertMultipleMapSQL(columns []string, argss [][] tableName = statement.TableName() ) - if _, err := buf.WriteString(fmt.Sprintf("INSERT INTO %s (", statement.quote(tableName))); err != nil { + if _, err := fmt.Fprint(buf, "INSERT INTO ", statement.quote(tableName), " ("); err != nil { return "", nil, err } diff --git a/internal/statements/query.go b/internal/statements/query.go index 8b383866..2ba11d53 100644 --- a/internal/statements/query.go +++ b/internal/statements/query.go @@ -28,7 +28,7 @@ func (statement *Statement) GenQuerySQL(sqlOrArgs ...interface{}) (string, []int return "", nil, ErrTableNotFound } - var columnStr = statement.ColumnStr() + columnStr := statement.ColumnStr() if len(statement.SelectStr) > 0 { columnStr = statement.SelectStr } else { @@ -83,7 +83,7 @@ func (statement *Statement) GenSumSQL(bean interface{}, columns ...string) (stri return "", nil, err } - var sumStrs = make([]string, 0, len(columns)) + sumStrs := make([]string, 0, len(columns)) for _, colName := range columns { if !strings.Contains(colName, " ") && !strings.Contains(colName, "(") { colName = statement.quote(colName) @@ -119,7 +119,7 @@ func (statement *Statement) GenGetSQL(bean interface{}) (string, []interface{}, } } - var columnStr = statement.ColumnStr() + columnStr := statement.ColumnStr() if len(statement.SelectStr) > 0 { columnStr = statement.SelectStr } else { @@ -180,7 +180,7 @@ func (statement *Statement) GenCountSQL(beans ...interface{}) (string, []interfa } } - var selectSQL = statement.SelectStr + selectSQL := statement.SelectStr if len(selectSQL) <= 0 { if statement.IsDistinct { selectSQL = fmt.Sprintf("count(DISTINCT %s)", statement.ColumnStr()) @@ -211,8 +211,8 @@ func (statement *Statement) GenCountSQL(beans ...interface{}) (string, []interfa func (statement *Statement) fromBuilder() *strings.Builder { var builder strings.Builder - var quote = statement.quote - var dialect = statement.dialect + quote := statement.quote + dialect := statement.dialect builder.WriteString(" FROM ") @@ -304,7 +304,7 @@ func (statement *Statement) genSelectSQL(columnStr string, needLimit, needOrderB } var buf strings.Builder - fmt.Fprintf(&buf, "SELECT %v%v%v%v%v", distinct, top, columnStr, fromStr, whereStr) + fmt.Fprint(&buf, "SELECT ", distinct, top, columnStr, fromStr, whereStr) if len(mssqlCondi) > 0 { if len(whereStr) > 0 { fmt.Fprint(&buf, " AND ", mssqlCondi) @@ -326,9 +326,9 @@ func (statement *Statement) genSelectSQL(columnStr string, needLimit, needOrderB if dialect.URI().DBType != schemas.MSSQL && dialect.URI().DBType != schemas.ORACLE { if statement.Start > 0 { if pLimitN != nil { - fmt.Fprintf(&buf, " LIMIT %v OFFSET %v", *pLimitN, statement.Start) + fmt.Fprint(&buf, " LIMIT ", *pLimitN, " OFFSET ", statement.Start) } else { - fmt.Fprintf(&buf, " LIMIT 0 OFFSET %v", statement.Start) + fmt.Fprint(&buf, " LIMIT 0 OFFSET ", statement.Start) } } else if pLimitN != nil { fmt.Fprint(&buf, " LIMIT ", *pLimitN) @@ -341,8 +341,8 @@ func (statement *Statement) genSelectSQL(columnStr string, needLimit, needOrderB if rawColStr == "*" { rawColStr = "at.*" } - fmt.Fprintf(&buf, "SELECT %v FROM (SELECT %v,ROWNUM RN FROM (%v) at WHERE ROWNUM <= %d) aat WHERE RN > %d", - columnStr, rawColStr, oldString, statement.Start+*pLimitN, statement.Start) + fmt.Fprint(&buf, "SELECT ", columnStr, " FROM (SELECT ", rawColStr, ",ROWNUM RN FROM (", oldString, ") at WHERE ROWNUM <= ", statement.Start+*pLimitN, ") aat WHERE RN > ", + statement.Start) } } } @@ -436,7 +436,7 @@ func (statement *Statement) GenFindSQL(autoCond builder.Cond) (string, []interfa return "", nil, ErrTableNotFound } - var columnStr = statement.ColumnStr() + columnStr := statement.ColumnStr() if len(statement.SelectStr) > 0 { columnStr = statement.SelectStr } else { diff --git a/session_insert.go b/session_insert.go index fc025613..e2aa7874 100644 --- a/session_insert.go +++ b/session_insert.go @@ -156,14 +156,14 @@ func (session *Session) insertMultipleStruct(rowsSlicePtr interface{}) (int64, e } args = append(args, val) - var colName = col.Name + colName := col.Name session.afterClosures = append(session.afterClosures, func(bean interface{}) { col := table.GetColumn(colName) setColumnTime(bean, col, t) }) } else if col.IsVersion && session.statement.CheckVersion { args = append(args, 1) - var colName = col.Name + colName := col.Name session.afterClosures = append(session.afterClosures, func(bean interface{}) { col := table.GetColumn(colName) setColumnInt(bean, col, 1) @@ -276,7 +276,7 @@ func (session *Session) insertStruct(bean interface{}) (int64, error) { processor.BeforeInsert() } - var tableName = session.statement.TableName() + tableName := session.statement.TableName() table := session.statement.RefTable colNames, args, err := session.genInsertColumns(bean) @@ -470,7 +470,7 @@ func (session *Session) genInsertColumns(bean interface{}) ([]string, []interfac if session.statement.OmitColumnMap.Contain(col.Name) { continue } - if len(session.statement.ColumnMap) > 0 && !session.statement.ColumnMap.Contain(col.Name) { + if !session.statement.ColumnMap.Contain(col.Name) { continue } if session.statement.IncrColumns.IsColExist(col.Name) { @@ -517,7 +517,7 @@ func (session *Session) genInsertColumns(bean interface{}) ([]string, []interfac } args = append(args, val) - var colName = col.Name + colName := col.Name session.afterClosures = append(session.afterClosures, func(bean interface{}) { col := table.GetColumn(colName) setColumnTime(bean, col, t) @@ -547,7 +547,7 @@ func (session *Session) insertMapInterface(m map[string]interface{}) (int64, err return 0, ErrTableNotFound } - var columns = make([]string, 0, len(m)) + columns := make([]string, 0, len(m)) exprs := session.statement.ExprColumns for k := range m { if !exprs.IsColExist(k) { @@ -556,7 +556,7 @@ func (session *Session) insertMapInterface(m map[string]interface{}) (int64, err } sort.Strings(columns) - var args = make([]interface{}, 0, len(m)) + args := make([]interface{}, 0, len(m)) for _, colName := range columns { args = append(args, m[colName]) } @@ -574,7 +574,7 @@ func (session *Session) insertMultipleMapInterface(maps []map[string]interface{} return 0, ErrTableNotFound } - var columns = make([]string, 0, len(maps[0])) + columns := make([]string, 0, len(maps[0])) exprs := session.statement.ExprColumns for k := range maps[0] { if !exprs.IsColExist(k) { @@ -583,9 +583,9 @@ func (session *Session) insertMultipleMapInterface(maps []map[string]interface{} } sort.Strings(columns) - var argss = make([][]interface{}, 0, len(maps)) + argss := make([][]interface{}, 0, len(maps)) for _, m := range maps { - var args = make([]interface{}, 0, len(m)) + args := make([]interface{}, 0, len(m)) for _, colName := range columns { args = append(args, m[colName]) } @@ -605,7 +605,7 @@ func (session *Session) insertMapString(m map[string]string) (int64, error) { return 0, ErrTableNotFound } - var columns = make([]string, 0, len(m)) + columns := make([]string, 0, len(m)) exprs := session.statement.ExprColumns for k := range m { if !exprs.IsColExist(k) { @@ -615,7 +615,7 @@ func (session *Session) insertMapString(m map[string]string) (int64, error) { sort.Strings(columns) - var args = make([]interface{}, 0, len(m)) + args := make([]interface{}, 0, len(m)) for _, colName := range columns { args = append(args, m[colName]) } @@ -633,7 +633,7 @@ func (session *Session) insertMultipleMapString(maps []map[string]string) (int64 return 0, ErrTableNotFound } - var columns = make([]string, 0, len(maps[0])) + columns := make([]string, 0, len(maps[0])) exprs := session.statement.ExprColumns for k := range maps[0] { if !exprs.IsColExist(k) { @@ -642,9 +642,9 @@ func (session *Session) insertMultipleMapString(maps []map[string]string) (int64 } sort.Strings(columns) - var argss = make([][]interface{}, 0, len(maps)) + argss := make([][]interface{}, 0, len(maps)) for _, m := range maps { - var args = make([]interface{}, 0, len(m)) + args := make([]interface{}, 0, len(m)) for _, colName := range columns { args = append(args, m[colName]) }