|
@@ -6,7 +6,8 @@ import (
|
|
|
|
|
|
|
|
|
var (
|
|
|
- ErrInvalidOperator = errors.New("invalid operator")
|
|
|
+ ErrInvalidOperator = errors.New("invalid operator")
|
|
|
+ ErrInvalidOperatorForType = errors.New("invalid operator for type")
|
|
|
)
|
|
|
|
|
|
var (
|
|
@@ -36,93 +37,73 @@ var (
|
|
|
"not like": "NOT LIKE",
|
|
|
}
|
|
|
|
|
|
- arrayOperators = []string{"IN", "NOT IN"}
|
|
|
- boolOperators = []string{"==", "!="}
|
|
|
- numberOperators = []string{"==", "!=", ">", ">=", "<", "<="}
|
|
|
- stringOperators = []string{"==", "!=", ">", ">=", "<", "<=", "LIKE", "NOT LIKE"}
|
|
|
+ arrayOperators = map[string]bool{"IN": true, "NOT IN": true}
|
|
|
+ boolOperators = map[string]bool{"==": true, "!=": true}
|
|
|
+ numberOperators = map[string]bool{"==": true, "!=": true, ">": true, ">=": true, "<": true, "<=": true}
|
|
|
+ stringOperators = map[string]bool{"==": true, "!=": true, ">": true, ">=": true, "<": true, "<=": true, "LIKE": true, "NOT LIKE": true}
|
|
|
)
|
|
|
|
|
|
|
|
|
func IsArrayOperator(op string) bool {
|
|
|
- op, _ = ParseOperator(op)
|
|
|
- if op == "" {
|
|
|
- return false
|
|
|
- }
|
|
|
- for _, arrOp := range arrayOperators {
|
|
|
- if arrOp == op {
|
|
|
- return true
|
|
|
- }
|
|
|
- }
|
|
|
- return false
|
|
|
+ _, err := ParseArrayOperator(op)
|
|
|
+ return err == nil
|
|
|
}
|
|
|
|
|
|
|
|
|
func IsBoolOperator(op string) bool {
|
|
|
- op, _ = ParseOperator(op)
|
|
|
- if op == "" {
|
|
|
- return false
|
|
|
- }
|
|
|
- for _, boolOp := range boolOperators {
|
|
|
- if boolOp == op {
|
|
|
- return true
|
|
|
- }
|
|
|
- }
|
|
|
- return false
|
|
|
+ _, err := ParseBoolOperator(op)
|
|
|
+ return err == nil
|
|
|
}
|
|
|
|
|
|
|
|
|
func IsNumberOperator(op string) bool {
|
|
|
- op, _ = ParseOperator(op)
|
|
|
- if op == "" {
|
|
|
- return false
|
|
|
- }
|
|
|
- for _, numOp := range numberOperators {
|
|
|
- if numOp == op {
|
|
|
- return true
|
|
|
- }
|
|
|
- }
|
|
|
- return false
|
|
|
+ _, err := ParseNumberOperator(op)
|
|
|
+ return err == nil
|
|
|
}
|
|
|
|
|
|
|
|
|
func IsStringOperator(op string) bool {
|
|
|
- op, _ = ParseOperator(op)
|
|
|
- if op == "" {
|
|
|
- return false
|
|
|
- }
|
|
|
- for _, strOp := range stringOperators {
|
|
|
- if strOp == op {
|
|
|
- return true
|
|
|
- }
|
|
|
- }
|
|
|
- return false
|
|
|
+ _, err := ParseStringOperator(op)
|
|
|
+ return err == nil
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func ParseArrayOperator(op string) (string, error) {
|
|
|
- if !IsArrayOperator(op) {
|
|
|
- return "", ErrInvalidOperator
|
|
|
+ op, err := ParseOperator(op)
|
|
|
+ if err != nil {
|
|
|
+ return op, err
|
|
|
+ }
|
|
|
+ if !arrayOperators[op] {
|
|
|
+ return op, ErrInvalidOperatorForType
|
|
|
}
|
|
|
- return ParseOperator(op)
|
|
|
+ return op, nil
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func ParseBoolOperator(op string) (string, error) {
|
|
|
- if !IsBoolOperator(op) {
|
|
|
- return "", ErrInvalidOperator
|
|
|
+ op, err := ParseOperator(op)
|
|
|
+ if err != nil {
|
|
|
+ return op, err
|
|
|
+ }
|
|
|
+ if !boolOperators[op] {
|
|
|
+ return op, ErrInvalidOperatorForType
|
|
|
}
|
|
|
- return ParseOperator(op)
|
|
|
+ return op, nil
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func ParseNumberOperator(op string) (string, error) {
|
|
|
- if !IsNumberOperator(op) {
|
|
|
- return "", ErrInvalidOperator
|
|
|
+ op, err := ParseOperator(op)
|
|
|
+ if err != nil {
|
|
|
+ return op, err
|
|
|
+ }
|
|
|
+ if !numberOperators[op] {
|
|
|
+ return op, ErrInvalidOperatorForType
|
|
|
}
|
|
|
- return ParseOperator(op)
|
|
|
+ return op, nil
|
|
|
}
|
|
|
|
|
|
|
|
@@ -139,8 +120,12 @@ func ParseOperator(op string) (string, error) {
|
|
|
|
|
|
|
|
|
func ParseStringOperator(op string) (string, error) {
|
|
|
- if !IsStringOperator(op) {
|
|
|
- return "", ErrInvalidOperator
|
|
|
+ op, err := ParseOperator(op)
|
|
|
+ if err != nil {
|
|
|
+ return op, err
|
|
|
+ }
|
|
|
+ if !stringOperators[op] {
|
|
|
+ return op, ErrInvalidOperatorForType
|
|
|
}
|
|
|
- return ParseOperator(op)
|
|
|
+ return op, nil
|
|
|
}
|