Skip to content
Snippets Groups Projects
Commit 9d856c18 authored by Sonia Zorba's avatar Sonia Zorba
Browse files

Bugfix consistency checking, simplified columns list AJAX update handling

parent 59b4b3dc
No related branches found
No related tags found
No related merge requests found
...@@ -30,10 +30,8 @@ import java.sql.PreparedStatement; ...@@ -30,10 +30,8 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set; import java.util.Set;
import javax.sql.DataSource; import javax.sql.DataSource;
import org.slf4j.Logger; import org.slf4j.Logger;
...@@ -50,6 +48,32 @@ public class ConsistencyChecks implements Serializable { ...@@ -50,6 +48,32 @@ public class ConsistencyChecks implements Serializable {
private static final long serialVersionUID = 4412404312756740093L; private static final long serialVersionUID = 4412404312756740093L;
private final static Logger LOG = LoggerFactory.getLogger(ConsistencyChecks.class); private final static Logger LOG = LoggerFactory.getLogger(ConsistencyChecks.class);
public static class UnexistingColumn implements Serializable {
private static final long serialVersionUID = -4898369878807200093L;
private final String completeTableName;
private final String columnName;
private UnexistingColumn(String completeTableName, String columnName) {
this.completeTableName = completeTableName;
this.columnName = columnName;
}
public String getCompleteTableName() {
return completeTableName;
}
public String getColumnName() {
return columnName;
}
@Override
public String toString() {
return String.format("%s.%s", completeTableName, columnName);
}
}
public static class UnexistingKey implements Serializable { public static class UnexistingKey implements Serializable {
private static final long serialVersionUID = 7891439129072900628L; private static final long serialVersionUID = 7891439129072900628L;
...@@ -112,14 +136,14 @@ public class ConsistencyChecks implements Serializable { ...@@ -112,14 +136,14 @@ public class ConsistencyChecks implements Serializable {
private final List<InconsistentValue> inconsistencies; private final List<InconsistentValue> inconsistencies;
private final Set<String> unexisingSchemas; private final Set<String> unexisingSchemas;
private final Set<String> unexisingTables; private final Set<String> unexisingTables;
private final Map<String, String> unexisingColumns; private final List<UnexistingColumn> unexistingColumns;
private final List<UnexistingKey> unexistingKeys; private final List<UnexistingKey> unexistingKeys;
public ConsistencyChecks() { public ConsistencyChecks() {
inconsistencies = new ArrayList<>(); inconsistencies = new ArrayList<>();
unexisingSchemas = new HashSet<>(); unexisingSchemas = new HashSet<>();
unexisingTables = new HashSet<>(); unexisingTables = new HashSet<>();
unexisingColumns = new HashMap<>(); unexistingColumns = new ArrayList<>();
unexistingKeys = new ArrayList<>(); unexistingKeys = new ArrayList<>();
} }
...@@ -147,12 +171,12 @@ public class ConsistencyChecks implements Serializable { ...@@ -147,12 +171,12 @@ public class ConsistencyChecks implements Serializable {
unexisingTables.add(schemaName + "." + tableSimpleName); unexisingTables.add(schemaName + "." + tableSimpleName);
} }
public Map<String, String> getUnexisingColumns() { public List<UnexistingColumn> getUnexisingColumns() {
return unexisingColumns; return unexistingColumns;
} }
public void addUnexistingColumn(String completeTableName, String columnName) { public void addUnexistingColumn(String completeTableName, String columnName) {
unexisingColumns.put(completeTableName, columnName); unexistingColumns.add(new UnexistingColumn(completeTableName, columnName));
} }
public void addUnexistingKey(String keyId, String fromTable, String[] fromColumns, String targetTable, String[] targetColumns) { public void addUnexistingKey(String keyId, String fromTable, String[] fromColumns, String targetTable, String[] targetColumns) {
...@@ -183,7 +207,39 @@ public class ConsistencyChecks implements Serializable { ...@@ -183,7 +207,39 @@ public class ConsistencyChecks implements Serializable {
} }
public boolean isInconsistent() { public boolean isInconsistent() {
return !inconsistencies.isEmpty() || !unexisingSchemas.isEmpty() || !unexisingTables.isEmpty() || !unexisingColumns.isEmpty(); return !inconsistencies.isEmpty() || !unexisingSchemas.isEmpty() || !unexisingTables.isEmpty() || !unexistingColumns.isEmpty();
}
private void keysToRemoveFromUnexistingColumns(Connection conn, String tapSchemaNameEscaped, Set<String> keysToRemoveIds) throws SQLException {
for (UnexistingColumn unexistingColumn : unexistingColumns) {
StringBuilder sb = new StringBuilder();
sb.append("SELECT k.key_id AS key_id\n");
sb.append("FROM ");
sb.append(tapSchemaNameEscaped);
sb.append(".`keys` k\n");
sb.append("JOIN ");
sb.append(tapSchemaNameEscaped);
sb.append(".key_columns c ON k.key_id = c.key_id\n");
sb.append("WHERE (k.from_table = ? AND c.from_column = ?) OR (k.target_table = ? AND c.target_column = ?)");
String query = sb.toString();
try (PreparedStatement ps = conn.prepareStatement(query)) {
ps.setString(1, unexistingColumn.getCompleteTableName());
ps.setString(2, unexistingColumn.getColumnName());
ps.setString(3, unexistingColumn.getCompleteTableName());
ps.setString(4, unexistingColumn.getColumnName());
LOG.debug("Executing query {}", query);
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
keysToRemoveIds.add(rs.getString("key_id"));
}
}
}
}
} }
public void amendTapSchema(DBWrapper dbWrapper, TapSchema tapSchema) throws SQLException { public void amendTapSchema(DBWrapper dbWrapper, TapSchema tapSchema) throws SQLException {
...@@ -205,27 +261,7 @@ public class ConsistencyChecks implements Serializable { ...@@ -205,27 +261,7 @@ public class ConsistencyChecks implements Serializable {
keysToRemoveIds.addAll(getKeysToRemove(conn, tapSchemaNameEscaped, dbType, table)); keysToRemoveIds.addAll(getKeysToRemove(conn, tapSchemaNameEscaped, dbType, table));
} }
for (Map.Entry<String, String> entry : unexisingColumns.entrySet()) { keysToRemoveFromUnexistingColumns(conn, tapSchemaNameEscaped, keysToRemoveIds);
query = "select k.key_id AS key_id\n"
+ "FROM `keys` k\n"
+ "JOIN key_columns c ON k.key_id = c.key_id\n"
+ "WHERE (k.from_table = ? AND c.from_column = ?) OR (k.target_table = ? AND c.target_column = ?)";
try (PreparedStatement ps = conn.prepareStatement(query)) {
ps.setString(1, entry.getKey());
ps.setString(2, entry.getValue());
ps.setString(3, entry.getKey());
ps.setString(4, entry.getValue());
LOG.debug("Executing query {}", query);
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
keysToRemoveIds.add(rs.getString("key_id"));
}
}
}
}
for (UnexistingKey unexistingKey : unexistingKeys) { for (UnexistingKey unexistingKey : unexistingKeys) {
keysToRemoveIds.add(unexistingKey.getKeyId()); keysToRemoveIds.add(unexistingKey.getKeyId());
...@@ -256,12 +292,12 @@ public class ConsistencyChecks implements Serializable { ...@@ -256,12 +292,12 @@ public class ConsistencyChecks implements Serializable {
} }
// Removing all columns // Removing all columns
for (Map.Entry<String, String> entry : unexisingColumns.entrySet()) { for (UnexistingColumn unexistingColumn : unexistingColumns) {
query = String.format("DELETE FROM %s.%s WHERE table_name = ? AND column_name = ?", tapSchemaNameEscaped, TSMUtil.escapeName("columns", dbType)); query = String.format("DELETE FROM %s.%s WHERE table_name = ? AND column_name = ?", tapSchemaNameEscaped, TSMUtil.escapeName("columns", dbType));
try (PreparedStatement ps = conn.prepareStatement(query)) { try (PreparedStatement ps = conn.prepareStatement(query)) {
ps.setString(1, entry.getKey()); ps.setString(1, unexistingColumn.getCompleteTableName());
ps.setString(2, entry.getValue()); ps.setString(2, unexistingColumn.getColumnName());
LOG.debug("Executing query {} [{}, {}]", query, entry.getKey(), entry.getValue()); LOG.debug("Executing query {} [{}, {}]", query, unexistingColumn.getCompleteTableName(), unexistingColumn.getColumnName());
ps.executeUpdate(); ps.executeUpdate();
} }
} }
......
...@@ -39,6 +39,11 @@ ...@@ -39,6 +39,11 @@
} }
} }
}, },
reloadClicked: function (event) {
if (event.status === 'success') {
periodicCheck();
}
},
tapSchemaCreationConfirmed: function (event) { tapSchemaCreationConfirmed: function (event) {
if (event.status === 'success') { if (event.status === 'success') {
periodicCheck(); periodicCheck();
......
...@@ -88,6 +88,8 @@ ...@@ -88,6 +88,8 @@
}); });
// Setup loading animation // Setup loading animation
// Restore scroll position after JSF AJAX update
var windowScroll, columnsScroll;
jsf.ajax.addOnEvent(function (data) { jsf.ajax.addOnEvent(function (data) {
if ($(data.source).is('input[type="text"]') || if ($(data.source).is('input[type="text"]') ||
$(data.source).is('[data-jsf-modal]')) { $(data.source).is('[data-jsf-modal]')) {
...@@ -99,6 +101,12 @@ ...@@ -99,6 +101,12 @@
break; break;
case "complete": case "complete":
hideWaiting(); hideWaiting();
windowScroll = window.scrollY;
columnsScroll = $('.columns-selector').scrollTop();
break;
case "success":
window.scrollY = windowScroll;
$('.columns-selector').scrollTop(columnsScroll);
break; break;
} }
}); });
......
(function ($, TSM) { (function ($, TSM) {
var COLUMNS_COMPONENT_ID = 'main:columns-list';
TSM.displayUpdateOperations = TSM.eventHandlerFactory(function (srcElement, jsupdate) { TSM.displayUpdateOperations = TSM.eventHandlerFactory(function (srcElement, jsupdate) {
$('#updateOperationsModal').modal('show'); $('#updateOperationsModal').modal('show');
}); });
...@@ -24,33 +22,6 @@ ...@@ -24,33 +22,6 @@
return false; return false;
}; };
TSM.columnChanged = function (event) {
if (event.status === 'success') {
var $li = $(event.source).closest('li');
$li.closest('ul').find('li').removeClass('active');
$li.addClass('active');
}
};
TSM.columnRemoved = TSM.eventHandlerFactory(function (srcElement, jsupdate) {
jsupdate = JSON.parse(jsupdate);
var $ul = $(srcElement).closest('ul');
$(srcElement).closest('a').find('span').addClass('strikeout');
$(srcElement).prop('disabled', true);
if (jsupdate.selectedColumn !== undefined) {
$ul.find('li').removeClass('active');
$ul.find('li:nth-child(' + (jsupdate.selectedColumn + 1) + ')').addClass('active');
}
}, COLUMNS_COMPONENT_ID);
TSM.columnRemovalUndo = TSM.eventHandlerFactory(function (srcElement, jsupdate) {
var $a = $('#main\\:columns-list\\:' + jsupdate + '\\:column-selector');
$a.find('input').prop('disabled', false);
$a.find('.strikeout').removeClass('strikeout');
$a.removeClass('strikeout');
}, COLUMNS_COMPONENT_ID);
TSM.ucdTextKeyDown = function (event) { TSM.ucdTextKeyDown = function (event) {
if (event.keyCode === 13) { if (event.keyCode === 13) {
$('#ucd_search_form\\:search_UCD_btn').click(); $('#ucd_search_form\\:search_UCD_btn').click();
......
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
<h:commandLink class="btn btn-info" action="#{tapSchemaEditing.reload()}" onclick="showWaiting()"> <h:commandLink class="btn btn-info" action="#{tapSchemaEditing.reload()}" onclick="showWaiting()">
<span class="glyphicon glyphicon-refresh"></span> <span class="glyphicon glyphicon-refresh"></span>
Reload all Reload all
<f:ajax execute="@form" render="@form" onevent="TSM.asyncLoader.startChecking" /> <f:ajax execute="@form" render="@form" onevent="TSM.asyncLoader.reloadClicked" />
</h:commandLink> </h:commandLink>
</div> </div>
<div class="col-sm-6 vpadding text-right"> <div class="col-sm-6 vpadding text-right">
...@@ -49,12 +49,6 @@ ...@@ -49,12 +49,6 @@
Back Back
</h:commandLink> </h:commandLink>
<h:outputText value="&#160;" /> <h:outputText value="&#160;" />
<ui:remove>
<h:commandLink class="btn btn-danger" action="#{tapSchemaEditing.logout()}">
<span class="glyphicon glyphicon-log-out"></span>
Close session
</h:commandLink>
</ui:remove>
</div> </div>
<div class="clearfix"></div> <div class="clearfix"></div>
<br/> <br/>
...@@ -223,7 +217,7 @@ ...@@ -223,7 +217,7 @@
<li role="presentation" class="#{tapSchemaEditing.selectedColumn.name eq column.name ? 'active': ''}"> <li role="presentation" class="#{tapSchemaEditing.selectedColumn.name eq column.name ? 'active': ''}">
<h:commandLink role="tab" action="#{tapSchemaEditing.setSelectedColumn(column)}" id="column-selector"> <h:commandLink role="tab" action="#{tapSchemaEditing.setSelectedColumn(column)}" id="column-selector">
<h:commandButton class="btn btn-link remove-btn" disabled="#{tapSchemaEditing.toRemove(column) or column.parent.parent.name eq tapSchemaEditing.tapSchema.name}" value="&#215;" onclick="TSM.stopPropagation(event)" id="column-remover"> <h:commandButton class="btn btn-link remove-btn" disabled="#{tapSchemaEditing.toRemove(column) or column.parent.parent.name eq tapSchemaEditing.tapSchema.name}" value="&#215;" onclick="TSM.stopPropagation(event)" id="column-remover">
<f:ajax execute="@form" render=":main:column_wrapper :main:columns_header" listener="#{tapSchemaEditing.removeColumn(column.name)}" onevent="TSM.columnRemoved" /> <f:ajax execute="@form" render=":main:tables_wrapper" listener="#{tapSchemaEditing.removeColumn(column.name)}" />
</h:commandButton> </h:commandButton>
<h:panelGroup rendered="#{column.primaryKey}"> <h:panelGroup rendered="#{column.primaryKey}">
...@@ -237,7 +231,7 @@ ...@@ -237,7 +231,7 @@
</h:panelGroup> </h:panelGroup>
<span class="#{tapSchemaEditing.toRemove(column) ? 'strikeout':''}">#{column.name}</span> <span class="#{tapSchemaEditing.toRemove(column) ? 'strikeout':''}">#{column.name}</span>
<f:ajax execute="@form" render=":main:column_wrapper :main:columns_header" onevent="TSM.columnChanged" /> <f:ajax execute="@form" render=":main:tables_wrapper" />
</h:commandLink> </h:commandLink>
</li> </li>
</ui:repeat> </ui:repeat>
...@@ -251,7 +245,7 @@ ...@@ -251,7 +245,7 @@
This column will be removed on TAP Schema Update. This column will be removed on TAP Schema Update.
<h:commandLink class="btn btn-primary pull-right" action="#{tapSchemaEditing.undoRemoveColumn()}"> <h:commandLink class="btn btn-primary pull-right" action="#{tapSchemaEditing.undoRemoveColumn()}">
Undo Undo
<f:ajax execute="@form" render=":main:column_wrapper :main:columns_header" onevent="TSM.columnRemovalUndo" /> <f:ajax execute="@form" render=":main:tables_wrapper" />
</h:commandLink> </h:commandLink>
</div> </div>
</h:panelGroup> </h:panelGroup>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment