public AstTernaryExpression(AstTernaryOperator @operator, AstExpression arg1, AstExpression arg2, AstExpression arg3)
 {
     _operator = @operator;
     _arg1     = Ensure.IsNotNull(arg1, nameof(arg1));
     _arg2     = Ensure.IsNotNull(arg2, nameof(arg2));
     _arg3     = Ensure.IsNotNull(arg3, nameof(arg3));
 }
Exemple #2
0
 public static string Render(this AstTernaryOperator @operator)
 {
     return(@operator switch
     {
         AstTernaryOperator.Substr => "$substr",
         AstTernaryOperator.SubstrBytes => "$substrBytes",
         AstTernaryOperator.SubstrCP => "$substrCP",
         _ => throw new InvalidOperationException($"Unexpected ternary operator: {@operator}.")
     });
        private static AggregationExpression TranslateHelper(TranslationContext context, Expression expression, Expression stringExpression, Expression startIndexExpression, Expression lengthExpression, AstTernaryOperator substrOperator)
        {
            var stringTranslation     = ExpressionToAggregationExpressionTranslator.Translate(context, stringExpression);
            var startIndexTranslation = ExpressionToAggregationExpressionTranslator.Translate(context, startIndexExpression);

            AstExpression ast;

            if (lengthExpression == null)
            {
                var strlenOperator = substrOperator == AstTernaryOperator.SubstrCP ? AstUnaryOperator.StrLenCP : AstUnaryOperator.StrLenBytes;
                var(stringVar, stringAst) = AstExpression.UseVarIfNotSimple("string", stringTranslation.Ast);
                var(indexVar, indexAst)   = AstExpression.UseVarIfNotSimple("index", startIndexTranslation.Ast);
                var lengthAst = AstExpression.StrLen(strlenOperator, stringAst);
                var countAst  = AstExpression.Subtract(lengthAst, indexAst);
                var inAst     = AstExpression.Substr(substrOperator, stringAst, indexAst, countAst);
                ast = AstExpression.Let(stringVar, indexVar, inAst);
            }
            else
            {
                var lengthTranslation = ExpressionToAggregationExpressionTranslator.Translate(context, lengthExpression);
                ast = AstExpression.Substr(substrOperator, stringTranslation.Ast, startIndexTranslation.Ast, lengthTranslation.Ast);
            }

            return(new AggregationExpression(expression, ast, new StringSerializer()));
        }