From a44335709df5b1211480434fd11ad97e039902b5 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Thu, 13 Dec 2018 11:42:14 +0200 Subject: [PATCH] WorldsTable table structure optimization - Replaced server_id with server_uuid --- .../system/database/databases/sql/SQLDB.java | 3 +- .../sql/patches/WorldsOptimizationPatch.java | 71 +++++++++++++++++++ .../sql/patches/WorldsServerIDPatch.java | 8 +-- .../databases/sql/tables/WorldTable.java | 19 +++-- .../databases/sql/tables/WorldTimesTable.java | 8 ++- 5 files changed, 96 insertions(+), 13 deletions(-) create mode 100644 Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/patches/WorldsOptimizationPatch.java diff --git a/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/SQLDB.java b/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/SQLDB.java index f443a825c..666cca03b 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/SQLDB.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/SQLDB.java @@ -202,7 +202,8 @@ public abstract class SQLDB extends Database { new NicknameLastSeenPatch(this), new VersionTableRemovalPatch(this), new DiskUsagePatch(this), - new WorldTimesOptimizationPatch(this) + new WorldTimesOptimizationPatch(this), + new WorldsOptimizationPatch(this) }; try { diff --git a/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/patches/WorldsOptimizationPatch.java b/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/patches/WorldsOptimizationPatch.java new file mode 100644 index 000000000..ea11cd935 --- /dev/null +++ b/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/patches/WorldsOptimizationPatch.java @@ -0,0 +1,71 @@ +/* + * This file is part of Player Analytics (Plan). + * + * Plan is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License v3 as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Plan is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Plan. If not, see . + */ +package com.djrapitops.plan.system.database.databases.sql.patches; + +import com.djrapitops.plan.api.exceptions.database.DBOpException; +import com.djrapitops.plan.system.database.databases.sql.SQLDB; +import com.djrapitops.plan.system.database.databases.sql.tables.WorldTable; +import com.djrapitops.plan.system.database.databases.sql.tables.WorldTable.Col; + +public class WorldsOptimizationPatch extends Patch { + + private String tempTableName; + private String tableName; + + public WorldsOptimizationPatch(SQLDB db) { + super(db); + tableName = WorldTable.TABLE_NAME; + tempTableName = "temp_worlds"; + } + + @Override + public boolean hasBeenApplied() { + return hasColumn(tableName, Col.ID.get()) + && hasColumn(tableName, Col.SERVER_UUID.get()) + && !hasColumn(tableName, "server_id") + && !hasTable(tempTableName); // If this table exists the patch has failed to finish. + } + + @Override + public void apply() { + try { + tempOldTable(); + db.getWorldTable().createTable(); + + db.execute("INSERT INTO " + tableName + " (" + + Col.ID + ", " + + Col.SERVER_UUID + ", " + + Col.NAME + + ") SELECT " + + Col.ID + ", " + + "(SELECT plan_servers.uuid FROM plan_servers WHERE plan_servers.id = " + tempTableName + ".server_id LIMIT 1), " + + Col.NAME + + " FROM " + tempTableName + ); + + dropTable(tempTableName); + } catch (Exception e) { + throw new DBOpException(WorldsOptimizationPatch.class.getSimpleName() + " failed.", e); + } + } + + private void tempOldTable() { + if (!hasTable(tempTableName)) { + renameTable(tableName, tempTableName); + } + } +} diff --git a/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/patches/WorldsServerIDPatch.java b/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/patches/WorldsServerIDPatch.java index f7830400c..18273fc71 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/patches/WorldsServerIDPatch.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/patches/WorldsServerIDPatch.java @@ -40,9 +40,9 @@ public class WorldsServerIDPatch extends Patch { @Override public boolean hasBeenApplied() { String tableName = WorldTable.TABLE_NAME; - String columnName = WorldTable.Col.SERVER_ID.get(); + String columnName = "server_id"; - // WorldOptimizationPatch makes this patch incompatible with newer patch versions. + // WorldsOptimizationPatch makes this patch incompatible with newer patch versions. return hasColumn(tableName, "server_uuid") || hasColumn(tableName, columnName) && allValuesHaveServerID(tableName, columnName); @@ -82,7 +82,7 @@ public class WorldsServerIDPatch extends Patch { } updateWorldTimesTableWorldIDs(); - db.executeUnsafe("DELETE FROM " + WorldTable.TABLE_NAME + " WHERE " + WorldTable.Col.SERVER_ID + "=0"); + db.executeUnsafe("DELETE FROM " + WorldTable.TABLE_NAME + " WHERE server_id=0"); } private Set getWorldNamesOld(UUID serverUUID) { @@ -162,7 +162,7 @@ public class WorldsServerIDPatch extends Patch { List objects = new ArrayList<>(); while (set.next()) { int worldID = set.getInt(WorldTable.Col.ID.get()); - int serverID = set.getInt(WorldTable.Col.SERVER_ID.get()); + int serverID = set.getInt("server_id"); String worldName = set.getString(WorldTable.Col.NAME.get()); objects.add(new WorldObj(worldID, serverID, worldName)); } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/tables/WorldTable.java b/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/tables/WorldTable.java index 2158396a3..e79e7e640 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/tables/WorldTable.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/tables/WorldTable.java @@ -35,6 +35,11 @@ import java.util.*; * Table class representing database table plan_worlds. *

* Used for storing id references to world names. + *

+ * Patches related to this table: + * {@link com.djrapitops.plan.system.database.databases.sql.patches.Version10Patch} + * {@link com.djrapitops.plan.system.database.databases.sql.patches.WorldsServerIDPatch} + * {@link com.djrapitops.plan.system.database.databases.sql.patches.WorldsOptimizationPatch} * * @author Rsl1122 * @since 3.6.0 / Database version 7 @@ -50,7 +55,7 @@ public class WorldTable extends Table { serverTable = db.getServerTable(); statementSelectID = "(SELECT " + Col.ID + " FROM " + tableName + " WHERE (" + Col.NAME + "=?)" + - " AND (" + Col.SERVER_ID + "=" + serverTable.statementSelectServerID + ")" + + " AND (" + Col.SERVER_UUID + "=?)" + " LIMIT 1)"; } @@ -59,9 +64,8 @@ public class WorldTable extends Table { createTable(TableSqlParser.createTable(tableName) .primaryKeyIDColumn(supportsMySQLQueries, Col.ID) .column(Col.NAME, Sql.varchar(100)).notNull() - .column(Col.SERVER_ID, Sql.INT).notNull() + .column(Col.SERVER_UUID, Sql.varchar(36)).notNull() .primaryKey(supportsMySQLQueries, Col.ID) - .foreignKey(Col.SERVER_ID, ServerTable.TABLE_NAME, ServerTable.Col.SERVER_ID) .toString() ); } @@ -93,7 +97,7 @@ public class WorldTable extends Table { public List getWorlds(UUID serverUUID) { String sql = "SELECT * FROM " + tableName + - " WHERE " + Col.SERVER_ID + "=" + serverTable.statementSelectServerID; + " WHERE " + Col.SERVER_UUID + "=?"; return query(new QueryStatement>(sql) { @@ -137,8 +141,8 @@ public class WorldTable extends Table { String sql = "INSERT INTO " + tableName + " (" + Col.NAME + ", " - + Col.SERVER_ID - + ") VALUES (?, " + serverTable.statementSelectServerID + ")"; + + Col.SERVER_UUID + + ") VALUES (?, ?)"; executeBatch(new ExecStatement(sql) { @Override @@ -154,7 +158,7 @@ public class WorldTable extends Table { public Set getWorldNames(UUID serverUUID) { String sql = "SELECT DISTINCT " + Col.NAME + " FROM " + tableName + - " WHERE " + Col.SERVER_ID + "=" + serverTable.statementSelectServerID; + " WHERE " + Col.SERVER_UUID + "=?"; return query(new QueryStatement>(sql, 100) { @Override public void prepare(PreparedStatement statement) throws SQLException { @@ -174,6 +178,7 @@ public class WorldTable extends Table { public enum Col implements Column { ID("id"), + @Deprecated SERVER_ID("server_id"), SERVER_UUID("server_uuid"), NAME("world_name"); diff --git a/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/tables/WorldTimesTable.java b/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/tables/WorldTimesTable.java index b8c4d1cb1..f12ef6344 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/tables/WorldTimesTable.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/system/database/databases/sql/tables/WorldTimesTable.java @@ -41,7 +41,13 @@ import java.util.stream.Collectors; *

* Table Name: plan_world_times *

- * For contained columns {@see Col} + * For contained columns {@link Col} + *

+ * Patches related to this table: + * {@link com.djrapitops.plan.system.database.databases.sql.patches.Version10Patch} + * {@link com.djrapitops.plan.system.database.databases.sql.patches.WorldTimesSeverIDPatch} + * {@link com.djrapitops.plan.system.database.databases.sql.patches.WorldsServerIDPatch} + * {@link com.djrapitops.plan.system.database.databases.sql.patches.WorldTimesOptimizationPatch} * * @author Rsl1122 */