mirror of
https://github.com/plan-player-analytics/Plan.git
synced 2025-01-15 20:51:21 +01:00
Removal of unsatisfied table conditional results
Cleanup of data that requires a conditional, but the conditional has changed value after storage of the data.
This commit is contained in:
parent
d2ffee87bd
commit
44266d06fc
@ -20,8 +20,10 @@ import com.djrapitops.plan.db.DBType;
|
|||||||
import com.djrapitops.plan.db.access.ExecStatement;
|
import com.djrapitops.plan.db.access.ExecStatement;
|
||||||
import com.djrapitops.plan.db.access.Executable;
|
import com.djrapitops.plan.db.access.Executable;
|
||||||
import com.djrapitops.plan.db.access.transactions.Transaction;
|
import com.djrapitops.plan.db.access.transactions.Transaction;
|
||||||
|
import com.djrapitops.plan.db.sql.tables.ExtensionPlayerTableValueTable;
|
||||||
import com.djrapitops.plan.db.sql.tables.ExtensionPlayerValueTable;
|
import com.djrapitops.plan.db.sql.tables.ExtensionPlayerValueTable;
|
||||||
import com.djrapitops.plan.db.sql.tables.ExtensionProviderTable;
|
import com.djrapitops.plan.db.sql.tables.ExtensionProviderTable;
|
||||||
|
import com.djrapitops.plan.db.sql.tables.ExtensionTableProviderTable;
|
||||||
|
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
@ -41,35 +43,51 @@ import static com.djrapitops.plan.db.sql.parsing.Sql.*;
|
|||||||
*/
|
*/
|
||||||
public class RemoveUnsatisfiedConditionalPlayerResultsTransaction extends Transaction {
|
public class RemoveUnsatisfiedConditionalPlayerResultsTransaction extends Transaction {
|
||||||
|
|
||||||
@Override
|
private final String providerTable;
|
||||||
protected void performOperations() {
|
private final String playerValueTable;
|
||||||
execute(deleteUnsatisfied());
|
private final String playerTableValueTable;
|
||||||
|
private final String tableTable;
|
||||||
|
|
||||||
|
public RemoveUnsatisfiedConditionalPlayerResultsTransaction() {
|
||||||
|
providerTable = ExtensionProviderTable.TABLE_NAME;
|
||||||
|
playerValueTable = ExtensionPlayerValueTable.TABLE_NAME;
|
||||||
|
tableTable = ExtensionTableProviderTable.TABLE_NAME;
|
||||||
|
playerTableValueTable = ExtensionPlayerTableValueTable.TABLE_NAME;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Executable deleteUnsatisfied() {
|
@Override
|
||||||
String reversedCondition = dbType == DBType.SQLITE ? "'not_' || " + ExtensionProviderTable.PROVIDED_CONDITION : "CONCAT('not_'," + ExtensionProviderTable.PROVIDED_CONDITION + ')';
|
protected void performOperations() {
|
||||||
|
String selectSatisfiedConditions = getSatisfiedConditionsSQL();
|
||||||
|
|
||||||
String providerTable = ExtensionProviderTable.TABLE_NAME;
|
execute(deleteUnsatisfiedValues(selectSatisfiedConditions));
|
||||||
String playerValueTable = ExtensionPlayerValueTable.TABLE_NAME;
|
execute(deleteUnsatisfiedTableValues(selectSatisfiedConditions));
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getSatisfiedConditionsSQL() {
|
||||||
|
String reversedCondition = dbType == DBType.SQLITE ? "'not_' || " + ExtensionProviderTable.PROVIDED_CONDITION : "CONCAT('not_'," + ExtensionProviderTable.PROVIDED_CONDITION + ')';
|
||||||
|
|
||||||
String selectSatisfiedPositiveConditions = SELECT +
|
String selectSatisfiedPositiveConditions = SELECT +
|
||||||
ExtensionProviderTable.PROVIDED_CONDITION + ',' +
|
ExtensionProviderTable.PROVIDED_CONDITION + ',' +
|
||||||
ExtensionPlayerValueTable.USER_UUID +
|
ExtensionProviderTable.PLUGIN_ID + ',' +
|
||||||
|
ExtensionPlayerTableValueTable.USER_UUID +
|
||||||
FROM + providerTable +
|
FROM + providerTable +
|
||||||
INNER_JOIN + playerValueTable + " on " + providerTable + '.' + ExtensionProviderTable.ID + "=" + ExtensionPlayerValueTable.PROVIDER_ID +
|
INNER_JOIN + playerValueTable + " on " + providerTable + '.' + ExtensionProviderTable.ID + "=" + ExtensionPlayerValueTable.PROVIDER_ID +
|
||||||
WHERE + ExtensionPlayerValueTable.BOOLEAN_VALUE + "=?" +
|
WHERE + ExtensionPlayerValueTable.BOOLEAN_VALUE + "=?" +
|
||||||
AND + ExtensionProviderTable.PROVIDED_CONDITION + IS_NOT_NULL;
|
AND + ExtensionProviderTable.PROVIDED_CONDITION + IS_NOT_NULL;
|
||||||
String selectSatisfiedNegativeConditions = SELECT +
|
String selectSatisfiedNegativeConditions = SELECT +
|
||||||
reversedCondition + " as " + ExtensionProviderTable.PROVIDED_CONDITION + ',' +
|
reversedCondition + " as " + ExtensionProviderTable.PROVIDED_CONDITION + ',' +
|
||||||
ExtensionPlayerValueTable.USER_UUID +
|
ExtensionProviderTable.PLUGIN_ID + ',' +
|
||||||
|
ExtensionPlayerTableValueTable.USER_UUID +
|
||||||
FROM + providerTable +
|
FROM + providerTable +
|
||||||
INNER_JOIN + playerValueTable + " on " + providerTable + '.' + ExtensionProviderTable.ID + "=" + ExtensionPlayerValueTable.PROVIDER_ID +
|
INNER_JOIN + playerValueTable + " on " + providerTable + '.' + ExtensionProviderTable.ID + "=" + ExtensionPlayerValueTable.PROVIDER_ID +
|
||||||
WHERE + ExtensionPlayerValueTable.BOOLEAN_VALUE + "=?" +
|
WHERE + ExtensionPlayerValueTable.BOOLEAN_VALUE + "=?" +
|
||||||
AND + ExtensionProviderTable.PROVIDED_CONDITION + IS_NOT_NULL;
|
AND + ExtensionProviderTable.PROVIDED_CONDITION + IS_NOT_NULL;
|
||||||
|
|
||||||
// Query contents: Set of provided_conditions
|
// Query contents: Set of provided_conditions
|
||||||
String selectSatisfiedConditions = '(' + selectSatisfiedPositiveConditions + " UNION " + selectSatisfiedNegativeConditions + ") q1";
|
return '(' + selectSatisfiedPositiveConditions + " UNION " + selectSatisfiedNegativeConditions + ") q1";
|
||||||
|
}
|
||||||
|
|
||||||
|
private Executable deleteUnsatisfiedValues(String selectSatisfiedConditions) {
|
||||||
// Query contents:
|
// Query contents:
|
||||||
// id | uuid | q1.uuid | condition | q1.provided_condition
|
// id | uuid | q1.uuid | condition | q1.provided_condition
|
||||||
// -- | ---- | ------- | --------- | ---------------------
|
// -- | ---- | ------- | --------- | ---------------------
|
||||||
@ -87,6 +105,8 @@ public class RemoveUnsatisfiedConditionalPlayerResultsTransaction extends Transa
|
|||||||
"=q1." + ExtensionPlayerValueTable.USER_UUID +
|
"=q1." + ExtensionPlayerValueTable.USER_UUID +
|
||||||
AND + ExtensionProviderTable.CONDITION +
|
AND + ExtensionProviderTable.CONDITION +
|
||||||
"=q1." + ExtensionProviderTable.PROVIDED_CONDITION +
|
"=q1." + ExtensionProviderTable.PROVIDED_CONDITION +
|
||||||
|
AND + providerTable + '.' + ExtensionProviderTable.PLUGIN_ID +
|
||||||
|
"=q1." + ExtensionProviderTable.PLUGIN_ID +
|
||||||
')' +
|
')' +
|
||||||
WHERE + "q1." + ExtensionProviderTable.PROVIDED_CONDITION + IS_NULL + // Conditions that were not in the satisfied condition query
|
WHERE + "q1." + ExtensionProviderTable.PROVIDED_CONDITION + IS_NULL + // Conditions that were not in the satisfied condition query
|
||||||
AND + ExtensionProviderTable.CONDITION + IS_NOT_NULL; // Ignore values that don't need condition
|
AND + ExtensionProviderTable.CONDITION + IS_NOT_NULL; // Ignore values that don't need condition
|
||||||
@ -105,4 +125,32 @@ public class RemoveUnsatisfiedConditionalPlayerResultsTransaction extends Transa
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Executable deleteUnsatisfiedTableValues(String selectSatisfiedConditions) {
|
||||||
|
String selectUnsatisfiedValueIDs = SELECT + ExtensionTableProviderTable.ID +
|
||||||
|
FROM + tableTable +
|
||||||
|
LEFT_JOIN + selectSatisfiedConditions + // Left join to preserve values that don't have their condition fulfilled
|
||||||
|
" on (" +
|
||||||
|
tableTable + '.' + ExtensionTableProviderTable.CONDITION +
|
||||||
|
"=q1." + ExtensionProviderTable.PROVIDED_CONDITION +
|
||||||
|
AND + tableTable + '.' + ExtensionTableProviderTable.PLUGIN_ID +
|
||||||
|
"=q1." + ExtensionProviderTable.PLUGIN_ID +
|
||||||
|
')' +
|
||||||
|
WHERE + "q1." + ExtensionProviderTable.PROVIDED_CONDITION + IS_NULL + // Conditions that were not in the satisfied condition query
|
||||||
|
AND + ExtensionProviderTable.CONDITION + IS_NOT_NULL; // Ignore values that don't need condition
|
||||||
|
|
||||||
|
// Nested query here is required because MySQL limits update statements with nested queries:
|
||||||
|
// The nested query creates a temporary table that bypasses the same table query-update limit.
|
||||||
|
// Note: MySQL versions 5.6.7+ might optimize this nested query away leading to an exception.
|
||||||
|
String deleteValuesSQL = "DELETE FROM " + playerTableValueTable +
|
||||||
|
WHERE + ExtensionPlayerTableValueTable.TABLE_ID + " IN (" + SELECT + ExtensionTableProviderTable.ID + FROM + '(' + selectUnsatisfiedValueIDs + ") as ids)";
|
||||||
|
|
||||||
|
return new ExecStatement(deleteValuesSQL) {
|
||||||
|
@Override
|
||||||
|
public void prepare(PreparedStatement statement) throws SQLException {
|
||||||
|
statement.setBoolean(1, true); // Select provided conditions with 'true' value
|
||||||
|
statement.setBoolean(2, false); // Select negated conditions with 'false' value
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
@ -21,7 +21,9 @@ import com.djrapitops.plan.db.access.ExecStatement;
|
|||||||
import com.djrapitops.plan.db.access.Executable;
|
import com.djrapitops.plan.db.access.Executable;
|
||||||
import com.djrapitops.plan.db.access.transactions.Transaction;
|
import com.djrapitops.plan.db.access.transactions.Transaction;
|
||||||
import com.djrapitops.plan.db.sql.tables.ExtensionProviderTable;
|
import com.djrapitops.plan.db.sql.tables.ExtensionProviderTable;
|
||||||
|
import com.djrapitops.plan.db.sql.tables.ExtensionServerTableValueTable;
|
||||||
import com.djrapitops.plan.db.sql.tables.ExtensionServerValueTable;
|
import com.djrapitops.plan.db.sql.tables.ExtensionServerValueTable;
|
||||||
|
import com.djrapitops.plan.db.sql.tables.ExtensionTableProviderTable;
|
||||||
|
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
@ -42,35 +44,26 @@ import static com.djrapitops.plan.db.sql.parsing.Sql.*;
|
|||||||
*/
|
*/
|
||||||
public class RemoveUnsatisfiedConditionalServerResultsTransaction extends Transaction {
|
public class RemoveUnsatisfiedConditionalServerResultsTransaction extends Transaction {
|
||||||
|
|
||||||
|
private final String providerTable;
|
||||||
|
private final String serverValueTable;
|
||||||
|
private final String serverTableValueTable;
|
||||||
|
private final String tableTable;
|
||||||
|
|
||||||
|
public RemoveUnsatisfiedConditionalServerResultsTransaction() {
|
||||||
|
providerTable = ExtensionProviderTable.TABLE_NAME;
|
||||||
|
serverValueTable = ExtensionServerValueTable.TABLE_NAME;
|
||||||
|
tableTable = ExtensionTableProviderTable.TABLE_NAME;
|
||||||
|
serverTableValueTable = ExtensionServerTableValueTable.TABLE_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void performOperations() {
|
protected void performOperations() {
|
||||||
execute(deleteUnsatisfied());
|
String selectSatisfiedConditions = getSatisfiedConditionsSQL();
|
||||||
|
execute(deleteUnsatisfiedValues(selectSatisfiedConditions));
|
||||||
|
execute(deleteUnsatisfiedTableValues(selectSatisfiedConditions));
|
||||||
}
|
}
|
||||||
|
|
||||||
private Executable deleteUnsatisfied() {
|
private Executable deleteUnsatisfiedValues(String selectSatisfiedConditions) {
|
||||||
String reversedCondition = dbType == DBType.SQLITE ? "'not_' || " + ExtensionProviderTable.PROVIDED_CONDITION : "CONCAT('not_'," + ExtensionProviderTable.PROVIDED_CONDITION + ')';
|
|
||||||
|
|
||||||
String providerTable = ExtensionProviderTable.TABLE_NAME;
|
|
||||||
String serverValueTable = ExtensionServerValueTable.TABLE_NAME;
|
|
||||||
|
|
||||||
String selectSatisfiedPositiveConditions = SELECT +
|
|
||||||
ExtensionProviderTable.PROVIDED_CONDITION + ',' +
|
|
||||||
ExtensionProviderTable.PLUGIN_ID +
|
|
||||||
FROM + providerTable +
|
|
||||||
INNER_JOIN + serverValueTable + " on " + providerTable + '.' + ExtensionProviderTable.ID + "=" + ExtensionServerValueTable.PROVIDER_ID +
|
|
||||||
WHERE + ExtensionServerValueTable.BOOLEAN_VALUE + "=?" +
|
|
||||||
AND + ExtensionProviderTable.PROVIDED_CONDITION + IS_NOT_NULL;
|
|
||||||
String selectSatisfiedNegativeConditions = SELECT +
|
|
||||||
reversedCondition + " as " + ExtensionProviderTable.PROVIDED_CONDITION + ',' +
|
|
||||||
ExtensionProviderTable.PLUGIN_ID +
|
|
||||||
FROM + providerTable +
|
|
||||||
INNER_JOIN + serverValueTable + " on " + providerTable + '.' + ExtensionProviderTable.ID + "=" + ExtensionServerValueTable.PROVIDER_ID +
|
|
||||||
WHERE + ExtensionServerValueTable.BOOLEAN_VALUE + "=?" +
|
|
||||||
AND + ExtensionProviderTable.PROVIDED_CONDITION + IS_NOT_NULL;
|
|
||||||
|
|
||||||
// Query contents: Set of provided_conditions
|
|
||||||
String selectSatisfiedConditions = '(' + selectSatisfiedPositiveConditions + " UNION " + selectSatisfiedNegativeConditions + ") q1";
|
|
||||||
|
|
||||||
// Query contents:
|
// Query contents:
|
||||||
// id | provider_id | q1.provider_id | condition | q1.provided_condition
|
// id | provider_id | q1.provider_id | condition | q1.provided_condition
|
||||||
// -- | ----------- | -------------- | --------- | ---------------------
|
// -- | ----------- | -------------- | --------- | ---------------------
|
||||||
@ -104,4 +97,54 @@ public class RemoveUnsatisfiedConditionalServerResultsTransaction extends Transa
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String getSatisfiedConditionsSQL() {
|
||||||
|
String reversedCondition = dbType == DBType.SQLITE ? "'not_' || " + ExtensionProviderTable.PROVIDED_CONDITION : "CONCAT('not_'," + ExtensionProviderTable.PROVIDED_CONDITION + ')';
|
||||||
|
|
||||||
|
String selectSatisfiedPositiveConditions = SELECT +
|
||||||
|
ExtensionProviderTable.PROVIDED_CONDITION + ',' +
|
||||||
|
ExtensionProviderTable.PLUGIN_ID +
|
||||||
|
FROM + providerTable +
|
||||||
|
INNER_JOIN + serverValueTable + " on " + providerTable + '.' + ExtensionProviderTable.ID + "=" + ExtensionServerValueTable.PROVIDER_ID +
|
||||||
|
WHERE + ExtensionServerValueTable.BOOLEAN_VALUE + "=?" +
|
||||||
|
AND + ExtensionProviderTable.PROVIDED_CONDITION + IS_NOT_NULL;
|
||||||
|
String selectSatisfiedNegativeConditions = SELECT +
|
||||||
|
reversedCondition + " as " + ExtensionProviderTable.PROVIDED_CONDITION + ',' +
|
||||||
|
ExtensionProviderTable.PLUGIN_ID +
|
||||||
|
FROM + providerTable +
|
||||||
|
INNER_JOIN + serverValueTable + " on " + providerTable + '.' + ExtensionProviderTable.ID + "=" + ExtensionServerValueTable.PROVIDER_ID +
|
||||||
|
WHERE + ExtensionServerValueTable.BOOLEAN_VALUE + "=?" +
|
||||||
|
AND + ExtensionProviderTable.PROVIDED_CONDITION + IS_NOT_NULL;
|
||||||
|
|
||||||
|
// Query contents: Set of provided_conditions
|
||||||
|
return '(' + selectSatisfiedPositiveConditions + " UNION " + selectSatisfiedNegativeConditions + ") q1";
|
||||||
|
}
|
||||||
|
|
||||||
|
private Executable deleteUnsatisfiedTableValues(String selectSatisfiedConditions) {
|
||||||
|
String selectUnsatisfiedValueIDs = SELECT + ExtensionTableProviderTable.ID +
|
||||||
|
FROM + tableTable +
|
||||||
|
LEFT_JOIN + selectSatisfiedConditions + // Left join to preserve values that don't have their condition fulfilled
|
||||||
|
" on (" +
|
||||||
|
tableTable + '.' + ExtensionTableProviderTable.CONDITION +
|
||||||
|
"=q1." + ExtensionProviderTable.PROVIDED_CONDITION +
|
||||||
|
AND + tableTable + '.' + ExtensionTableProviderTable.PLUGIN_ID +
|
||||||
|
"=q1." + ExtensionProviderTable.PLUGIN_ID +
|
||||||
|
')' +
|
||||||
|
WHERE + "q1." + ExtensionProviderTable.PROVIDED_CONDITION + IS_NULL + // Conditions that were not in the satisfied condition query
|
||||||
|
AND + ExtensionProviderTable.CONDITION + IS_NOT_NULL; // Ignore values that don't need condition
|
||||||
|
|
||||||
|
// Nested query here is required because MySQL limits update statements with nested queries:
|
||||||
|
// The nested query creates a temporary table that bypasses the same table query-update limit.
|
||||||
|
// Note: MySQL versions 5.6.7+ might optimize this nested query away leading to an exception.
|
||||||
|
String deleteValuesSQL = "DELETE FROM " + serverTableValueTable +
|
||||||
|
WHERE + ExtensionServerTableValueTable.TABLE_ID + " IN (" + SELECT + ExtensionTableProviderTable.ID + FROM + '(' + selectUnsatisfiedValueIDs + ") as ids)";
|
||||||
|
|
||||||
|
return new ExecStatement(deleteValuesSQL) {
|
||||||
|
@Override
|
||||||
|
public void prepare(PreparedStatement statement) throws SQLException {
|
||||||
|
statement.setBoolean(1, true); // Select provided conditions with 'true' value
|
||||||
|
statement.setBoolean(2, false); // Select negated conditions with 'false' value
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user