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",
|
logger.info("Terminal group optimized import stale stage cleanup finished. importId={}, elapsed={} ms",
|
||||||
importId, System.currentTimeMillis() - cleanupStartTime);
|
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();
|
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",
|
logger.info("Terminal group optimized import stage insert finished. importId={}, rows={}, elapsed={} ms",
|
||||||
importId, parsedTerminals.size(), System.currentTimeMillis() - insertStartTime);
|
importId, parsedTerminals.size(), System.currentTimeMillis() - insertStartTime);
|
||||||
|
|
||||||
long queryStartTime = System.currentTimeMillis();
|
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",
|
logger.info("Terminal group optimized import match query finished. importId={}, matchedTerminalIds={}, elapsed={} ms",
|
||||||
importId, wrappersByTerminalId.size(), System.currentTimeMillis() - queryStartTime);
|
importId, wrappersByTerminalId.size(), System.currentTimeMillis() - queryStartTime);
|
||||||
connection.commit();
|
connection.commit();
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
rollbackQuietly(connection);
|
rollbackQuietly(connection);
|
||||||
|
logSqlExceptionChain(e);
|
||||||
throw new RuntimeException("Error matching terminal group import data using import staging table", e);
|
throw new RuntimeException("Error matching terminal group import data using import staging table", e);
|
||||||
} finally {
|
} finally {
|
||||||
cleanupImportStageRows(connection, importId);
|
cleanupImportStageRows(connection, importId);
|
||||||
@ -286,9 +293,13 @@ public class TerminalGroupImporterServiceBean implements TerminalGroupImporterSe
|
|||||||
private void insertImportStageRows(Connection connection,
|
private void insertImportStageRows(Connection connection,
|
||||||
UUID importId,
|
UUID importId,
|
||||||
List<TerminalGroupImportObjectWrapper> parsedTerminals,
|
List<TerminalGroupImportObjectWrapper> parsedTerminals,
|
||||||
Map<Integer, TerminalGroupImportObjectWrapper> wrappersByRowNo) throws SQLException {
|
Map<Integer, TerminalGroupImportObjectWrapper> wrappersByRowNo,
|
||||||
String sql = "insert into tms_terminal_group_import_stage " +
|
boolean hasSnLowerNormColumn) throws SQLException {
|
||||||
"(import_id, row_no, tid, sn, tid_norm, sn_norm, sn_lower_norm) values (?, ?, ?, ?, ?, ?, ?)";
|
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)) {
|
try (PreparedStatement statement = connection.prepareStatement(sql)) {
|
||||||
int rowNo = 0;
|
int rowNo = 0;
|
||||||
for (TerminalGroupImportObjectWrapper wrapper : parsedTerminals) {
|
for (TerminalGroupImportObjectWrapper wrapper : parsedTerminals) {
|
||||||
@ -301,7 +312,9 @@ public class TerminalGroupImporterServiceBean implements TerminalGroupImporterSe
|
|||||||
statement.setString(4, wrapper.getSn());
|
statement.setString(4, wrapper.getSn());
|
||||||
statement.setString(5, normalizeImportValue(wrapper.getTid()));
|
statement.setString(5, normalizeImportValue(wrapper.getTid()));
|
||||||
statement.setString(6, normalizeImportValue(wrapper.getSn()));
|
statement.setString(6, normalizeImportValue(wrapper.getSn()));
|
||||||
statement.setString(7, normalizeImportValueLower(wrapper.getSn()));
|
if (hasSnLowerNormColumn) {
|
||||||
|
statement.setString(7, normalizeImportValueLower(wrapper.getSn()));
|
||||||
|
}
|
||||||
statement.addBatch();
|
statement.addBatch();
|
||||||
|
|
||||||
if (rowNo % 1000 == 0) {
|
if (rowNo % 1000 == 0) {
|
||||||
@ -315,10 +328,14 @@ public class TerminalGroupImporterServiceBean implements TerminalGroupImporterSe
|
|||||||
private void queryImportStageMatches(Connection connection,
|
private void queryImportStageMatches(Connection connection,
|
||||||
UUID importId,
|
UUID importId,
|
||||||
Map<Integer, TerminalGroupImportObjectWrapper> wrappersByRowNo,
|
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 " +
|
String sql = "select i.row_no, t.id, te.terminal_id " +
|
||||||
"from tms_terminal_group_import_stage i " +
|
"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 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 " +
|
"left join tmsext_terminal_ext te on te.id = tl.terminal_ext_id and te.delete_ts is null " +
|
||||||
"where i.import_id = ? " +
|
"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) {
|
private void cleanupImportStageRows(Connection connection, UUID importId) {
|
||||||
if (connection == null || importId == null) {
|
if (connection == null || importId == null) {
|
||||||
return;
|
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 {
|
private Boolean eofByColumnNullValueTerminal(Row row, String columnAlias) throws ImportFileEofEvaluationException {
|
||||||
Integer columnNumber = terminalAttributesToColumns.get(columnAlias);
|
Integer columnNumber = terminalAttributesToColumns.get(columnAlias);
|
||||||
if (row != null) {
|
if (row != null) {
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
package com.cmobile.unifiedtms.web.screens.terminallastdiagnosticinfo;
|
package com.cmobile.unifiedtms.web.screens.terminallastdiagnosticinfo;
|
||||||
|
|
||||||
import com.cmobile.unifiedtms.entity.ApplicationSimple;
|
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.CollectionLoader;
|
||||||
import com.haulmont.cuba.gui.model.InstanceContainer;
|
import com.haulmont.cuba.gui.model.InstanceContainer;
|
||||||
import com.haulmont.cuba.gui.screen.*;
|
import com.haulmont.cuba.gui.screen.*;
|
||||||
@ -15,8 +14,6 @@ import javax.inject.Inject;
|
|||||||
@EditedEntityContainer("terminalLastDiagnosticInfoDc")
|
@EditedEntityContainer("terminalLastDiagnosticInfoDc")
|
||||||
@LoadDataBeforeShow
|
@LoadDataBeforeShow
|
||||||
public class TerminalLastDiagnosticInfoEdit extends StandardEditor<TerminalLastDiagnosticInfo> {
|
public class TerminalLastDiagnosticInfoEdit extends StandardEditor<TerminalLastDiagnosticInfo> {
|
||||||
@Inject
|
|
||||||
private InstanceContainer<TerminalLastDiagnosticInfo> terminalLastDiagnosticInfoDc;
|
|
||||||
@Inject
|
@Inject
|
||||||
private CollectionLoader<ApplicationSimple> applicationSimplesDl;
|
private CollectionLoader<ApplicationSimple> applicationSimplesDl;
|
||||||
@Inject
|
@Inject
|
||||||
@ -24,6 +21,7 @@ public class TerminalLastDiagnosticInfoEdit extends StandardEditor<TerminalLastD
|
|||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
public void onInit(InitEvent event) {
|
public void onInit(InitEvent event) {
|
||||||
|
applicationSimplesDl.setParameter("diagnosticInfoId", null);
|
||||||
applicationSimplesDl.addPostLoadListener(applicationSimplePostLoadEvent -> {
|
applicationSimplesDl.addPostLoadListener(applicationSimplePostLoadEvent -> {
|
||||||
logger.info(">>> App Simple Loader Loaded!! : {}", applicationSimplePostLoadEvent.getLoadedEntities().size());
|
logger.info(">>> App Simple Loader Loaded!! : {}", applicationSimplePostLoadEvent.getLoadedEntities().size());
|
||||||
applicationSimplePostLoadEvent.getLoadedEntities().forEach(applicationSimple -> {
|
applicationSimplePostLoadEvent.getLoadedEntities().forEach(applicationSimple -> {
|
||||||
@ -35,7 +33,7 @@ public class TerminalLastDiagnosticInfoEdit extends StandardEditor<TerminalLastD
|
|||||||
@Subscribe(id = "terminalLastDiagnosticInfoDc", target = Target.DATA_CONTAINER)
|
@Subscribe(id = "terminalLastDiagnosticInfoDc", target = Target.DATA_CONTAINER)
|
||||||
public void onTerminalLastDiagnosticInfoDcItemChange(InstanceContainer.ItemChangeEvent<TerminalLastDiagnosticInfo> event) {
|
public void onTerminalLastDiagnosticInfoDcItemChange(InstanceContainer.ItemChangeEvent<TerminalLastDiagnosticInfo> event) {
|
||||||
TerminalLastDiagnosticInfo info = event.getItem();
|
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) {
|
if(info != null) {
|
||||||
logger.info(">>> NOT NULL");
|
logger.info(">>> NOT NULL");
|
||||||
applicationSimplesDl.setParameter("diagnosticInfoId", info.getId());
|
applicationSimplesDl.setParameter("diagnosticInfoId", info.getId());
|
||||||
|
|||||||
Reference in New Issue
Block a user