/// <inheritdoc/>
        public virtual void RenderConvertFrom(Expression innerExpression, IN1QlExpressionTreeVisitor expressionTreeVisitor)
        {
            var unwrapped = UnwrapInverseMethod(innerExpression, ConvertToMethods.Values);

            if (unwrapped != null)
            {
                expressionTreeVisitor.Visit(unwrapped);
            }
            else
            {
                RenderConvertFromMethod(innerExpression, expressionTreeVisitor);
            }
        }
        /// <inheritdoc/>
        protected override void RenderConvertedConstant(ConstantExpression constantExpression, IN1QlExpressionTreeVisitor expressionTreeVisitor)
        {
            if (constantExpression.Value == null)
            {
                // Don't try to convert nulls
                expressionTreeVisitor.Visit(constantExpression);
            }
            else
            {
                var dateTime         = GetDateTime(constantExpression);
                var unixMilliseconds = (dateTime - UnixEpoch).TotalMilliseconds;

                // ReSharper disable once CompareOfFloatsByEqualityOperator
                if (Math.Floor(unixMilliseconds) == unixMilliseconds)
                {
                    expressionTreeVisitor.Expression.Append((long)unixMilliseconds);
                }
                else
                {
                    expressionTreeVisitor.Expression.Append(unixMilliseconds);
                }
            }
        }
 /// <inheritdoc/>
 protected override void RenderConvertFromMethod(Expression innerExpression, IN1QlExpressionTreeVisitor expressionTreeVisitor)
 {
     expressionTreeVisitor.Expression.Append("MILLIS_TO_STR(");
     expressionTreeVisitor.Visit(innerExpression);
     expressionTreeVisitor.Expression.Append(')');
 }
 protected override void RenderConvertedConstant(ConstantExpression constantExpression, IN1QlExpressionTreeVisitor expressionTreeVisitor)
 {
     throw new NotImplementedException();
 }
 protected override void RenderConvertFromMethod(Expression innerExpression, IN1QlExpressionTreeVisitor expressionTreeVisitor)
 {
     throw new NotImplementedException();
 }
 /// <summary>
 /// Renders a constant which has been preconverted to the custom format onto a N1QL query.
 /// </summary>
 /// <param name="constantExpression">The expression being converted.</param>
 /// <param name="expressionTreeVisitor"><see cref="IN1QlExpressionTreeVisitor"/> rendering the query.</param>
 protected abstract void RenderConvertedConstant(ConstantExpression constantExpression,
                                                 IN1QlExpressionTreeVisitor expressionTreeVisitor);
 /// <summary>
 /// Renders a conversion from the custom format to the standard format onto a N1QL query.
 /// </summary>
 /// <param name="innerExpression">The expression being converted.</param>
 /// <param name="expressionTreeVisitor"><see cref="IN1QlExpressionTreeVisitor"/> rendering the query.</param>
 protected abstract void RenderConvertFromMethod(Expression innerExpression,
                                                 IN1QlExpressionTreeVisitor expressionTreeVisitor);
        /// <inheritdoc/>
        protected override void RenderConvertedConstant(ConstantExpression constantExpression, IN1QlExpressionTreeVisitor expressionTreeVisitor)
        {
            if (constantExpression.Value == null)
            {
                // Don't try to convert nulls
                expressionTreeVisitor.Visit(constantExpression);
            }
            else
            {
                using (var writer = new JTokenWriter())
                {
                    _jsonConverter.WriteJson(writer, constantExpression.Value,
                                             JsonSerializer.CreateDefault());

                    expressionTreeVisitor.Visit(Expression.Constant(writer.Token.ToString()));
                }
            }
        }
 /// <inheritdoc/>
 protected override void RenderConvertFromMethod(Expression innerExpression, IN1QlExpressionTreeVisitor expressionTreeVisitor)
 {
     // Don't try to convert in N1QL, for enums we're only supporting constants as strings
     expressionTreeVisitor.Visit(innerExpression);
 }
 protected override void RenderConvertToMethod(Expression innerExpression, IN1QlExpressionTreeVisitor expressionTreeVisitor)
 {
     expressionTreeVisitor.Visit(innerExpression);
 }
 protected override void RenderConvertedConstant(ConstantExpression constantExpression, IN1QlExpressionTreeVisitor expressionTreeVisitor)
 {
     expressionTreeVisitor.Expression.Append("'");
     expressionTreeVisitor.Visit(constantExpression);
     expressionTreeVisitor.Expression.Append("'");
 }