start & limit implementation for mssql

This commit is contained in:
Lunny Xiao 2014-05-06 11:11:44 +08:00
parent a190f71d40
commit 84b89289a3
1 changed files with 40 additions and 13 deletions

View File

@ -974,20 +974,52 @@ func (statement *Statement) genSelectSql(columnStr string) (a string) {
distinct = "DISTINCT "
}
// !nashtsai! REVIEW Sprintf is considered slowest mean of string concatnation, better to work with builder pattern
a = fmt.Sprintf("SELECT %v%v FROM %v", distinct, columnStr,
statement.Engine.Quote(statement.TableName()))
if statement.JoinStr != "" {
a = fmt.Sprintf("%v %v", a, statement.JoinStr)
var top string
var mssqlCondi string
var orderBy string
if statement.OrderStr != "" {
orderBy = fmt.Sprintf(" ORDER BY %v", statement.OrderStr)
}
statement.processIdParam()
var whereStr string
if statement.WhereStr != "" {
a = fmt.Sprintf("%v WHERE %v", a, statement.WhereStr)
whereStr = fmt.Sprintf(" WHERE %v", statement.WhereStr)
if statement.ConditionStr != "" {
a = fmt.Sprintf("%v AND %v", a, statement.ConditionStr)
whereStr = fmt.Sprintf("%v AND %v", whereStr, statement.ConditionStr)
}
} else if statement.ConditionStr != "" {
a = fmt.Sprintf("%v WHERE %v", a, statement.ConditionStr)
whereStr = fmt.Sprintf(" WHERE %v", statement.ConditionStr)
}
var fromStr string = " FROM " + statement.Engine.Quote(statement.TableName())
if statement.JoinStr != "" {
fromStr = fmt.Sprintf("%v %v", fromStr, statement.JoinStr)
}
if statement.Engine.dialect.DBType() == core.MSSQL {
top = fmt.Sprintf(" TOP %d", statement.LimitN)
if statement.Start > 0 {
var column string = "(id)"
if len(statement.RefTable.PKColumns()) == 0 {
for _, index := range statement.RefTable.Indexes {
if len(index.Cols) == 1 {
column = index.Cols[0]
break
}
}
if len(column) == 0 {
column = statement.RefTable.ColumnsSeq()[0]
}
}
mssqlCondi = fmt.Sprintf("(%s NOT IN (SELECT TOP %d %s%s%s%s))",
column, statement.Start, column, fromStr, whereStr, orderBy)
}
}
// !nashtsai! REVIEW Sprintf is considered slowest mean of string concatnation, better to work with builder pattern
a = fmt.Sprintf("SELECT %v%v%v%v%v", top, distinct, columnStr,
fromStr, whereStr)
if mssqlCondi != "" {
a += " AND " + mssqlCondi
}
if statement.GroupByStr != "" {
@ -1005,11 +1037,6 @@ func (statement *Statement) genSelectSql(columnStr string) (a string) {
} else if statement.LimitN > 0 {
a = fmt.Sprintf("%v LIMIT %v", a, statement.LimitN)
}
} else {
//TODO: for mssql, should handler limit.
/*SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY id desc) as row FROM "userinfo"
) a WHERE row > [start] and row <= [start+limit] order by id desc*/
}
return