/// <summary>
        /// Computes the specified item1.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="item1">The item1.</param>
        /// <param name="item2">The item2.</param>
        /// <param name="computeOperator">The compute operator.</param>
        /// <returns><c>true</c> if compute as true, <c>false</c> otherwise.</returns>
        private static bool Compute <T>(T item1, T item2, ComputeOperator computeOperator) where T : struct, IComparable
        {
            switch (computeOperator)
            {
            case ComputeOperator.GreatThan:
                return(item1.CompareTo(item2) > 0);

            case ComputeOperator.GreatThanOrEquals:
                return(item1.CompareTo(item2) >= 0);

            case ComputeOperator.LessThan:
                return(item1.CompareTo(item2) < 0);

            case ComputeOperator.LessThanOrEquals:
                return(item1.CompareTo(item2) <= 0);

            case ComputeOperator.NotEquals:
                return(!item1.Equals(item2));

            case ComputeOperator.Equals:
                return(item1.Equals(item2));

            default:
                throw ExceptionFactory.CreateInvalidObjectException(nameof(computeOperator), new
                {
                    ComputeOperator = computeOperator.EnumToString(),
                    Type            = typeof(T).FullName
                });
            }
        }
        /// <summary>
        /// Computes as string.
        /// </summary>
        /// <param name="item1">The item1.</param>
        /// <param name="item2">The item2.</param>
        /// <param name="computeOperator">The compute operator.</param>
        /// <returns><c>true</c> if compute as true, <c>false</c> otherwise.</returns>
        private static bool ComputeAsString(string item1, string item2, ComputeOperator computeOperator)
        {
            switch (computeOperator)
            {
            case ComputeOperator.EndWith:
                return(!string.IsNullOrEmpty(item1) && !string.IsNullOrEmpty(item2) && item1.EndsWith(item2));

            case ComputeOperator.StartWith:
                return(!string.IsNullOrEmpty(item1) && !string.IsNullOrEmpty(item2) && item1.StartsWith(item2));

            case ComputeOperator.Equals:
                return(!string.IsNullOrEmpty(item1) && !string.IsNullOrEmpty(item2) && item1.Equals(item2));

            case ComputeOperator.NotEquals:
                return(!string.IsNullOrEmpty(item1) && !string.IsNullOrEmpty(item2) && !item1.Equals(item2));

            case ComputeOperator.Contains:
                return(!string.IsNullOrEmpty(item1) && !string.IsNullOrEmpty(item2) && item1.Contains(item2));

            case ComputeOperator.NotContains:
                return(!string.IsNullOrEmpty(item1) && !string.IsNullOrEmpty(item2) && !item1.Contains(item2));

            default:
                throw ExceptionFactory.CreateInvalidObjectException(nameof(computeOperator), new
                {
                    ComputeOperator = computeOperator.EnumToString()
                });
            }
        }
        /// <summary>
        /// Determines whether [is compute operator] [the specified input].
        /// </summary>
        /// <param name="input">The input.</param>
        /// <param name="computeOperator">The compute operator.</param>
        /// <returns><c>true</c> if [is compute operator] [the specified input]; otherwise, <c>false</c>.</returns>
        private bool IsComputeOperator(string input, out ComputeOperator computeOperator)
        {
            var result = BooleanSearchCore.ToComputeOperator(input);

            if (result.HasValue)
            {
                computeOperator = result.Value;
                return(true);
            }

            computeOperator = default(ComputeOperator);
            return(false);
        }
        /// <summary>
        /// Computes as object.
        /// </summary>
        /// <param name="item1">The item1.</param>
        /// <param name="item2">The item2.</param>
        /// <param name="computeOperator">The compute operator.</param>
        /// <returns><c>true</c> if compute as true, <c>false</c> otherwise.</returns>
        private static bool ComputeAsObject(JObject item1, string item2, ComputeOperator computeOperator)
        {
            switch (computeOperator)
            {
            case ComputeOperator.Exists:
                return(item1 != null && !string.IsNullOrWhiteSpace(item2) && item1.GetProperty(item2) != null);

            default:
                throw ExceptionFactory.CreateInvalidObjectException(nameof(computeOperator), new
                {
                    ComputeOperator = computeOperator.EnumToString()
                });
            }
        }
        /// <summary>
        /// Computes as array.
        /// </summary>
        /// <param name="item1">The item1.</param>
        /// <param name="item2">The item2.</param>
        /// <param name="computeOperator">The compute operator.</param>
        /// <returns><c>true</c> if compute as true, <c>false</c> otherwise.</returns>
        private static bool ComputeAsArray(JArray item1, string item2, ComputeOperator computeOperator)
        {
            switch (computeOperator)
            {
            case ComputeOperator.Contains:
                return(item1.Contains <JToken, string>(item2, x => x.ToObject <string>(), (x, y) => x.Equals(y, StringComparison.OrdinalIgnoreCase)));

            case ComputeOperator.NotContains:
                return(!item1.Contains <JToken, string>(item2, x => x.ToObject <string>(), (x, y) => x.Equals(y, StringComparison.OrdinalIgnoreCase)));

            default:
                throw ExceptionFactory.CreateInvalidObjectException(nameof(computeOperator), new
                {
                    ComputeOperator = computeOperator.EnumToString()
                });
            }
        }
        /// <summary>
        /// Computes as boolean.
        /// </summary>
        /// <param name="item1">if set to <c>true</c> [item1].</param>
        /// <param name="item2">if set to <c>true</c> [item2].</param>
        /// <param name="computeOperator">The compute operator.</param>
        /// <returns><c>true</c> if compute as true, <c>false</c> otherwise.</returns>
        private static bool ComputeAsBoolean(bool item1, bool item2, ComputeOperator computeOperator)
        {
            switch (computeOperator)
            {
            case ComputeOperator.Equals:
                return(item1 == item2);

            case ComputeOperator.NotEquals:
                return(item1 != item2);

            default:
                throw ExceptionFactory.CreateInvalidObjectException(nameof(computeOperator), new
                {
                    ComputeOperator = computeOperator.EnumToString()
                });
            }
        }
 /// <summary>
 /// To the expression string.
 /// </summary>
 /// <param name="computeOperator">The compute operator.</param>
 /// <returns>System.String.</returns>
 internal static string ToExpressionString(ComputeOperator computeOperator)
 {
     return(computeOperatorStrings[(int)computeOperator]);
 }