diff --git a/grmi/ConditionItem.go b/grmi/ConditionItem.go index 4446140..359793d 100644 --- a/grmi/ConditionItem.go +++ b/grmi/ConditionItem.go @@ -2,11 +2,11 @@ package grmi type ConditionItem struct { Field - PredicateType func(Predicate) string + PredicateType func(Predicate) (string, error) OrderBy bool valueParser func(string) (interface{}, error) } -func NewConditionItem(field Field, predicateType func(Predicate) string, orderBy bool) ConditionItem { +func NewConditionItem(field Field, predicateType func(Predicate) (string, error), orderBy bool) ConditionItem { return ConditionItem{field, predicateType, orderBy, nil} } diff --git a/grmi/Field.go b/grmi/Field.go index a594e4a..d3118d5 100644 --- a/grmi/Field.go +++ b/grmi/Field.go @@ -11,6 +11,6 @@ func NewField(name string, columnName string, urlParameterName string, goType Go return Field{name, columnName, urlParameterName, goType} } -func (field *Field) NewPredicate(predicateType func(Predicate) string, values ...interface{}) Predicate { +func (field *Field) NewPredicate(predicateType func(Predicate) (string, error), values ...interface{}) Predicate { return NewPredicate(field.ColumnName, predicateType, values) } diff --git a/grmi/Predicate.go b/grmi/Predicate.go index c8fbb2f..27b48d4 100644 --- a/grmi/Predicate.go +++ b/grmi/Predicate.go @@ -1,15 +1,21 @@ package grmi +import "log" + type Predicate struct { ColumnName string - PredicateType func(Predicate) string + PredicateType func(Predicate) (string, error) Values []interface{} } -func NewPredicate(columnName string, predicateType func(Predicate) string, values []interface{}) Predicate { +func NewPredicate(columnName string, predicateType func(Predicate) (string, error), values []interface{}) Predicate { return Predicate{columnName, predicateType, values} } func (self *Predicate) Build() string { - return self.PredicateType(*self) + result, err := self.PredicateType(*self) + if err != nil { + log.Println(err.Error()) + } + return result } diff --git a/grmi/grmi.go b/grmi/grmi.go index ba7575f..a30af68 100644 --- a/grmi/grmi.go +++ b/grmi/grmi.go @@ -4,6 +4,7 @@ import ( "LAPP_GAAS_GFrame_BACKEND/container" "LAPP_GAAS_GFrame_BACKEND/utils" "LAPP_GAAS_GFrame_BACKEND/web/models" + "errors" "fmt" "github.com/kataras/iris/v12/core/router" "strconv" @@ -68,48 +69,76 @@ func RepeatStrings(content string, count int) []string { return result } -func Equal(predicate Predicate) string { - return fmt.Sprintf(" and %s = ?", predicate.ColumnName) +func Equal(predicate Predicate) (string, error) { + if predicate.Values == nil || len(predicate.Values) != 1 { + return "", errors.New("相等性比较只支持一个参数") + } + return fmt.Sprintf(" and %s = ?", predicate.ColumnName), nil } -func NotEqual(predicate Predicate) string { - return fmt.Sprintf(" and %s <> ?", predicate.ColumnName) +func NotEqual(predicate Predicate) (string, error) { + if predicate.Values == nil || len(predicate.Values) != 1 { + return "", errors.New("相等性比较只支持一个参数") + } + return fmt.Sprintf(" and %s <> ?", predicate.ColumnName), nil } -func Like(predicate Predicate) string { - return fmt.Sprintf(" and %s like concat('%%', ?, '%%')", predicate.ColumnName) +func Like(predicate Predicate) (string, error) { + if predicate.Values == nil || len(predicate.Values) != 1 { + return "", errors.New("相似性比较只支持一个参数") + } + return fmt.Sprintf(" and %s like concat('%%', ?, '%%')", predicate.ColumnName), nil } -func NotLike(predicate Predicate) string { - return fmt.Sprintf(" and %s not like concat('%%', ?, '%%')", predicate.ColumnName) +func NotLike(predicate Predicate) (string, error) { + if predicate.Values == nil || len(predicate.Values) != 1 { + return "", errors.New("相似性比较只支持一个参数") + } + return fmt.Sprintf(" and %s not like concat('%%', ?, '%%')", predicate.ColumnName), nil } -func IsNull(predicate Predicate) string { - return fmt.Sprintf(" and %s is null", predicate.ColumnName) +func IsNull(predicate Predicate) (string, error) { + if predicate.Values != nil && len(predicate.Values) > 0 { + return "", errors.New("为空比较比较不支持参数") + } + return fmt.Sprintf(" and %s is null", predicate.ColumnName), nil } -func IsNotNull(predicate Predicate) string { - return fmt.Sprintf(" and %s is not null", predicate.ColumnName) +func IsNotNull(predicate Predicate) (string, error) { + if predicate.Values != nil && len(predicate.Values) > 0 { + return "", errors.New("为空比较比较不支持参数") + } + return fmt.Sprintf(" and %s is not null", predicate.ColumnName), nil } -func Include(predicate Predicate) string { +func Include(predicate Predicate) (string, error) { if predicate.Values != nil && len(predicate.Values) > 0 { - return fmt.Sprintf(" and %s in (%s)", predicate.ColumnName, strings.Join(RepeatStrings("?", len(predicate.Values)), ",")) + return fmt.Sprintf(" and %s in (%s)", predicate.ColumnName, strings.Join(RepeatStrings("?", len(predicate.Values)), ",")), nil } else { - return " and 1 <> 1" + return " and 1 <> 1", nil } } -func Exclude(predicate Predicate) string { - return fmt.Sprintf(" and %s not in (%s)", predicate.ColumnName, strings.Join(RepeatStrings("?", len(predicate.Values)), ",")) +func Exclude(predicate Predicate) (string, error) { + if predicate.Values != nil && len(predicate.Values) > 0 { + return fmt.Sprintf(" and %s not in (%s)", predicate.ColumnName, strings.Join(RepeatStrings("?", len(predicate.Values)), ",")), nil + } else { + return " and 1 = 1", nil + } } -func Approximate(predicate Predicate) string { - return fmt.Sprintf(" and datediff(second, %s, ?) = 0", predicate.ColumnName) +func Approximate(predicate Predicate) (string, error) { + if predicate.Values == nil || len(predicate.Values) != 1 { + return "", errors.New("约等于比较比较只支持一个参数") + } + return fmt.Sprintf(" and datediff(second, %s, ?) = 0", predicate.ColumnName), nil } -func NotApproximate(predicate Predicate) string { - return fmt.Sprintf(" and datediff(second, %s, ?) <> 0", predicate.ColumnName) +func NotApproximate(predicate Predicate) (string, error) { + if predicate.Values == nil || len(predicate.Values) != 1 { + return "", errors.New("约等于比较比较只支持一个参数") + } + return fmt.Sprintf(" and datediff(second, %s, ?) <> 0", predicate.ColumnName), nil } func Log(user *models.Usertab, codeFile string, function string, message string) {