package com.megatim.fdxcommons.tools.database.queries; import com.megatim.fdxcommons.tools.database.queries.metadata.QueryCriterion; import com.megatim.fdxcommons.tools.database.contrat.DefaultPreparedStatementProcessor; import com.megatim.fdxcommons.tools.database.tables.FdxTableRow; import com.megatim.fdxcommons.tools.database.contrat.QueryMetaData; import com.megatim.fdxcommons.tools.database.queries.metadata.SelectQueryResult; import com.megatim.fdxcommons.tools.database.queries.metadata.WhereQueryParameters; import com.megatim.fdxcommons.tools.database.tables.appcolumns.FdxApiColumnDefinitions; import com.megatim.fdxcommons.tools.database.tables.FdxTableColumnData; import com.megatim.fdxcommons.tools.database.tables.appcolumns.FdxConsultationColumnDefinitions; import com.megatim.fdxcommons.tools.database.tables.appcolumns.IndexColumnDefinition; import com.megatim.fdxcommons.tools.database.tables.appcolumns.TokenColumnDefinition; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import javax.naming.NamingException; /** * * @author Gabuntu */ public class SelectQuery implements QueryMetaData { private final String tableName; private final Connection connection; private final QueryCriterion queryCriterion; private final List selectColumns; private final int limit; private final boolean withCustomColumns; private final int offset; public SelectQuery(String tableName, Connection connection, QueryCriterion queryCriterion, List selectColumns, boolean withCustomColumns) { this(tableName, connection, queryCriterion, selectColumns, -1, -1, withCustomColumns); } public SelectQuery(String tableName, Connection connection, QueryCriterion queryCriterion, List selectColumns, int limit, int offset, boolean withCustomColumns) { this.tableName = tableName; this.connection = connection; this.queryCriterion = queryCriterion; this.selectColumns = selectColumns; this.limit = limit; this.offset = offset; this.withCustomColumns = withCustomColumns; } @Override public SelectQueryResult execute() throws Exception { return result(); } private SelectQueryResult result() throws NamingException, SQLException { String query = selectQuery(); System.out.println("------------------------------------------"); System.out.println(query); System.out.println("------------------------------------------------"); try ( PreparedStatement statement = connection.prepareStatement(query)) { new DefaultPreparedStatementProcessor().process(statement, new WhereQueryParameters(queryCriterion).parameters()); long rowCount = 1; ResultSet resultSet = statement.executeQuery(); ResultSetMetaData metaData = resultSet.getMetaData(); int columnCount = metaData.getColumnCount(); List rows = new ArrayList<>(); int lastIndexRead = 0; FdxApiColumnDefinitions apiColumnDefinitions = new FdxApiColumnDefinitions(); FdxConsultationColumnDefinitions fdxConsColumnDefinitions = new FdxConsultationColumnDefinitions(); final String tokenColumn = new TokenColumnDefinition().name(); while (resultSet.next()) { List data = new ArrayList<>(); for (int i = 1; i <= columnCount; i++) { String name = metaData.getColumnName(i).trim(); Object value = resultSet.getObject(i); // int sqlDataType = metaData.getColumnType(i); if (!name.equals(tokenColumn)) { if (withCustomColumns) { data.add(new FdxTableColumnData(value, name, i)); } else { if (!apiColumnDefinitions.isAppColumnDefinition(name) && !fdxConsColumnDefinitions.isAppColumnDefinition(name)) { data.add(new FdxTableColumnData(value, name, i)); } } if (apiColumnDefinitions.isIndexColumn(name)) { int currentIndex = Integer.parseInt(value.toString()); if (currentIndex > lastIndexRead) { lastIndexRead = currentIndex; } } } } rows.add(new FdxTableRow(rowCount++, data)); } return new SelectQueryResult(lastIndexRead, rows); } } private String selectQuery() { StringBuilder query = new StringBuilder("SELECT "); if (selectColumns.isEmpty()) { query.append(" * "); } else { selectColumns.forEach(c -> query.append(c.toLowerCase()).append(",")); query.replace(query.length() - 1, query.length(), ""); //retirer la sernière virgule } query .append(" FROM ") .append(tableName); query.append(new WhereQueryString(queryCriterion).query()); query.append(" ORDER BY ").append(new IndexColumnDefinition().name()); if (limit > 0 && offset >= 0) { query .append(" LIMIT ") .append(limit) .append(" OFFSET ") .append(offset); } return query.toString(); } }