@Override protected Type visitSimpleCaseExpression(SimpleCaseExpression node, AnalysisContext context) { for (WhenClause whenClause : node.getWhenClauses()) { coerceToSingleType( context, node, "CASE operand type does not match WHEN clause operand type: %s vs %s", node.getOperand(), whenClause.getOperand()); } Type type = coerceToSingleType( context, "All CASE results must be the same type: %s", getCaseResultExpressions(node.getWhenClauses(), node.getDefaultValue())); expressionTypes.put(node, type); for (WhenClause whenClause : node.getWhenClauses()) { Type whenClauseType = process(whenClause.getResult(), context); requireNonNull( whenClauseType, format("Expression types does not contain an entry for %s", whenClause)); expressionTypes.put(whenClause, whenClauseType); } return type; }
@Override protected String visitSimpleCaseExpression(SimpleCaseExpression node, Boolean unmangleNames) { ImmutableList.Builder<String> parts = ImmutableList.builder(); parts.add("CASE").add(process(node.getOperand(), unmangleNames)); for (WhenClause whenClause : node.getWhenClauses()) { parts.add(process(whenClause, unmangleNames)); } node.getDefaultValue() .ifPresent((value) -> parts.add("ELSE").add(process(value, unmangleNames))); parts.add("END"); return "(" + Joiner.on(' ').join(parts.build()) + ")"; }