diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..5f926db --- /dev/null +++ b/gradle.properties @@ -0,0 +1 @@ +org.gradle.java.home=C:/Program Files/OpenLogic/jdk-8.0.482.08-hotspot diff --git a/modules/core/src/com/cmobile/unifiedtms/service/TerminalGroupImporterServiceBean.java b/modules/core/src/com/cmobile/unifiedtms/service/TerminalGroupImporterServiceBean.java index 0fef00a..aa500e1 100644 --- a/modules/core/src/com/cmobile/unifiedtms/service/TerminalGroupImporterServiceBean.java +++ b/modules/core/src/com/cmobile/unifiedtms/service/TerminalGroupImporterServiceBean.java @@ -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 parsedTerminals, - Map 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 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())); - statement.setString(7, normalizeImportValueLower(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 wrappersByRowNo, - Map> wrappersByTerminalId) throws SQLException { + Map> 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) { diff --git a/modules/web/src/com/cmobile/unifiedtms/web/screens/terminallastdiagnosticinfo/TerminalLastDiagnosticInfoEdit.java b/modules/web/src/com/cmobile/unifiedtms/web/screens/terminallastdiagnosticinfo/TerminalLastDiagnosticInfoEdit.java index 74392ce..4e34d85 100644 --- a/modules/web/src/com/cmobile/unifiedtms/web/screens/terminallastdiagnosticinfo/TerminalLastDiagnosticInfoEdit.java +++ b/modules/web/src/com/cmobile/unifiedtms/web/screens/terminallastdiagnosticinfo/TerminalLastDiagnosticInfoEdit.java @@ -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 { - @Inject - private InstanceContainer terminalLastDiagnosticInfoDc; @Inject private CollectionLoader applicationSimplesDl; @Inject @@ -24,6 +21,7 @@ public class TerminalLastDiagnosticInfoEdit extends StandardEditor { logger.info(">>> App Simple Loader Loaded!! : {}", applicationSimplePostLoadEvent.getLoadedEntities().size()); applicationSimplePostLoadEvent.getLoadedEntities().forEach(applicationSimple -> { @@ -35,7 +33,7 @@ public class TerminalLastDiagnosticInfoEdit extends StandardEditor 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()); @@ -46,4 +44,4 @@ public class TerminalLastDiagnosticInfoEdit extends StandardEditor