Ejemplo n.º 1
0
        public static AstFilter Translate(TranslationContext context, BinaryExpression expression, BinaryExpression moduloExpression, Expression remainderExpression)
        {
            var fieldExpression = moduloExpression.Left;
            var field           = ExpressionToFilterFieldTranslator.Translate(context, fieldExpression);

            var       divisorExpression = moduloExpression.Right;
            BsonValue divisor;
            BsonValue remainder;

            if (divisorExpression.Type == typeof(decimal) && remainderExpression.Type == typeof(decimal))
            {
                divisor   = divisorExpression.GetConstantValue <decimal>(containingExpression: moduloExpression);
                remainder = remainderExpression.GetConstantValue <decimal>(containingExpression: expression);
            }
            else if (divisorExpression.Type == typeof(double) && remainderExpression.Type == typeof(double))
            {
                divisor   = divisorExpression.GetConstantValue <double>(containingExpression: moduloExpression);
                remainder = remainderExpression.GetConstantValue <double>(containingExpression: expression);
            }
            else if (divisorExpression.Type == typeof(float) && remainderExpression.Type == typeof(float))
            {
                divisor   = divisorExpression.GetConstantValue <float>(containingExpression: moduloExpression);
                remainder = remainderExpression.GetConstantValue <float>(containingExpression: expression);
            }
            else if (divisorExpression.Type == typeof(int) && remainderExpression.Type == typeof(int))
            {
                divisor   = divisorExpression.GetConstantValue <int>(containingExpression: moduloExpression);
                remainder = remainderExpression.GetConstantValue <int>(containingExpression: expression);
            }
            else if (divisorExpression.Type == typeof(long) && remainderExpression.Type == typeof(long))
            {
                divisor   = divisorExpression.GetConstantValue <long>(containingExpression: moduloExpression);
                remainder = remainderExpression.GetConstantValue <long>(containingExpression: expression);
            }
            else if (divisorExpression.Type == typeof(uint) && remainderExpression.Type == typeof(uint))
            {
                divisor   = divisorExpression.GetConstantValue <uint>(containingExpression: moduloExpression);
                remainder = remainderExpression.GetConstantValue <uint>(containingExpression: expression);
            }
            else if (divisorExpression.Type == typeof(ulong) && remainderExpression.Type == typeof(ulong))
            {
                divisor   = (long)divisorExpression.GetConstantValue <ulong>(containingExpression: moduloExpression);
                remainder = (long)remainderExpression.GetConstantValue <ulong>(containingExpression: expression);
            }
            else
            {
                throw new ExpressionNotSupportedException(expression);
            }

            var moduloComparisonAst = AstFilter.Mod(field, divisor, remainder);

            switch (expression.NodeType)
            {
            case ExpressionType.Equal:
                return(moduloComparisonAst);

            case ExpressionType.NotEqual:
                return(AstFilter.Not(moduloComparisonAst));
            }

            throw new ExpressionNotSupportedException(expression);
        }