|  | @@ -6,7 +6,8 @@ import (
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Operator error.
 | 
	
		
			
				|  |  |  var (
 | 
	
		
			
				|  |  | -	ErrInvalidOperator = errors.New("invalid operator")
 | 
	
		
			
				|  |  | +	ErrInvalidOperator        = errors.New("invalid operator")
 | 
	
		
			
				|  |  | +	ErrInvalidOperatorForType = errors.New("invalid operator for type")
 | 
	
		
			
				|  |  |  )
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  var (
 | 
	
	
		
			
				|  | @@ -36,93 +37,73 @@ var (
 | 
	
		
			
				|  |  |  		"not like": "NOT LIKE",
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	arrayOperators  = []string{"IN", "NOT IN"}
 | 
	
		
			
				|  |  | -	boolOperators   = []string{"==", "!="}
 | 
	
		
			
				|  |  | -	numberOperators = []string{"==", "!=", ">", ">=", "<", "<="}
 | 
	
		
			
				|  |  | -	stringOperators = []string{"==", "!=", ">", ">=", "<", "<=", "LIKE", "NOT LIKE"}
 | 
	
		
			
				|  |  | +	arrayOperators  = map[string]bool{"IN": true, "NOT IN": true}
 | 
	
		
			
				|  |  | +	boolOperators   = map[string]bool{"==": true, "!=": true}
 | 
	
		
			
				|  |  | +	numberOperators = map[string]bool{"==": true, "!=": true, ">": true, ">=": true, "<": true, "<=": true}
 | 
	
		
			
				|  |  | +	stringOperators = map[string]bool{"==": true, "!=": true, ">": true, ">=": true, "<": true, "<=": true, "LIKE": true, "NOT LIKE": true}
 | 
	
		
			
				|  |  |  )
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // 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
 | 
	
		
			
				|  |  | +	_, err := ParseArrayOperator(op)
 | 
	
		
			
				|  |  | +	return err == nil
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // 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
 | 
	
		
			
				|  |  | +	_, err := ParseBoolOperator(op)
 | 
	
		
			
				|  |  | +	return err == nil
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // 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
 | 
	
		
			
				|  |  | +	_, err := ParseNumberOperator(op)
 | 
	
		
			
				|  |  | +	return err == nil
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // 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
 | 
	
		
			
				|  |  | +	_, err := ParseStringOperator(op)
 | 
	
		
			
				|  |  | +	return err == nil
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // ParseArrayOperator returns the valid AQL operator for an array operator.
 | 
	
		
			
				|  |  |  // It returns an error if the operator cannot be mapped to AQL or does not support arrays.
 | 
	
		
			
				|  |  |  func ParseArrayOperator(op string) (string, error) {
 | 
	
		
			
				|  |  | -	if !IsArrayOperator(op) {
 | 
	
		
			
				|  |  | -		return "", ErrInvalidOperator
 | 
	
		
			
				|  |  | +	op, err := ParseOperator(op)
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		return op, err
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	if !arrayOperators[op] {
 | 
	
		
			
				|  |  | +		return op, ErrInvalidOperatorForType
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	return ParseOperator(op)
 | 
	
		
			
				|  |  | +	return op, nil
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // ParseBoolOperator returns the valid AQL operator for a Boolean operator.
 | 
	
		
			
				|  |  |  // It returns an error if the operator cannot be mapped to AQL or does not support Booleans.
 | 
	
		
			
				|  |  |  func ParseBoolOperator(op string) (string, error) {
 | 
	
		
			
				|  |  | -	if !IsBoolOperator(op) {
 | 
	
		
			
				|  |  | -		return "", ErrInvalidOperator
 | 
	
		
			
				|  |  | +	op, err := ParseOperator(op)
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		return op, err
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	if !boolOperators[op] {
 | 
	
		
			
				|  |  | +		return op, ErrInvalidOperatorForType
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	return ParseOperator(op)
 | 
	
		
			
				|  |  | +	return op, nil
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // ParseNumberOperator returns the valid AQL operator for a numeric operator.
 | 
	
		
			
				|  |  |  // It returns an error if the operator cannot be mapped to AQL or does not support numbers.
 | 
	
		
			
				|  |  |  func ParseNumberOperator(op string) (string, error) {
 | 
	
		
			
				|  |  | -	if !IsNumberOperator(op) {
 | 
	
		
			
				|  |  | -		return "", ErrInvalidOperator
 | 
	
		
			
				|  |  | +	op, err := ParseOperator(op)
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		return op, err
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	if !numberOperators[op] {
 | 
	
		
			
				|  |  | +		return op, ErrInvalidOperatorForType
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	return ParseOperator(op)
 | 
	
		
			
				|  |  | +	return op, nil
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // ParseOperator returns the valid AQL operator for an arbitrary operator string.
 | 
	
	
		
			
				|  | @@ -139,8 +120,12 @@ func ParseOperator(op string) (string, error) {
 | 
	
		
			
				|  |  |  // ParseStringOperator returns the valid AQL operator for a string operator.
 | 
	
		
			
				|  |  |  // It returns an error if the operator cannot be mapped to AQL or does not support strings.
 | 
	
		
			
				|  |  |  func ParseStringOperator(op string) (string, error) {
 | 
	
		
			
				|  |  | -	if !IsStringOperator(op) {
 | 
	
		
			
				|  |  | -		return "", ErrInvalidOperator
 | 
	
		
			
				|  |  | +	op, err := ParseOperator(op)
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		return op, err
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	if !stringOperators[op] {
 | 
	
		
			
				|  |  | +		return op, ErrInvalidOperatorForType
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	return ParseOperator(op)
 | 
	
		
			
				|  |  | +	return op, nil
 | 
	
		
			
				|  |  |  }
 |