start adding more complex filter support

This commit is contained in:
Aneurin Barker Snook
2023-10-12 23:50:45 +01:00
parent 25b14743be
commit fc39c16926
+110
View File
@@ -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
}