...
|
...
|
@@ -5,11 +5,14 @@ import ( |
|
|
"fmt"
|
|
|
"gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain"
|
|
|
"gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/utils"
|
|
|
"gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/log"
|
|
|
"gorm.io/gorm"
|
|
|
"reflect"
|
|
|
"strings"
|
|
|
)
|
|
|
|
|
|
var AssertString = utils.AssertString
|
|
|
|
|
|
func Query(params QueryOptions, queryFunc func(params QueryOptions) (*sql.Rows, error)) (*domain.DataTable, error) {
|
|
|
rows, err := queryFunc(params)
|
|
|
if err != nil {
|
...
|
...
|
@@ -97,6 +100,27 @@ func (c Condition) SetWhere(q *gorm.DB) { |
|
|
in := c.InArgs(c.Ex)
|
|
|
q.Where(fmt.Sprintf("%v not in %v", c.Field.SQLName, in))
|
|
|
}
|
|
|
if len(c.Range) > 0 {
|
|
|
for _, item := range c.Range {
|
|
|
if item.Op == "" {
|
|
|
continue
|
|
|
}
|
|
|
opVal, ok := opMap[item.Op]
|
|
|
if !ok {
|
|
|
continue
|
|
|
}
|
|
|
val, err := domain.ValueToType(AssertString(item.Val), c.Field.SQLType)
|
|
|
if err != nil {
|
|
|
log.Logger.Error(err.Error())
|
|
|
continue
|
|
|
}
|
|
|
q.Where(fmt.Sprintf("%s %s %s",
|
|
|
c.Field.SQLName,
|
|
|
opVal,
|
|
|
c.formatByOp(item.Op, val),
|
|
|
))
|
|
|
}
|
|
|
}
|
|
|
if c.Distinct {
|
|
|
q.Distinct(c.Field.SQLName)
|
|
|
}
|
...
|
...
|
@@ -104,12 +128,37 @@ func (c Condition) SetWhere(q *gorm.DB) { |
|
|
q.Order(fmt.Sprintf("%v %v", c.Field.SQLName, c.Order))
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var opMap = map[string]string{
|
|
|
"=": "=",
|
|
|
">": ">",
|
|
|
"<": "<",
|
|
|
">=": ">=",
|
|
|
"<=": "<=",
|
|
|
"<>": "<>",
|
|
|
"like": "like",
|
|
|
"not like": "not like",
|
|
|
}
|
|
|
|
|
|
func (c Condition) formatByOp(op string, val interface{}) string {
|
|
|
if op == "like" || op == "not like" {
|
|
|
return fmt.Sprintf("'%%%v%%'", AssertString(val))
|
|
|
}
|
|
|
return c.Arg(val)
|
|
|
}
|
|
|
|
|
|
func (c Condition) InArgs(args interface{}) string {
|
|
|
bytes := make([]byte, 0)
|
|
|
bytes = appendIn(bytes, reflect.ValueOf(args))
|
|
|
return string(bytes)
|
|
|
}
|
|
|
|
|
|
func (c Condition) Arg(args interface{}) string {
|
|
|
bytes := make([]byte, 0)
|
|
|
bytes = appendValue(bytes, reflect.ValueOf(args))
|
|
|
return string(bytes)
|
|
|
}
|
|
|
|
|
|
func appendIn(b []byte, slice reflect.Value) []byte {
|
|
|
sliceLen := slice.Len()
|
|
|
b = append(b, '(')
|
...
|
...
|
@@ -186,7 +235,7 @@ func queryWithoutLimitOffset(query *gorm.DB, params QueryOptions) { |
|
|
if len(params.Select) > 0 {
|
|
|
fields := make([]string, 0)
|
|
|
for _, f := range params.Select {
|
|
|
if f.Flag==domain.ManualField{
|
|
|
if f.Flag == domain.ManualField {
|
|
|
fields = append(fields, "'' "+f.SQLName)
|
|
|
continue
|
|
|
}
|
...
|
...
|
@@ -226,7 +275,7 @@ func WrapQueryCountWithDB(params QueryOptions, db *gorm.DB) func() (int64, error |
|
|
func ArrayInterfaceToString(args []interface{}) []string {
|
|
|
result := make([]string, 0)
|
|
|
for _, arg := range args {
|
|
|
result = append(result, utils.AssertString(arg))
|
|
|
result = append(result, AssertString(arg))
|
|
|
}
|
|
|
return result
|
|
|
} |
...
|
...
|
|