in core/src/main/java/org/apache/calcite/sql/pretty/SqlPrettyWriter.java [575:796]
protected FrameImpl createListFrame(
FrameType frameType,
@Nullable String keyword,
String open,
String close) {
final FrameTypeEnum frameTypeEnum =
frameType instanceof FrameTypeEnum ? (FrameTypeEnum) frameType
: FrameTypeEnum.OTHER;
final int indentation = config.indentation();
boolean newlineAfterOpen = false;
boolean newlineBeforeSep = false;
boolean newlineAfterSep = false;
boolean newlineBeforeClose = false;
int left = column();
int sepIndent = indentation;
int extraIndent = 0;
final SqlWriterConfig.LineFolding fold = fold(frameTypeEnum);
final boolean newline = fold == SqlWriterConfig.LineFolding.TALL;
switch (frameTypeEnum) {
case SELECT:
extraIndent = indentation;
newlineAfterOpen = false;
newlineBeforeSep = config.clauseStartsLine(); // newline before FROM, WHERE etc.
newlineAfterSep = false;
sepIndent = 0; // all clauses appear below SELECT
break;
case SETOP:
extraIndent = 0;
newlineAfterOpen = false;
newlineBeforeSep = config.clauseStartsLine(); // newline before UNION, EXCEPT
newlineAfterSep = config.clauseStartsLine(); // newline after UNION, EXCEPT
sepIndent = 0; // all clauses appear below SELECT
break;
case SELECT_LIST:
case FROM_LIST:
case JOIN:
case GROUP_BY_LIST:
case ORDER_BY_LIST:
case WINDOW_DECL_LIST:
case VALUES:
if (config.selectListExtraIndentFlag()) {
extraIndent = indentation;
}
left = frame == null ? 0 : frame.left;
newlineAfterOpen = config.clauseEndsLine()
&& (fold == SqlWriterConfig.LineFolding.TALL
|| fold == SqlWriterConfig.LineFolding.STEP);
newlineBeforeSep = false;
newlineAfterSep = newline;
if (config.leadingComma() && newline) {
newlineBeforeSep = true;
newlineAfterSep = false;
sepIndent = -", ".length();
}
break;
case WHERE_LIST:
case WINDOW:
extraIndent = indentation;
newlineAfterOpen = newline && config.clauseEndsLine();
newlineBeforeSep = newline;
sepIndent = 0;
newlineAfterSep = false;
break;
case ORDER_BY:
case OFFSET:
case FETCH:
newlineAfterOpen = false;
newlineBeforeSep = true;
sepIndent = 0;
newlineAfterSep = false;
break;
case UPDATE_SET_LIST:
extraIndent = indentation;
newlineAfterOpen = newline;
newlineBeforeSep = false;
sepIndent = 0;
newlineAfterSep = newline;
break;
case CASE:
newlineAfterOpen = newline;
newlineBeforeSep = newline;
newlineBeforeClose = newline;
sepIndent = 0;
break;
default:
break;
}
final int chopColumn;
SqlWriterConfig.LineFolding lineFolding = config.lineFolding();
if (lineFolding == null) {
lineFolding = SqlWriterConfig.LineFolding.WIDE;
chopColumn = -1;
} else {
if (config.foldLength() > 0
&& (lineFolding == SqlWriterConfig.LineFolding.CHOP
|| lineFolding == SqlWriterConfig.LineFolding.FOLD
|| lineFolding == SqlWriterConfig.LineFolding.STEP)) {
chopColumn = left + config.foldLength();
} else {
chopColumn = -1;
}
}
switch (frameTypeEnum) {
case UPDATE_SET_LIST:
case WINDOW_DECL_LIST:
case VALUES:
case SELECT:
case SETOP:
case SELECT_LIST:
case WHERE_LIST:
case ORDER_BY_LIST:
case GROUP_BY_LIST:
case WINDOW:
case ORDER_BY:
case OFFSET:
case FETCH:
return new FrameImpl(frameType, keyword, open, close,
left, extraIndent, chopColumn, lineFolding, newlineAfterOpen,
newlineBeforeSep, sepIndent, newlineAfterSep, false, false);
case SUB_QUERY:
switch (config.subQueryStyle()) {
case BLACK:
// Generate, e.g.:
//
// WHERE foo = bar IN
// ( SELECT ...
open = Spaces.padRight("(", indentation - 1);
return new FrameImpl(frameType, keyword, open, close,
left, 0, chopColumn, lineFolding, false, true, indentation,
false, false, false) {
protected void _before() {
newlineAndIndent();
}
};
case HYDE:
// Generate, e.g.:
//
// WHERE foo IN (
// SELECT ...
return new FrameImpl(frameType, keyword, open, close, left, 0,
chopColumn, lineFolding, false, true, 0, false, false, false) {
protected void _before() {
nextWhitespace = NL;
}
};
default:
throw Util.unexpected(config.subQueryStyle());
}
case FUN_CALL:
setNeedWhitespace(false);
return new FrameImpl(frameType, keyword, open, close,
left, indentation, chopColumn, lineFolding, false, false,
indentation, false, false, false);
case PARENTHESES:
open = "(";
close = ")";
// fall through
case IDENTIFIER:
case SIMPLE:
return new FrameImpl(frameType, keyword, open, close,
left, indentation, chopColumn, lineFolding, false, false,
indentation, false, false, false);
case FROM_LIST:
case JOIN:
newlineBeforeSep = newline;
sepIndent = 0; // all clauses appear below SELECT
newlineAfterSep = false;
final boolean newlineBeforeComma = config.leadingComma() && newline;
final boolean newlineAfterComma = !config.leadingComma() && newline;
return new FrameImpl(frameType, keyword, open, close, left,
indentation, chopColumn, lineFolding, newlineAfterOpen,
newlineBeforeSep, sepIndent, newlineAfterSep, false, false) {
@Override protected void sep(boolean printFirst, String sep) {
final boolean newlineBeforeSep;
final boolean newlineAfterSep;
if (sep.equals(",")) {
newlineBeforeSep = newlineBeforeComma;
newlineAfterSep = newlineAfterComma;
} else {
newlineBeforeSep = this.newlineBeforeSep;
newlineAfterSep = this.newlineAfterSep;
}
if (itemCount == 0) {
if (newlineAfterOpen) {
newlineAndIndent(currentIndent);
}
} else {
if (newlineBeforeSep) {
newlineAndIndent(currentIndent + sepIndent);
}
}
if ((itemCount > 0) || printFirst) {
keyword(sep);
nextWhitespace = newlineAfterSep ? NL : " ";
}
++itemCount;
}
};
default:
case OTHER:
return new FrameImpl(frameType, keyword, open, close, left, indentation,
chopColumn, lineFolding, newlineAfterOpen, newlineBeforeSep,
sepIndent, newlineAfterSep, newlineBeforeClose, false);
}
}