mirror of
https://github.com/plan-player-analytics/Plan.git
synced 2025-02-05 16:30:24 +08:00
parent
52841f3724
commit
e1860cc62c
@ -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 +
|
||||
')'
|
||||
);
|
||||
}
|
||||
}
|
@ -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) {
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user