Fix diagnostic and terminal group imports
This commit is contained in:
1
gradle.properties
Normal file
1
gradle.properties
Normal file
@ -0,0 +1 @@
|
||||
org.gradle.java.home=C:/Program Files/OpenLogic/jdk-8.0.482.08-hotspot
|
||||
@ -251,18 +251,25 @@ public class TerminalGroupImporterServiceBean implements TerminalGroupImporterSe
|
||||
logger.info("Terminal group optimized import stale stage cleanup finished. importId={}, elapsed={} ms",
|
||||
importId, System.currentTimeMillis() - cleanupStartTime);
|
||||
|
||||
boolean hasSnLowerNormColumn = hasColumn(connection, "tms_terminal_group_import_stage", "sn_lower_norm");
|
||||
if (!hasSnLowerNormColumn) {
|
||||
logger.warn("Terminal group import stage table does not have SN_LOWER_NORM column. " +
|
||||
"Falling back to lower-case expression matching. importId={}", importId);
|
||||
}
|
||||
|
||||
long insertStartTime = System.currentTimeMillis();
|
||||
insertImportStageRows(connection, importId, parsedTerminals, wrappersByRowNo);
|
||||
insertImportStageRows(connection, importId, parsedTerminals, wrappersByRowNo, hasSnLowerNormColumn);
|
||||
logger.info("Terminal group optimized import stage insert finished. importId={}, rows={}, elapsed={} ms",
|
||||
importId, parsedTerminals.size(), System.currentTimeMillis() - insertStartTime);
|
||||
|
||||
long queryStartTime = System.currentTimeMillis();
|
||||
queryImportStageMatches(connection, importId, wrappersByRowNo, wrappersByTerminalId);
|
||||
queryImportStageMatches(connection, importId, wrappersByRowNo, wrappersByTerminalId, hasSnLowerNormColumn);
|
||||
logger.info("Terminal group optimized import match query finished. importId={}, matchedTerminalIds={}, elapsed={} ms",
|
||||
importId, wrappersByTerminalId.size(), System.currentTimeMillis() - queryStartTime);
|
||||
connection.commit();
|
||||
} catch (SQLException e) {
|
||||
rollbackQuietly(connection);
|
||||
logSqlExceptionChain(e);
|
||||
throw new RuntimeException("Error matching terminal group import data using import staging table", e);
|
||||
} finally {
|
||||
cleanupImportStageRows(connection, importId);
|
||||
@ -286,9 +293,13 @@ public class TerminalGroupImporterServiceBean implements TerminalGroupImporterSe
|
||||
private void insertImportStageRows(Connection connection,
|
||||
UUID importId,
|
||||
List<TerminalGroupImportObjectWrapper> parsedTerminals,
|
||||
Map<Integer, TerminalGroupImportObjectWrapper> wrappersByRowNo) throws SQLException {
|
||||
String sql = "insert into tms_terminal_group_import_stage " +
|
||||
"(import_id, row_no, tid, sn, tid_norm, sn_norm, sn_lower_norm) values (?, ?, ?, ?, ?, ?, ?)";
|
||||
Map<Integer, TerminalGroupImportObjectWrapper> wrappersByRowNo,
|
||||
boolean hasSnLowerNormColumn) throws SQLException {
|
||||
String sql = hasSnLowerNormColumn
|
||||
? "insert into tms_terminal_group_import_stage " +
|
||||
"(import_id, row_no, tid, sn, tid_norm, sn_norm, sn_lower_norm) values (?, ?, ?, ?, ?, ?, ?)"
|
||||
: "insert into tms_terminal_group_import_stage " +
|
||||
"(import_id, row_no, tid, sn, tid_norm, sn_norm) values (?, ?, ?, ?, ?, ?)";
|
||||
try (PreparedStatement statement = connection.prepareStatement(sql)) {
|
||||
int rowNo = 0;
|
||||
for (TerminalGroupImportObjectWrapper wrapper : parsedTerminals) {
|
||||
@ -301,7 +312,9 @@ public class TerminalGroupImporterServiceBean implements TerminalGroupImporterSe
|
||||
statement.setString(4, wrapper.getSn());
|
||||
statement.setString(5, normalizeImportValue(wrapper.getTid()));
|
||||
statement.setString(6, normalizeImportValue(wrapper.getSn()));
|
||||
if (hasSnLowerNormColumn) {
|
||||
statement.setString(7, normalizeImportValueLower(wrapper.getSn()));
|
||||
}
|
||||
statement.addBatch();
|
||||
|
||||
if (rowNo % 1000 == 0) {
|
||||
@ -315,10 +328,14 @@ public class TerminalGroupImporterServiceBean implements TerminalGroupImporterSe
|
||||
private void queryImportStageMatches(Connection connection,
|
||||
UUID importId,
|
||||
Map<Integer, TerminalGroupImportObjectWrapper> wrappersByRowNo,
|
||||
Map<UUID, List<TerminalGroupImportObjectWrapper>> wrappersByTerminalId) throws SQLException {
|
||||
Map<UUID, List<TerminalGroupImportObjectWrapper>> wrappersByTerminalId,
|
||||
boolean hasSnLowerNormColumn) throws SQLException {
|
||||
String snJoinCondition = hasSnLowerNormColumn
|
||||
? "t.sn in (i.sn, i.sn_norm, i.sn_lower_norm)"
|
||||
: "t.sn in (i.sn, i.sn_norm, lower(i.sn_norm))";
|
||||
String sql = "select i.row_no, t.id, te.terminal_id " +
|
||||
"from tms_terminal_group_import_stage i " +
|
||||
"left join tms_terminal t on t.sn in (i.sn, i.sn_norm, i.sn_lower_norm) and t.delete_ts is null " +
|
||||
"left join tms_terminal t on " + snJoinCondition + " and t.delete_ts is null " +
|
||||
"left join tms_terminal_link tl on tl.terminal_id = t.id " +
|
||||
"left join tmsext_terminal_ext te on te.id = tl.terminal_ext_id and te.delete_ts is null " +
|
||||
"where i.import_id = ? " +
|
||||
@ -351,6 +368,18 @@ public class TerminalGroupImporterServiceBean implements TerminalGroupImporterSe
|
||||
}
|
||||
}
|
||||
|
||||
private boolean hasColumn(Connection connection, String tableName, String columnName) throws SQLException {
|
||||
String sql = "select 1 from information_schema.columns " +
|
||||
"where table_schema = current_schema() and lower(table_name) = ? and lower(column_name) = ?";
|
||||
try (PreparedStatement statement = connection.prepareStatement(sql)) {
|
||||
statement.setString(1, tableName.toLowerCase());
|
||||
statement.setString(2, columnName.toLowerCase());
|
||||
try (ResultSet resultSet = statement.executeQuery()) {
|
||||
return resultSet.next();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void cleanupImportStageRows(Connection connection, UUID importId) {
|
||||
if (connection == null || importId == null) {
|
||||
return;
|
||||
@ -431,6 +460,20 @@ public class TerminalGroupImporterServiceBean implements TerminalGroupImporterSe
|
||||
}
|
||||
}
|
||||
|
||||
private void logSqlExceptionChain(SQLException exception) {
|
||||
SQLException nextException = exception;
|
||||
int exceptionIndex = 0;
|
||||
while (nextException != null) {
|
||||
logger.error("Terminal group import SQL exception [{}]. SQLState={}, ErrorCode={}, Message={}",
|
||||
exceptionIndex,
|
||||
nextException.getSQLState(),
|
||||
nextException.getErrorCode(),
|
||||
nextException.getMessage());
|
||||
nextException = nextException.getNextException();
|
||||
exceptionIndex++;
|
||||
}
|
||||
}
|
||||
|
||||
private Boolean eofByColumnNullValueTerminal(Row row, String columnAlias) throws ImportFileEofEvaluationException {
|
||||
Integer columnNumber = terminalAttributesToColumns.get(columnAlias);
|
||||
if (row != null) {
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
package com.cmobile.unifiedtms.web.screens.terminallastdiagnosticinfo;
|
||||
|
||||
import com.cmobile.unifiedtms.entity.ApplicationSimple;
|
||||
import com.cmobile.unifiedtms.entity.DownloadTask;
|
||||
import com.haulmont.cuba.gui.model.CollectionLoader;
|
||||
import com.haulmont.cuba.gui.model.InstanceContainer;
|
||||
import com.haulmont.cuba.gui.screen.*;
|
||||
@ -15,8 +14,6 @@ import javax.inject.Inject;
|
||||
@EditedEntityContainer("terminalLastDiagnosticInfoDc")
|
||||
@LoadDataBeforeShow
|
||||
public class TerminalLastDiagnosticInfoEdit extends StandardEditor<TerminalLastDiagnosticInfo> {
|
||||
@Inject
|
||||
private InstanceContainer<TerminalLastDiagnosticInfo> terminalLastDiagnosticInfoDc;
|
||||
@Inject
|
||||
private CollectionLoader<ApplicationSimple> applicationSimplesDl;
|
||||
@Inject
|
||||
@ -24,6 +21,7 @@ public class TerminalLastDiagnosticInfoEdit extends StandardEditor<TerminalLastD
|
||||
|
||||
@Subscribe
|
||||
public void onInit(InitEvent event) {
|
||||
applicationSimplesDl.setParameter("diagnosticInfoId", null);
|
||||
applicationSimplesDl.addPostLoadListener(applicationSimplePostLoadEvent -> {
|
||||
logger.info(">>> App Simple Loader Loaded!! : {}", applicationSimplePostLoadEvent.getLoadedEntities().size());
|
||||
applicationSimplePostLoadEvent.getLoadedEntities().forEach(applicationSimple -> {
|
||||
@ -35,7 +33,7 @@ public class TerminalLastDiagnosticInfoEdit extends StandardEditor<TerminalLastD
|
||||
@Subscribe(id = "terminalLastDiagnosticInfoDc", target = Target.DATA_CONTAINER)
|
||||
public void onTerminalLastDiagnosticInfoDcItemChange(InstanceContainer.ItemChangeEvent<TerminalLastDiagnosticInfo> event) {
|
||||
TerminalLastDiagnosticInfo info = event.getItem();
|
||||
logger.info(">>> Last Diagnostic Info Id: {}", info,getId());
|
||||
logger.info(">>> Last Diagnostic Info Id: {}", info != null ? info.getId() : null);
|
||||
if(info != null) {
|
||||
logger.info(">>> NOT NULL");
|
||||
applicationSimplesDl.setParameter("diagnosticInfoId", info.getId());
|
||||
|
||||
Reference in New Issue
Block a user