private StringBuilder generateSelectSql()

in src/main/java/com/epam/digital/data/platform/liquibase/extension/sqlgenerator/core/DdmCreateAbstractViewGenerator.java [175:277]


    private StringBuilder generateSelectSql(List<DdmTableConfig> tables, List<DdmJoinConfig> joins, List<DdmConditionConfig> conditions) {
        StringBuilder buffer = new StringBuilder();
        List<String> viewResultColumns = new ArrayList<>();
        List<String> orderColumns = new ArrayList<>();
        List<String> groupColumns = new ArrayList<>();
        boolean hasNonWindowFunctions = false;

        buffer.append("SELECT ");

        for (DdmTableConfig table : tables) {
            String tableAlias = table.hasAlias() ? table.getAlias() + "." : "";
            processTableColumns(table.getColumns(), viewResultColumns, orderColumns, groupColumns, tableAlias);
            if (Objects.nonNull(table.getTableLogicOperator())) {
                processNestedColumnsFromLogicOperators(table.getTableLogicOperator().getLogicOperators(), viewResultColumns,
                        orderColumns, groupColumns, tableAlias);
            }

            for (DdmFunctionConfig function : table.getFunctions()) {
                hasNonWindowFunctions = function.getWindow() == null;
                StringBuilder functionContent = new StringBuilder();
                functionContent.append(function.getName().toUpperCase()).append("(");
                if (!function.getName().equalsIgnoreCase(DdmConstants.ATTRIBUTE_FUNCTION_ROW_NUMBER)) {
                    functionContent
                        .append(function.hasTableAlias() ? function.getTableAlias() + "." : "")
                        .append(function.getColumnName())
                        .append(function.hasParameter() ? ", " + function.getParameter() : "");
                }
                functionContent.append(") ");
                if (function.getWindow() != null) {
                    functionContent.append("OVER (");
                    if (!function.getWindow().isEmpty()) {
                        functionContent.append(function.getWindow());
                    }
                    functionContent.append(") ");
                }
                viewResultColumns.add(functionContent + "AS " + function.getAlias());

                groupColumns.remove((function.hasTableAlias() ? function.getTableAlias() + "." : "") +
                        function.getColumnName());

                viewResultColumns.remove((function.hasTableAlias() ? function.getTableAlias() + "." : "") +
                        function.getColumnName());
            }
        }

        buffer.append(String.join(", ", viewResultColumns));

        DdmTableConfig firstTable = tables.get(0);
        buffer.append(" FROM ");
        buffer.append(firstTable.getName());

        if (firstTable.hasAlias()) {
            buffer.append(" AS ");
            buffer.append(firstTable.getAlias());
        }

        firstTable.setUsedInSQLClause(true);

        for (DdmJoinConfig join : joins) {
            buffer.append(" ");
            buffer.append(join.getType().toUpperCase());
            buffer.append(" JOIN ");
            buffer.append(getUnusedTable(tables, join.getLeftAlias(), join.getRightAlias()));
            buffer.append(" ON ");

            ListIterator<String> columnIterator = join.getLeftColumns().listIterator();
            while (columnIterator.hasNext()) {
                String column = columnIterator.next();
                buffer.append("(");
                buffer.append(join.getLeftAlias());
                buffer.append(".");
                buffer.append(column);
                buffer.append(" = ");
                buffer.append(join.getRightAlias());
                buffer.append(".");
                buffer.append(join.getRightColumns().get(columnIterator.previousIndex()));
                buffer.append(")");

                if (columnIterator.hasNext()) {
                    buffer.append(" AND ");
                }
            }

            buffer.append(generateConditionSql(join.getConditions(), false));
        }

        if (conditions != null && !conditions.isEmpty()) {
            buffer.append(" WHERE ");
            buffer.append(generateConditionSql(conditions, false));
        }

        if (!groupColumns.isEmpty() && hasNonWindowFunctions) {
            buffer.append(" GROUP BY ");
            buffer.append(String.join(", ", groupColumns));
        }

        if (!orderColumns.isEmpty()) {
            buffer.append(" ORDER BY ");
            buffer.append(String.join(", ", orderColumns));
        }

        return buffer;
    }