[#967, #956] Removal of 'plan_user_info' duplicates

This commit is contained in:
Rsl1122 2019-04-02 17:07:14 +03:00
parent 52841f3724
commit e1860cc62c
3 changed files with 65 additions and 0 deletions

View File

@ -0,0 +1,35 @@
package com.djrapitops.plan.db.patches;
import com.djrapitops.plan.db.access.transactions.Transaction;
import com.djrapitops.plan.db.sql.tables.UserInfoTable;
import static com.djrapitops.plan.db.sql.parsing.Sql.*;
/**
* Transaction for removing duplicate data in plan_user_info.
* <p>
* https://github.com/plan-player-analytics/Plan/issues/956
* https://github.com/plan-player-analytics/Plan/issues/967
*
* @author Rsl1122
*/
public class RemoveDuplicateUserInfoTransaction extends Transaction {
private static final String COLUMN_ID = UserInfoTable.TABLE_NAME + '.' + UserInfoTable.ID;
private static final String STATEMENT_SELECT_DUPLICATE_IDS =
'(' + SELECT + "MIN(" + COLUMN_ID + ") as id" + FROM + UserInfoTable.TABLE_NAME +
GROUP_BY + UserInfoTable.USER_UUID + ", " + UserInfoTable.SERVER_UUID + ')';
@Override
protected void performOperations() {
execute(
"DELETE" + FROM + UserInfoTable.TABLE_NAME +
WHERE + COLUMN_ID +
" IN (" +
SELECT + COLUMN_ID + FROM + UserInfoTable.TABLE_NAME +
LEFT_JOIN + STATEMENT_SELECT_DUPLICATE_IDS + " q2 on q2.id=" + COLUMN_ID +
WHERE + "q2.id" + IS_NULL +
')'
);
}
}

View File

@ -22,6 +22,7 @@ import com.djrapitops.plan.db.access.Query;
import com.djrapitops.plan.db.access.QueryStatement;
import com.djrapitops.plan.db.access.transactions.commands.RemovePlayerTransaction;
import com.djrapitops.plan.db.access.transactions.init.RemoveOldSampledDataTransaction;
import com.djrapitops.plan.db.patches.RemoveDuplicateUserInfoTransaction;
import com.djrapitops.plan.db.sql.tables.SessionsTable;
import com.djrapitops.plan.extension.implementation.storage.transactions.results.RemoveUnsatisfiedConditionalResultsTransaction;
import com.djrapitops.plan.system.database.DBSystem;
@ -84,6 +85,7 @@ public class DBCleanTask extends AbsRunnable {
try {
if (database.getState() != Database.State.CLOSED) {
database.executeTransaction(new RemoveOldSampledDataTransaction(serverInfo.getServerUUID()));
database.executeTransaction(new RemoveDuplicateUserInfoTransaction());
database.executeTransaction(new RemoveUnsatisfiedConditionalResultsTransaction());
int removed = cleanOldPlayers(database);
if (removed > 0) {

View File

@ -45,6 +45,7 @@ import com.djrapitops.plan.db.access.transactions.events.*;
import com.djrapitops.plan.db.access.transactions.init.CreateIndexTransaction;
import com.djrapitops.plan.db.access.transactions.init.CreateTablesTransaction;
import com.djrapitops.plan.db.patches.Patch;
import com.djrapitops.plan.db.patches.RemoveDuplicateUserInfoTransaction;
import com.djrapitops.plan.db.tasks.DBCleanTask;
import com.djrapitops.plan.extension.CallEvents;
import com.djrapitops.plan.extension.DataExtension;
@ -631,6 +632,33 @@ public abstract class CommonDBTest {
assertFalse("All users were deleted!! D:", found.isEmpty());
}
@Test
public void cleanRemovesOnlyDuplicatedUserInfo() {
// Store one duplicate
db.executeTransaction(new Transaction() {
@Override
protected void performOperations() {
execute(DataStoreQueries.registerUserInfo(playerUUID, 0L, serverUUID));
execute(DataStoreQueries.registerUserInfo(playerUUID, 0L, serverUUID));
execute(DataStoreQueries.registerUserInfo(player2UUID, 0L, serverUUID));
}
});
db.executeTransaction(new RemoveDuplicateUserInfoTransaction());
List<UserInfo> found = db.query(UserInfoQueries.fetchUserInformationOfUser(playerUUID));
assertEquals(
Collections.singletonList(new UserInfo(playerUUID, serverUUID, 0, false, false)),
found
);
List<UserInfo> found2 = db.query(UserInfoQueries.fetchUserInformationOfUser(player2UUID));
assertEquals(
Collections.singletonList(new UserInfo(player2UUID, serverUUID, 0, false, false)),
found2
);
}
@Test
public void testKillTableGetKillsOfServer() {
saveUserOne();