Refactored UserInfoTable

This commit is contained in:
Rsl1122 2017-10-06 17:10:41 +03:00
parent c8b389643a
commit e1ec3532c5

View File

@ -9,12 +9,14 @@ import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.api.exceptions.DBCreateTableException; import main.java.com.djrapitops.plan.api.exceptions.DBCreateTableException;
import main.java.com.djrapitops.plan.data.UserInfo; import main.java.com.djrapitops.plan.data.UserInfo;
import main.java.com.djrapitops.plan.database.databases.SQLDB; import main.java.com.djrapitops.plan.database.databases.SQLDB;
import main.java.com.djrapitops.plan.database.processing.ExecStatement;
import main.java.com.djrapitops.plan.database.processing.QueryAllStatement;
import main.java.com.djrapitops.plan.database.processing.QueryStatement;
import main.java.com.djrapitops.plan.database.sql.Select; import main.java.com.djrapitops.plan.database.sql.Select;
import main.java.com.djrapitops.plan.database.sql.Sql; import main.java.com.djrapitops.plan.database.sql.Sql;
import main.java.com.djrapitops.plan.database.sql.TableSqlParser; import main.java.com.djrapitops.plan.database.sql.TableSqlParser;
import main.java.com.djrapitops.plan.database.sql.Update; import main.java.com.djrapitops.plan.database.sql.Update;
import java.sql.Connection;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
@ -59,57 +61,56 @@ public class UserInfoTable extends UserIDTable {
usersTable.registerUser(uuid, registered, "Waiting for Update.."); usersTable.registerUser(uuid, registered, "Waiting for Update..");
} }
PreparedStatement statement = null; String sql = "INSERT INTO " + tableName + " (" +
try (Connection connection = getConnection()) { columnUserID + ", " +
statement = connection.prepareStatement("INSERT INTO " + tableName + " (" + columnRegistered + ", " +
columnUserID + ", " + columnServerID +
columnRegistered + ", " + ") VALUES (" +
columnServerID + usersTable.statementSelectID + ", " +
") VALUES (" + "?, " +
usersTable.statementSelectID + ", " + serverTable.statementSelectServerID + ")";
"?, " +
serverTable.statementSelectServerID + ")");
statement.setString(1, uuid.toString());
statement.setLong(2, registered);
statement.setString(3, Plan.getServerUUID().toString());
statement.execute(); execute(new ExecStatement(sql) {
commit(connection); @Override
} finally { public void prepare(PreparedStatement statement) throws SQLException {
close(statement); statement.setString(1, uuid.toString());
} statement.setLong(2, registered);
statement.setString(3, Plan.getServerUUID().toString());
}
});
} }
public boolean isRegistered(UUID uuid) throws SQLException { public boolean isRegistered(UUID uuid) throws SQLException {
PreparedStatement statement = null; String sql = Select.from(tableName, "COUNT(" + columnUserID + ") as c")
ResultSet set = null; .where(columnUserID + "=" + usersTable.statementSelectID)
try (Connection connection = getConnection()) { .toString();
statement = connection.prepareStatement(Select.from(tableName, "COUNT(" + columnUserID + ") as c")
.where(columnUserID + "=" + usersTable.statementSelectID) return query(new QueryStatement<Boolean>(sql) {
.toString()); @Override
statement.setString(1, uuid.toString()); public void prepare(PreparedStatement statement) throws SQLException {
set = statement.executeQuery(); statement.setString(1, uuid.toString());
return set.next() && set.getInt("c") >= 1; }
} finally {
close(set, statement); @Override
} public Boolean processResults(ResultSet set) throws SQLException {
return set.next() && set.getInt("c") >= 1;
}
});
} }
public void updateOpAndBanStatus(UUID uuid, boolean opped, boolean banned) throws SQLException { public void updateOpAndBanStatus(UUID uuid, boolean opped, boolean banned) throws SQLException {
PreparedStatement statement = null; String sql = Update.values(tableName, columnOP, columnBanned)
try (Connection connection = getConnection()) { .where(columnUserID + "=" + usersTable.statementSelectID)
statement = connection.prepareStatement(Update.values(tableName, columnOP, columnBanned) .toString();
.where(columnUserID + "=" + usersTable.statementSelectID)
.toString());
statement.setBoolean(1, opped);
statement.setBoolean(2, banned);
statement.setString(3, uuid.toString());
statement.execute(); execute(new ExecStatement(sql) {
commit(connection); @Override
} finally { public void prepare(PreparedStatement statement) throws SQLException {
close(statement); statement.setBoolean(1, opped);
} statement.setBoolean(2, banned);
statement.setString(3, uuid.toString());
}
});
} }
public UserInfo getUserInfo(UUID uuid) throws SQLException { public UserInfo getUserInfo(UUID uuid) throws SQLException {
@ -117,36 +118,37 @@ public class UserInfoTable extends UserIDTable {
} }
public UserInfo getUserInfo(UUID uuid, UUID serverUUID) throws SQLException { public UserInfo getUserInfo(UUID uuid, UUID serverUUID) throws SQLException {
PreparedStatement statement = null; String usersIDColumn = usersTable + "." + usersTable.getColumnID();
ResultSet set = null; String usersNameColumn = usersTable + "." + usersTable.getColumnName() + " as name";
try (Connection connection = getConnection()) { String sql = "SELECT " +
String usersIDColumn = usersTable + "." + usersTable.getColumnID(); tableName + "." + columnRegistered + ", " +
String usersNameColumn = usersTable + "." + usersTable.getColumnName() + " as name"; columnOP + ", " +
statement = connection.prepareStatement("SELECT " + columnBanned + ", " +
tableName + "." + columnRegistered + ", " + usersNameColumn +
columnOP + ", " + " FROM " + tableName +
columnBanned + ", " + " JOIN " + usersTable + " on " + usersIDColumn + "=" + columnUserID +
usersNameColumn + " WHERE " + columnUserID + "=" + usersTable.statementSelectID +
" FROM " + tableName + " AND " + columnServerID + "=" + serverTable.statementSelectServerID;
" JOIN " + usersTable + " on " + usersIDColumn + "=" + columnUserID +
" WHERE " + columnUserID + "=" + usersTable.statementSelectID + return query(new QueryStatement<UserInfo>(sql) {
" AND " + columnServerID + "=" + serverTable.statementSelectServerID @Override
); public void prepare(PreparedStatement statement) throws SQLException {
statement.setFetchSize(20000); statement.setString(1, uuid.toString());
statement.setString(1, uuid.toString()); statement.setString(2, serverUUID.toString());
statement.setString(2, serverUUID.toString());
set = statement.executeQuery();
if (set.next()) {
long registered = set.getLong(columnRegistered);
boolean opped = set.getBoolean(columnOP);
boolean banned = set.getBoolean(columnBanned);
String name = set.getString("name");
return new UserInfo(uuid, name, registered, opped, banned);
} }
return null;
} finally { @Override
close(set, statement); public UserInfo processResults(ResultSet set) throws SQLException {
} if (set.next()) {
long registered = set.getLong(columnRegistered);
boolean opped = set.getBoolean(columnOP);
boolean banned = set.getBoolean(columnBanned);
String name = set.getString("name");
return new UserInfo(uuid, name, registered, opped, banned);
}
return null;
}
});
} }
/** /**
@ -159,152 +161,145 @@ public class UserInfoTable extends UserIDTable {
} }
public List<UserInfo> getServerUserInfo(UUID serverUUID) throws SQLException { public List<UserInfo> getServerUserInfo(UUID serverUUID) throws SQLException {
PreparedStatement statement = null; String usersIDColumn = usersTable + "." + usersTable.getColumnID();
ResultSet set = null; String usersUUIDColumn = usersTable + "." + usersTable.getColumnUUID() + " as uuid";
try (Connection connection = getConnection()) { String usersNameColumn = usersTable + "." + usersTable.getColumnName() + " as name";
List<UserInfo> userInfo = new ArrayList<>(); String sql = "SELECT " +
String usersIDColumn = usersTable + "." + usersTable.getColumnID(); tableName + "." + columnRegistered + ", " +
String usersUUIDColumn = usersTable + "." + usersTable.getColumnUUID() + " as uuid"; columnOP + ", " +
String usersNameColumn = usersTable + "." + usersTable.getColumnName() + " as name"; columnBanned + ", " +
statement = connection.prepareStatement("SELECT " + usersNameColumn + ", " +
tableName + "." + columnRegistered + ", " + usersUUIDColumn +
columnOP + ", " + " FROM " + tableName +
columnBanned + ", " + " JOIN " + usersTable + " on " + usersIDColumn + "=" + columnUserID +
usersNameColumn + ", " + " WHERE " + columnServerID + "=" + serverTable.statementSelectServerID;
usersUUIDColumn +
" FROM " + tableName + return query(new QueryStatement<List<UserInfo>>(sql, 20000) {
" JOIN " + usersTable + " on " + usersIDColumn + "=" + columnUserID + @Override
" WHERE " + columnServerID + "=" + serverTable.statementSelectServerID public void prepare(PreparedStatement statement) throws SQLException {
); statement.setString(1, serverUUID.toString());
statement.setFetchSize(20000);
statement.setString(1, serverUUID.toString());
set = statement.executeQuery();
while (set.next()) {
long registered = set.getLong(columnRegistered);
boolean opped = set.getBoolean(columnOP);
boolean banned = set.getBoolean(columnBanned);
String name = set.getString("name");
UUID uuid = UUID.fromString(set.getString("uuid"));
UserInfo info = new UserInfo(uuid, name, registered, opped, banned);
if (!userInfo.contains(info)) {
userInfo.add(info);
}
} }
return userInfo;
} finally { @Override
close(set, statement); public List<UserInfo> processResults(ResultSet set) throws SQLException {
} List<UserInfo> userInfo = new ArrayList<>();
while (set.next()) {
long registered = set.getLong(columnRegistered);
boolean opped = set.getBoolean(columnOP);
boolean banned = set.getBoolean(columnBanned);
String name = set.getString("name");
UUID uuid = UUID.fromString(set.getString("uuid"));
UserInfo info = new UserInfo(uuid, name, registered, opped, banned);
if (!userInfo.contains(info)) {
userInfo.add(info);
}
}
return userInfo;
}
});
} }
public Map<UUID, List<UserInfo>> getAllUserInfo() throws SQLException { public Map<UUID, List<UserInfo>> getAllUserInfo() throws SQLException {
PreparedStatement statement = null; String usersIDColumn = usersTable + "." + usersTable.getColumnID();
ResultSet set = null; String usersUUIDColumn = usersTable + "." + usersTable.getColumnUUID() + " as uuid";
try (Connection connection = getConnection()) { String serverIDColumn = serverTable + "." + serverTable.getColumnID();
String usersIDColumn = usersTable + "." + usersTable.getColumnID(); String serverUUIDColumn = serverTable + "." + serverTable.getColumnUUID() + " as s_uuid";
String usersUUIDColumn = usersTable + "." + usersTable.getColumnUUID() + " as uuid"; String sql = "SELECT " +
String serverIDColumn = serverTable + "." + serverTable.getColumnID(); tableName + "." + columnRegistered + ", " +
String serverUUIDColumn = serverTable + "." + serverTable.getColumnUUID() + " as s_uuid"; columnBanned + ", " +
statement = connection.prepareStatement("SELECT " + columnOP + ", " +
tableName + "." + columnRegistered + ", " + usersUUIDColumn + ", " +
columnBanned + ", " + serverUUIDColumn +
columnOP + ", " + " FROM " + tableName +
usersUUIDColumn + ", " + " JOIN " + usersTable + " on " + usersIDColumn + "=" + columnUserID +
serverUUIDColumn + " JOIN " + serverTable + " on " + serverIDColumn + "=" + columnServerID;
" FROM " + tableName +
" JOIN " + usersTable + " on " + usersIDColumn + "=" + columnUserID +
" JOIN " + serverTable + " on " + serverIDColumn + "=" + columnServerID
);
statement.setFetchSize(20000);
set = statement.executeQuery();
Map<UUID, List<UserInfo>> serverMap = new HashMap<>();
while (set.next()) {
UUID serverUUID = UUID.fromString(set.getString("s_uuid"));
UUID uuid = UUID.fromString(set.getString("uuid"));
List<UserInfo> userInfos = serverMap.getOrDefault(serverUUID, new ArrayList<>()); return query(new QueryAllStatement<Map<UUID, List<UserInfo>>>(sql, 50000) {
@Override
public Map<UUID, List<UserInfo>> processResults(ResultSet set) throws SQLException {
Map<UUID, List<UserInfo>> serverMap = new HashMap<>();
while (set.next()) {
UUID serverUUID = UUID.fromString(set.getString("s_uuid"));
UUID uuid = UUID.fromString(set.getString("uuid"));
long registered = set.getLong(columnRegistered); List<UserInfo> userInfos = serverMap.getOrDefault(serverUUID, new ArrayList<>());
boolean banned = set.getBoolean(columnBanned);
boolean op = set.getBoolean(columnOP);
userInfos.add(new UserInfo(uuid, "", registered, op, banned)); long registered = set.getLong(columnRegistered);
boolean banned = set.getBoolean(columnBanned);
boolean op = set.getBoolean(columnOP);
serverMap.put(serverUUID, userInfos); userInfos.add(new UserInfo(uuid, "", registered, op, banned));
serverMap.put(serverUUID, userInfos);
}
return serverMap;
} }
return serverMap; });
} finally {
close(set, statement);
}
} }
public void insertUserInfo(Map<UUID, List<UserInfo>> allUserInfos) throws SQLException { public void insertUserInfo(Map<UUID, List<UserInfo>> allUserInfos) throws SQLException {
if (Verify.isEmpty(allUserInfos)) { if (Verify.isEmpty(allUserInfos)) {
return; return;
} }
PreparedStatement statement = null;
try (Connection connection = getConnection()) {
statement = connection.prepareStatement("INSERT INTO " + tableName + " (" +
columnUserID + ", " +
columnRegistered + ", " +
columnServerID + ", " +
columnBanned + ", " +
columnOP +
") VALUES (" +
usersTable.statementSelectID + ", " +
"?, " +
serverTable.statementSelectServerID + ", ?, ?)");
// Every Server String sql = "INSERT INTO " + tableName + " (" +
for (Map.Entry<UUID, List<UserInfo>> entry : allUserInfos.entrySet()) { columnUserID + ", " +
UUID serverUUID = entry.getKey(); columnRegistered + ", " +
// Every User columnServerID + ", " +
for (UserInfo user : entry.getValue()) { columnBanned + ", " +
statement.setString(1, user.getUuid().toString()); columnOP +
statement.setLong(2, user.getRegistered()); ") VALUES (" +
statement.setString(3, serverUUID.toString()); usersTable.statementSelectID + ", " +
statement.setBoolean(4, user.isBanned()); "?, " +
statement.setBoolean(5, user.isOpped()); serverTable.statementSelectServerID + ", ?, ?)";
statement.addBatch();
executeBatch(new ExecStatement(sql) {
@Override
public void prepare(PreparedStatement statement) throws SQLException {
// Every Server
for (Map.Entry<UUID, List<UserInfo>> entry : allUserInfos.entrySet()) {
UUID serverUUID = entry.getKey();
// Every User
for (UserInfo user : entry.getValue()) {
statement.setString(1, user.getUuid().toString());
statement.setLong(2, user.getRegistered());
statement.setString(3, serverUUID.toString());
statement.setBoolean(4, user.isBanned());
statement.setBoolean(5, user.isOpped());
statement.addBatch();
}
} }
} }
});
statement.executeBatch();
commit(connection);
} finally {
close(statement);
}
} }
public Map<UUID, Set<UUID>> getSavedUUIDs() throws SQLException { public Map<UUID, Set<UUID>> getSavedUUIDs() throws SQLException {
PreparedStatement statement = null; String usersIDColumn = usersTable + "." + usersTable.getColumnID();
ResultSet set = null; String usersUUIDColumn = usersTable + "." + usersTable.getColumnUUID() + " as uuid";
try (Connection connection = getConnection()) { String serverIDColumn = serverTable + "." + serverTable.getColumnID();
String usersIDColumn = usersTable + "." + usersTable.getColumnID(); String serverUUIDColumn = serverTable + "." + serverTable.getColumnUUID() + " as s_uuid";
String usersUUIDColumn = usersTable + "." + usersTable.getColumnUUID() + " as uuid"; String sql = "SELECT " +
String serverIDColumn = serverTable + "." + serverTable.getColumnID(); usersUUIDColumn + ", " +
String serverUUIDColumn = serverTable + "." + serverTable.getColumnUUID() + " as s_uuid"; serverUUIDColumn +
statement = connection.prepareStatement("SELECT " + " FROM " + tableName +
usersUUIDColumn + ", " + " JOIN " + usersTable + " on " + usersIDColumn + "=" + columnUserID +
serverUUIDColumn + " JOIN " + serverTable + " on " + serverIDColumn + "=" + columnServerID;
" FROM " + tableName +
" JOIN " + usersTable + " on " + usersIDColumn + "=" + columnUserID +
" JOIN " + serverTable + " on " + serverIDColumn + "=" + columnServerID
);
statement.setFetchSize(5000);
set = statement.executeQuery();
Map<UUID, Set<UUID>> serverMap = new HashMap<>();
while (set.next()) {
UUID serverUUID = UUID.fromString(set.getString("s_uuid"));
UUID uuid = UUID.fromString(set.getString("uuid"));
Set<UUID> uuids = serverMap.getOrDefault(serverUUID, new HashSet<>()); return query(new QueryAllStatement<Map<UUID, Set<UUID>>>(sql, 50000) {
uuids.add(uuid); @Override
public Map<UUID, Set<UUID>> processResults(ResultSet set) throws SQLException {
Map<UUID, Set<UUID>> serverMap = new HashMap<>();
while (set.next()) {
UUID serverUUID = UUID.fromString(set.getString("s_uuid"));
UUID uuid = UUID.fromString(set.getString("uuid"));
serverMap.put(serverUUID, uuids); Set<UUID> uuids = serverMap.getOrDefault(serverUUID, new HashSet<>());
uuids.add(uuid);
serverMap.put(serverUUID, uuids);
}
return serverMap;
} }
return serverMap; });
} finally {
close(set, statement);
}
} }
} }