123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- package utils
- import (
- "errors"
- "fmt"
- "regexp"
- )
- type Driver string
- const (
- DM Driver = "dm"
- MySql Driver = "mysql"
- )
- var supportDriverMap = map[string]Driver{
- "mysql": MySql,
- "dm": DM,
- }
- func GroupUnitFunc(driver string, column, delimiter string, columnOrder bool, orderField, orderRule string, hasDistinct bool) (sqlStr string) {
- dbDriver, _ := getDriverInstance(driver)
- if delimiter == "" {
- delimiter = ","
- }
- if column == "" {
- column = "[UNKNOWN COLUMN]"
- }
- //if tableAlia != "" {
- // column = fmt.Sprintf("%s.%s", tableAlia, column)
- //}
- var sqlOrder, strDistinct string
- if hasDistinct {
- strDistinct = "DISTINCT"
- }
- if columnOrder && orderField == "" {
- orderField = column
- }
- switch dbDriver {
- case DM:
- if columnOrder {
- sqlOrder = fmt.Sprintf("WITHIN GROUP (ORDER BY %s %s)", orderField, orderRule)
- }
- sqlStr = fmt.Sprintf("LISTAGG(%s %s, '%s') %s", strDistinct, column, delimiter, sqlOrder)
- default:
- // 默认使用MySQL的语法
- if columnOrder {
- sqlOrder = fmt.Sprintf("ORDER BY %s %s", orderField, orderRule)
- }
- sqlStr = fmt.Sprintf("GROUP_CONCAT(%s %s %s SEPARATOR '%s')", strDistinct, column, sqlOrder, delimiter)
- }
- return sqlStr
- }
- func GroupUnitDistinctFunc(driver string, column, delimiter string) (sqlStr string) {
- dbDriver, _ := getDriverInstance(driver)
- if delimiter == "" {
- delimiter = ","
- }
- if column == "" {
- column = "[UNKNOWN COLUMN]"
- }
- //if tableAlia != "" {
- // column = fmt.Sprintf("%s.%s", tableAlia, column)
- //}
- switch dbDriver {
- case MySql:
- sqlStr = fmt.Sprintf("GROUP_CONCAT(DISTINCT %s SEPARATOR '%s')", column, delimiter)
- case DM:
- sqlStr = fmt.Sprintf("LISTAGG(DISTINCT %s, '%s') WITHIN GROUP (ORDER BY %s)", column, delimiter, column)
- default:
- sqlStr = fmt.Sprintf("GROUP_CONCAT(DISTINCT %s SEPARATOR '%s')", column, delimiter) // 默认使用 MySQL 的语法
- }
- return sqlStr
- }
- func getDriverInstance(driver string) (dbDriver Driver, err error) {
- if driver == "" {
- dbDriver = supportDriverMap[DbDriverName]
- }
- if currentDriver, ok := supportDriverMap[driver]; !ok {
- err = errors.New("不支持的数据库驱动类型")
- return
- } else {
- dbDriver = currentDriver
- }
- return
- }
- func NeedDateOrTimeFormat(driver string) bool {
- var dbDriver Driver
- if driver == "" {
- dbDriver = supportDriverMap[DbDriverName]
- } else {
- dbDriver, _ = getDriverInstance(driver)
- }
- if dbDriver == DM {
- return true
- }
- return false
- }
- func ReplaceDriverKeywords(driver string, sql string) string {
- dbDriver, _ := getDriverInstance(driver)
- rules := map[Driver]map[string]string{
- DM: {
- "admin": `"admin"`,
- "value": `"value"`,
- "exchange": `"exchange"`,
- },
- }
- replacements, ok := rules[dbDriver]
- if !ok {
- return sql
- }
- for keyword, replace := range replacements {
- // 仅替换单独的单词,复合单词含关键词不管
- pattern := fmt.Sprintf(`\b%s\b`, regexp.QuoteMeta(keyword))
- re := regexp.MustCompile(pattern)
- sql = re.ReplaceAllString(sql, replace)
- }
- return sql
- }
|