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)); }
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())); }