start adding more complex filter support
This commit is contained in:
+110
@@ -0,0 +1,110 @@
|
|||||||
|
package arango
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Operator error.
|
||||||
|
var (
|
||||||
|
ErrInvalidOperator = errors.New("invalid operator")
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
operators = map[string]string{
|
||||||
|
// Idempotent
|
||||||
|
"==": "==",
|
||||||
|
"!=": "!=",
|
||||||
|
">": ">",
|
||||||
|
">=": ">=",
|
||||||
|
"<": "<",
|
||||||
|
"<=": "<=",
|
||||||
|
"IN": "IN",
|
||||||
|
"NOT IN": "NOT IN",
|
||||||
|
"LIKE": "LIKE",
|
||||||
|
"NOT LIKE": "NOT LIKE",
|
||||||
|
|
||||||
|
// Compatible with Filter.Operator in github.com/recipeer/go/qs
|
||||||
|
"eq": "==",
|
||||||
|
"neq": "!=",
|
||||||
|
"gt": ">",
|
||||||
|
"gte": ">=",
|
||||||
|
"lt": "<",
|
||||||
|
"lte": "<=",
|
||||||
|
"in": "IN",
|
||||||
|
"not in": "NOT IN",
|
||||||
|
"like": "LIKE",
|
||||||
|
"not like": "NOT LIKE",
|
||||||
|
}
|
||||||
|
|
||||||
|
arrayOperators = []string{"IN", "NOT IN"}
|
||||||
|
boolOperators = []string{"==", "!="}
|
||||||
|
numberOperators = []string{"==", "!=", ">", ">=", "<", "<="}
|
||||||
|
stringOperators = []string{"==", "!=", ">", ">=", "<", "<=", "LIKE", "NOT LIKE"}
|
||||||
|
)
|
||||||
|
|
||||||
|
// IsArrayOperator returns true if the given operator can be used with an array value.
|
||||||
|
func IsArrayOperator(op string) bool {
|
||||||
|
op, _ = ParseOperator(op)
|
||||||
|
if op == "" {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
for _, arrOp := range arrayOperators {
|
||||||
|
if arrOp == op {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsBoolOperator returns true if the given operator can be used with a Boolean value.
|
||||||
|
func IsBoolOperator(op string) bool {
|
||||||
|
op, _ = ParseOperator(op)
|
||||||
|
if op == "" {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
for _, boolOp := range boolOperators {
|
||||||
|
if boolOp == op {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsNumberOperator returns true if the given operator can be used with a numeric value.
|
||||||
|
func IsNumberOperator(op string) bool {
|
||||||
|
op, _ = ParseOperator(op)
|
||||||
|
if op == "" {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
for _, numOp := range numberOperators {
|
||||||
|
if numOp == op {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsStringOperator returns true if the given operator can be used with a string value.
|
||||||
|
func IsStringOperator(op string) bool {
|
||||||
|
op, _ = ParseOperator(op)
|
||||||
|
if op == "" {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
for _, strOp := range stringOperators {
|
||||||
|
if strOp == op {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// ParseOperator returns the valid AQL operator for an arbitrary operator string.
|
||||||
|
// This supports different inputs, such as Filter.Operator in github.com/recipeer/go/qs
|
||||||
|
//
|
||||||
|
// If the input operator cannot be mapped to AQL, this function returns ErrInvalidOperator.
|
||||||
|
func ParseOperator(op string) (string, error) {
|
||||||
|
if operators[op] == "" {
|
||||||
|
return "", ErrInvalidOperator
|
||||||
|
}
|
||||||
|
return operators[op], nil
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user