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<SelectQueryResult> {
|
|
private final String tableName;
|
private final Connection connection;
|
private final QueryCriterion queryCriterion;
|
private final List<String> selectColumns;
|
private final int limit;
|
private final boolean withCustomColumns;
|
private final int offset;
|
|
public SelectQuery(String tableName, Connection connection, QueryCriterion queryCriterion, List<String> selectColumns, boolean withCustomColumns) {
|
this(tableName, connection, queryCriterion, selectColumns, -1, -1, withCustomColumns);
|
}
|
|
public SelectQuery(String tableName, Connection connection, QueryCriterion queryCriterion, List<String> 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<FdxTableRow> rows = new ArrayList<>();
|
|
int lastIndexRead = 0;
|
|
FdxApiColumnDefinitions apiColumnDefinitions = new FdxApiColumnDefinitions();
|
FdxConsultationColumnDefinitions fdxConsColumnDefinitions = new FdxConsultationColumnDefinitions();
|
final String tokenColumn = new TokenColumnDefinition().name();
|
|
while (resultSet.next()) {
|
|
List<FdxTableColumnData> 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();
|
}
|
}
|