Files
aorm/builder/handle.go
tangpanqing 2bc08359b8 new test
2023-01-05 17:43:29 +08:00

146 lines
3.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package builder
import (
"github.com/tangpanqing/aorm/helper"
"github.com/tangpanqing/aorm/model"
"reflect"
"strings"
)
//拼接SQL,字段相关
func handleField(selectList []SelectItem, selectExpList []*SelectItem, paramList []any) (string, []any) {
if len(selectList) == 0 && len(selectExpList) == 0 {
return "*", paramList
}
//处理子语句
//for i := 0; i < len(selectExpList); i++ {
// executor := *(selectExpList[i].Executor)
// subSql, subParamList := executor.GetSqlAndParams()
// selectList = append(selectList, "("+subSql+") AS "+selectExpList[i].FieldName)
// paramList = append(paramList, subParamList...)
//}
var strList []string
return strings.Join(strList, ","), paramList
}
//拼接SQL,查询条件
func (ex *Builder) handleWhere(where []WhereItem, paramList []any) (string, []any) {
if len(where) == 0 {
return "", paramList
}
whereList, paramList := ex.whereAndHaving(where, paramList)
return " WHERE " + strings.Join(whereList, " AND "), paramList
}
//拼接SQL,更新信息
func (ex *Builder) handleSet(dest interface{}, paramList []any) (string, []any) {
typeOf := reflect.TypeOf(dest)
valueOf := reflect.ValueOf(dest)
//如果没有设置表名
if ex.tableName == "" {
ex.tableName = getTableName(typeOf, valueOf)
}
var keys []string
for i := 0; i < typeOf.Elem().NumField(); i++ {
isNotNull := valueOf.Elem().Field(i).Field(0).Field(1).Bool()
if isNotNull {
key := helper.UnderLine(typeOf.Elem().Field(i).Name)
val := valueOf.Elem().Field(i).Field(0).Field(0).Interface()
keys = append(keys, key+"=?")
paramList = append(paramList, val)
}
}
return " SET " + strings.Join(keys, ","), paramList
}
//拼接SQL,关联查询
func (b *Builder) handleJoin(paramList []interface{}) (string, []interface{}) {
if len(b.joinList) == 0 {
return "", paramList
}
var sqlList []string
for i := 0; i < len(b.joinList); i++ {
joinItem := b.joinList[i]
str, paramList2 := getWhereStrForJoin(joinItem.tableAlias, joinItem.condition, paramList)
paramList = append(paramList, paramList2...)
sqlItem := joinItem.joinType + " " + getTableNameByTable(joinItem.table) + " " + joinItem.tableAlias + " ON " + str
sqlList = append(sqlList, sqlItem)
}
return " " + strings.Join(sqlList, " "), paramList
}
//拼接SQL,结果分组
func handleGroup(groupList []string) string {
if len(groupList) == 0 {
return ""
}
return " GROUP BY " + strings.Join(groupList, ",")
}
//拼接SQL,结果筛选
func (ex *Builder) handleHaving(having []WhereItem, paramList []any) (string, []any) {
if len(having) == 0 {
return "", paramList
}
whereList, paramList := ex.whereAndHaving(having, paramList)
return " Having " + strings.Join(whereList, " AND "), paramList
}
//拼接SQL,结果排序
func handleOrder(orderList []string) string {
if len(orderList) == 0 {
return ""
}
return " Order BY " + strings.Join(orderList, ",")
}
//拼接SQL,分页相关 Postgres数据库分页数量在前偏移在后其他数据库偏移量在前分页数量在后另外Mssql数据库的关键词是offset...next
func (ex *Builder) handleLimit(offset int, pageSize int, paramList []any) (string, []any) {
if 0 == pageSize {
return "", paramList
}
str := ""
if ex.driverName == model.Postgres {
paramList = append(paramList, pageSize)
paramList = append(paramList, offset)
str = " Limit ? offset ? "
} else {
paramList = append(paramList, offset)
paramList = append(paramList, pageSize)
str = " Limit ?,? "
if ex.driverName == model.Mssql {
str = " offset ? rows fetch next ? rows only "
}
}
return str, paramList
}
//拼接SQL,锁
func handleLockForUpdate(isLock bool) string {
if isLock {
return " FOR UPDATE"
}
return ""
}