protected FrameImpl createListFrame()

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