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