added Sum, Sums, SumsInt methods

This commit is contained in:
Lunny Xiao 2016-07-07 22:34:43 +08:00
parent 9bf34c3189
commit 86701ad07e
5 changed files with 148 additions and 13 deletions

View File

@ -1 +1 @@
xorm v0.5.4.0630 xorm v0.5.5.0707

View File

@ -1536,14 +1536,34 @@ func (engine *Engine) Rows(bean interface{}) (*Rows, error) {
return session.Rows(bean) return session.Rows(bean)
} }
// Count counts the records. bean's non-empty fields // Count counts the records. bean's non-empty fields are conditions.
// are conditions.
func (engine *Engine) Count(bean interface{}) (int64, error) { func (engine *Engine) Count(bean interface{}) (int64, error) {
session := engine.NewSession() session := engine.NewSession()
defer session.Close() defer session.Close()
return session.Count(bean) return session.Count(bean)
} }
// Sum sum the records by some column. bean's non-empty fields are conditions.
func (engine *Engine) Sum(bean interface{}, colName string) (float64, error) {
session := engine.NewSession()
defer session.Close()
return session.Sum(bean, colName)
}
// Sums sum the records by some columns. bean's non-empty fields are conditions.
func (engine *Engine) Sums(bean interface{}, colNames ...string) ([]float64, error) {
session := engine.NewSession()
defer session.Close()
return session.Sums(bean, colNames...)
}
// SumsInt like Sums but return slice of int64 instead of float64.
func (engine *Engine) SumsInt(bean interface{}, colNames ...string) ([]int64, error) {
session := engine.NewSession()
defer session.Close()
return session.SumsInt(bean, colNames...)
}
// Import SQL DDL file // Import SQL DDL file
func (engine *Engine) ImportFile(ddlPath string) ([]sql.Result, error) { func (engine *Engine) ImportFile(ddlPath string) ([]sql.Result, error) {
file, err := os.Open(ddlPath) file, err := os.Open(ddlPath)

View File

@ -1073,21 +1073,115 @@ func (session *Session) Count(bean interface{}) (int64, error) {
args = session.Statement.RawParams args = session.Statement.RawParams
} }
resultsSlice, err := session.query(sqlStr, args...) session.queryPreprocess(&sqlStr, args...)
var err error
var total int64
if session.IsAutoCommit {
err = session.DB().QueryRow(sqlStr, args...).Scan(&total)
} else {
err = session.Tx.QueryRow(sqlStr, args...).Scan(&total)
}
if err != nil { if err != nil {
return 0, err return 0, err
} }
var total int64 return total, nil
if len(resultsSlice) > 0 { }
results := resultsSlice[0]
for _, value := range results { // Sum call sum some column. bean's non-empty fields are conditions.
total, err = strconv.ParseInt(string(value), 10, 64) func (session *Session) Sum(bean interface{}, columnName string) (float64, error) {
break defer session.resetStatement()
} if session.IsAutoClose {
defer session.Close()
} }
return int64(total), err var sqlStr string
var args []interface{}
if len(session.Statement.RawSQL) == 0 {
sqlStr, args = session.Statement.genSumSql(bean, columnName)
} else {
sqlStr = session.Statement.RawSQL
args = session.Statement.RawParams
}
session.queryPreprocess(&sqlStr, args...)
var err error
var res float64
if session.IsAutoCommit {
err = session.DB().QueryRow(sqlStr, args...).Scan(&res)
} else {
err = session.Tx.QueryRow(sqlStr, args...).Scan(&res)
}
if err != nil {
return 0, err
}
return res, nil
}
// Sums call sum some columns. bean's non-empty fields are conditions.
func (session *Session) Sums(bean interface{}, columnNames ...string) ([]float64, error) {
defer session.resetStatement()
if session.IsAutoClose {
defer session.Close()
}
var sqlStr string
var args []interface{}
if len(session.Statement.RawSQL) == 0 {
sqlStr, args = session.Statement.genSumSql(bean, columnNames...)
} else {
sqlStr = session.Statement.RawSQL
args = session.Statement.RawParams
}
session.queryPreprocess(&sqlStr, args...)
var err error
var res = make([]float64, len(columnNames), len(columnNames))
if session.IsAutoCommit {
err = session.DB().QueryRow(sqlStr, args...).ScanSlice(&res)
} else {
err = session.Tx.QueryRow(sqlStr, args...).ScanSlice(&res)
}
if err != nil {
return nil, err
}
return res, nil
}
func (session *Session) SumsInt(bean interface{}, columnNames ...string) ([]int64, error) {
defer session.resetStatement()
if session.IsAutoClose {
defer session.Close()
}
var sqlStr string
var args []interface{}
if len(session.Statement.RawSQL) == 0 {
sqlStr, args = session.Statement.genSumSql(bean, columnNames...)
} else {
sqlStr = session.Statement.RawSQL
args = session.Statement.RawParams
}
session.queryPreprocess(&sqlStr, args...)
var err error
var res = make([]int64, 0, len(columnNames))
if session.IsAutoCommit {
err = session.DB().QueryRow(sqlStr, args...).ScanSlice(&res)
} else {
err = session.Tx.QueryRow(sqlStr, args...).ScanSlice(&res)
}
if err != nil {
return nil, err
}
return res, nil
} }
// Find retrieve records from table, condiBeans's non-empty fields // Find retrieve records from table, condiBeans's non-empty fields

View File

@ -1220,6 +1220,27 @@ func (statement *Statement) genCountSql(bean interface{}) (string, []interface{}
return statement.genSelectSQL(fmt.Sprintf("count(%v)", id)), append(append(statement.joinArgs, statement.Params...), statement.BeanArgs...) return statement.genSelectSQL(fmt.Sprintf("count(%v)", id)), append(append(statement.joinArgs, statement.Params...), statement.BeanArgs...)
} }
func (statement *Statement) genSumSql(bean interface{}, columns ...string) (string, []interface{}) {
table := statement.Engine.TableInfo(bean)
statement.RefTable = table
var addedTableName = (len(statement.JoinStr) > 0)
if !statement.noAutoCondition {
colNames, args := statement.buildConditions(table, bean, true, true, false, true, addedTableName)
statement.ConditionStr = strings.Join(colNames, " "+statement.Engine.Dialect().AndStr()+" ")
statement.BeanArgs = args
}
statement.attachInSql()
var sumStrs = make([]string, 0, len(columns))
for _, colName := range columns {
sumStrs = append(sumStrs, fmt.Sprintf("sum(%s)", colName))
}
return statement.genSelectSQL(strings.Join(sumStrs, ", ")), append(append(statement.joinArgs, statement.Params...), statement.BeanArgs...)
}
func (statement *Statement) genSelectSQL(columnStr string) (a string) { func (statement *Statement) genSelectSQL(columnStr string) (a string) {
var distinct string var distinct string
if statement.IsDistinct { if statement.IsDistinct {

View File

@ -17,7 +17,7 @@ import (
const ( const (
// Version show the xorm's version // Version show the xorm's version
Version string = "0.5.4.0630" Version string = "0.5.5.0707"
) )
func regDrvsNDialects() bool { func regDrvsNDialects() bool {