From fc39c1692646a0d9e31c2bc91ad8cdc3f819ccb4 Mon Sep 17 00:00:00 2001 From: Aneurin Barker Snook Date: Thu, 12 Oct 2023 23:50:45 +0100 Subject: [PATCH] start adding more complex filter support --- operator.go | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 operator.go diff --git a/operator.go b/operator.go new file mode 100644 index 0000000..f9b2ede --- /dev/null +++ b/operator.go @@ -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 +}