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