/*
|
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
|
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
|
*/
|
package com.megatim.fdxcommons.tools.database.contrat;
|
|
import com.megatim.fdxcommons.model.integration.ColumnDefinition;
|
import com.megatim.fdxcommons.model.pojo.JsonTableDefinition;
|
import com.megatim.fdxcommons.tools.database.tables.appcolumns.IndexColumnDefinition;
|
import com.megatim.fdxcommons.tools.database.tables.appcolumns.ParentIdColumnDefinition;
|
import java.sql.ResultSet;
|
import java.sql.ResultSetMetaData;
|
import java.sql.SQLException;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
|
/**
|
*
|
* @author ASUS
|
*/
|
public class JsonResultSetProcessor {
|
|
private final ResultSet resultSet;
|
private final JsonTableDefinition tableDefinition;
|
|
public JsonResultSetProcessor(ResultSet resultSet, JsonTableDefinition tableDefinition) {
|
this.resultSet = resultSet;
|
this.tableDefinition = tableDefinition;
|
}
|
|
public Map<Long, Object> process() throws SQLException {
|
Map<Long, Object> data = new HashMap<>();
|
|
while (resultSet.next()) {
|
mergeData(resultSet, tableDefinition, data, null);
|
}
|
return data;
|
}
|
|
/**
|
*
|
* @param resSet : ligne de données à traiter
|
* @param tableDefinition : structure de la donnée à extraire
|
* @param data : données ayant été extraites lors des précédents parcours
|
* @param parentId : L'id du parent de la donnée
|
* @return : retourne les données extraites
|
* @throws SQLException
|
*/
|
private Object mergeData(ResultSet resSet, JsonTableDefinition tableDefinition, Map<Long, Object> data, Long parentId) throws SQLException {
|
Map<String, String> columnsAliasToColumnName = columnsAliasToColumnName(tableDefinition.getColumnDefs(), tableDefinition.getTableName());
|
String indexAlias = columnAlias(tableDefinition.getTableName(), new IndexColumnDefinition().name());
|
final Long fdxIndex = resSet.getLong(indexAlias);
|
|
String parentIdAlias = null;
|
Long childParentId = null;
|
|
if (parentId != null) {
|
parentIdAlias = columnAlias(tableDefinition.getTableName(), new ParentIdColumnDefinition().name());
|
childParentId = resSet.getLong(parentIdAlias);
|
}
|
|
if (parentId == null || parentId.equals(childParentId)) {
|
if (data.containsKey(fdxIndex)) {
|
Object obj = data.get(fdxIndex);
|
Map map = (Map) obj;
|
|
for (JsonTableDefinition t : tableDefinition.getTablesDefinition()) {
|
Object ob = (Map) map.get(t.getParentFieldName());
|
Map<Long, Object> m = new HashMap<>();
|
|
if (ob != null) {
|
m = (Map) ob;
|
}
|
map.put(t.getParentFieldName(), mergeData(resSet, t, m, fdxIndex));
|
data.put(fdxIndex, map);
|
}
|
|
} else {
|
Map<String, Object> simpleData = simpleData = retrieveData(resSet, columnsAliasToColumnName);
|
data.put(fdxIndex, simpleData);
|
|
for (JsonTableDefinition t : tableDefinition.getTablesDefinition()) {
|
String newParentIdAlias = columnAlias(t.getTableName(), new ParentIdColumnDefinition().name());
|
Long newChildParentId = resSet.getLong(newParentIdAlias);
|
|
if (newChildParentId.equals(fdxIndex)) {
|
Map<Long, Object> m = new HashMap<>();
|
mergeData(resSet, t, m, fdxIndex);
|
simpleData.put(t.getParentFieldName(), m);
|
}
|
}
|
|
return data;
|
}
|
}
|
return data;
|
}
|
|
|
/**
|
* Extraction des données simples d'un objet
|
*
|
* @param resultSet
|
* @param columnsAliasToColumnName
|
* @return
|
* @throws SQLException
|
*/
|
private Map<String, Object> retrieveData(ResultSet resultSet, Map<String, String> columnsAliasToColumnName) throws SQLException {
|
ResultSetMetaData metaData = resultSet.getMetaData();
|
int columnCount = metaData.getColumnCount();
|
Map<String, Object> selectResult = new HashMap<>();
|
|
for (int i = 1; i <= columnCount; i++) {
|
if (columnsAliasToColumnName.containsKey(metaData.getColumnName(i).trim().toLowerCase())) {
|
selectResult.put(columnsAliasToColumnName.get(metaData.getColumnName(i).trim().toLowerCase()), resultSet.getObject(i));
|
}
|
}
|
return selectResult;
|
}
|
|
/**
|
* Méthode qui associe chaque alias de colonne au nom réel de colonne
|
*
|
* @param columnsDef
|
* @param tableName : table
|
* @return
|
*/
|
private Map<String, String> columnsAliasToColumnName(List<ColumnDefinition> columnsDef, String tableName) {
|
Map<String, String> columnsAliasToColumnName = new HashMap<>();
|
|
columnsDef.stream().forEach(c -> {
|
columnsAliasToColumnName.put(columnAlias(tableName, c.getName()), c.getName());
|
});
|
columnsAliasToColumnName.put(columnAlias(tableName, new IndexColumnDefinition().name()), new IndexColumnDefinition().name());
|
columnsAliasToColumnName.put(columnAlias(tableName, new ParentIdColumnDefinition().name()), new ParentIdColumnDefinition().name());
|
return columnsAliasToColumnName;
|
}
|
|
private String columnAlias(String tableName, String columnName) {
|
return (tableName + "_" + columnName).toLowerCase();
|
}
|
}
|