|
@@ -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
|
|
|
+}
|