Jelajahi Sumber

make operator parsing more efficient

Aneurin Barker Snook 1 tahun lalu
induk
melakukan
ba919a17e9
1 mengubah file dengan 42 tambahan dan 57 penghapusan
  1. 42 57
      operator.go

+ 42 - 57
operator.go

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