Player Peaks & Single line placeholders to analysis page

This commit is contained in:
Rsl1122 2017-09-01 18:15:16 +03:00
parent 1d4f3237b8
commit d5df4381d4
6 changed files with 151 additions and 35 deletions

View File

@ -43,14 +43,14 @@ public class AnalysisData extends RawData {
private Map<String, Serializable> additionalDataReplaceMap;
private String playersTable;
public AnalysisData(Map<String, Integer> commandUsage, List<TPS> tpsData) {
commandUsagePart = new CommandUsagePart(commandUsage);
public AnalysisData() {
commandUsagePart = new CommandUsagePart();
geolocationPart = new GeolocationPart();
joinInfoPart = new JoinInfoPart();
playerCountPart = new PlayerCountPart();
playtimePart = new PlaytimePart();
killPart = new KillPart();
tpsPart = new TPSPart(tpsData);
tpsPart = new TPSPart();
activityPart = new ActivityPart(joinInfoPart, tpsPart);
worldPart = new WorldPart();
}

View File

@ -8,6 +8,7 @@ package main.java.com.djrapitops.plan.data.analysis;
import main.java.com.djrapitops.plan.utilities.html.HtmlUtils;
import main.java.com.djrapitops.plan.utilities.html.tables.CommandUseTableCreator;
import java.util.HashMap;
import java.util.Map;
/**
@ -25,10 +26,10 @@ import java.util.Map;
*/
public class CommandUsagePart extends RawData {
private final Map<String, Integer> commandUsage;
private Map<String, Integer> commandUsage;
public CommandUsagePart(Map<String, Integer> commandUsage) {
this.commandUsage = commandUsage;
public CommandUsagePart() {
this.commandUsage = new HashMap<>();
}
@Override
@ -39,6 +40,14 @@ public class CommandUsagePart extends RawData {
addValue("tableBodyCommands", HtmlUtils.removeXSS(commandUsageTable));
}
public void setCommandUsage(Map<String, Integer> commandUsage) {
this.commandUsage = commandUsage;
}
public void addCommands(Map<String, Integer> commandUsage) {
this.commandUsage.putAll(commandUsage);
}
public int getUniqueCommands() {
return commandUsage.keySet().size();
}

View File

@ -54,6 +54,8 @@ public class JoinInfoPart extends RawData {
newPlayers();
uniquePlayers();
uniquePlayersPerDay();
addValue("sessionCount", getAllSessions().size());
}
private void uniquePlayers() {
@ -117,7 +119,9 @@ public class JoinInfoPart extends RawData {
}
public List<Session> getAllSessions() {
return MiscUtils.flatMap(sessions.values());
List<Session> sessions = MiscUtils.flatMap(this.sessions.values());
sessions.addAll(activeSessions.values());
return sessions;
}
public void addRegistered(UUID uuid, long registerDate) {

View File

@ -1,6 +1,7 @@
package main.java.com.djrapitops.plan.data.analysis;
import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.utilities.Verify;
import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.data.TPS;
import main.java.com.djrapitops.plan.systems.webserver.theme.Colors;
@ -12,6 +13,8 @@ import main.java.com.djrapitops.plan.utilities.html.graphs.RamGraphCreator;
import main.java.com.djrapitops.plan.utilities.html.graphs.TPSGraphCreator;
import main.java.com.djrapitops.plan.utilities.html.graphs.WorldLoadGraphCreator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
@ -49,9 +52,11 @@ import java.util.List;
public class TPSPart extends RawData {
private final List<TPS> tpsData;
private TPS allTimePeak;
private TPS lastPeak;
public TPSPart(List<TPS> tpsData) {
this.tpsData = tpsData;
public TPSPart() {
this.tpsData = new ArrayList<>();
}
@Override
@ -60,18 +65,34 @@ public class TPSPart extends RawData {
List<TPS> week = TPSGraphCreator.filterTPS(tpsData, now - TimeAmount.WEEK.ms());
List<TPS> day = TPSGraphCreator.filterTPS(tpsData, now - TimeAmount.DAY.ms());
addValue("tpsHighColor", Colors.TPS_HIGH.getColor());
addValue("tpsMediumColor", Colors.TPS_MED.getColor());
addValue("tpsLowColor", Colors.TPS_LOW.getColor());
addValue("tpsMedium", Settings.THEME_GRAPH_TPS_THRESHOLD_MED.getNumber());
addValue("tpsHigh", Settings.THEME_GRAPH_TPS_THRESHOLD_HIGH.getNumber());
tpsGraphOptions();
addValue("tpsSeries", TPSGraphCreator.buildSeriesDataString(tpsData));
addValue("cpuSeries", CPUGraphCreator.buildSeriesDataString(tpsData));
addValue("ramSeries", RamGraphCreator.buildSeriesDataString(tpsData));
addValue("entitySeries", WorldLoadGraphCreator.buildSeriesDataStringEntities(tpsData));
addValue("chunkSeries", WorldLoadGraphCreator.buildSeriesDataStringChunks(tpsData));
chartData();
averages(week, day);
peaks();
}
private void peaks() {
if (lastPeak != null) {
addValue("lastPeakTime", FormatUtils.formatTimeStampYear(lastPeak.getDate()));
addValue("playersLastPeak", lastPeak.getPlayers());
} else {
addValue("lastPeakTime", "No Data");
addValue("playersLastPeak", "-");
}
if (allTimePeak != null) {
addValue("bestPeakTime", FormatUtils.formatTimeStampYear(allTimePeak.getDate()));
addValue("bestPeakTime", allTimePeak.getPlayers());
} else {
addValue("bestPeakTime", "No Data");
addValue("bestPeakTime", "-");
}
}
private void averages(List<TPS> week, List<TPS> day) {
double averageTPSWeek = MathUtils.averageDouble(week.stream().map(TPS::getTicksPerSecond));
double averageTPSDay = MathUtils.averageDouble(day.stream().map(TPS::getTicksPerSecond));
@ -103,7 +124,35 @@ public class TPSPart extends RawData {
addValue("chunkAverageDay", FormatUtils.cutDecimals(averageChunksLoadedDay));
}
private void chartData() {
addValue("tpsSeries", TPSGraphCreator.buildSeriesDataString(tpsData));
addValue("cpuSeries", CPUGraphCreator.buildSeriesDataString(tpsData));
addValue("ramSeries", RamGraphCreator.buildSeriesDataString(tpsData));
addValue("entitySeries", WorldLoadGraphCreator.buildSeriesDataStringEntities(tpsData));
addValue("chunkSeries", WorldLoadGraphCreator.buildSeriesDataStringChunks(tpsData));
}
private void tpsGraphOptions() {
addValue("tpsHighColor", Colors.TPS_HIGH.getColor());
addValue("tpsMediumColor", Colors.TPS_MED.getColor());
addValue("tpsLowColor", Colors.TPS_LOW.getColor());
addValue("tpsMedium", Settings.THEME_GRAPH_TPS_THRESHOLD_MED.getNumber());
addValue("tpsHigh", Settings.THEME_GRAPH_TPS_THRESHOLD_HIGH.getNumber());
}
public List<TPS> getTpsData() {
return tpsData;
}
public void addTpsData(Collection<TPS> data) {
tpsData.addAll(Verify.nullCheck(data));
}
public void setAllTimePeak(TPS allTimePeak) {
this.allTimePeak = allTimePeak;
}
public void setLastPeak(TPS lastPeak) {
this.lastPeak = lastPeak;
}
}

View File

@ -16,6 +16,8 @@ import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
/**
* Class representing database table plan_tps
@ -73,7 +75,7 @@ public class TPSTable extends Table {
statement = prepareStatement(Select.all(tableName)
.where(columnServerID + "=" + serverTable.statementSelectServerID)
.toString());
statement.setFetchSize(5000);
statement.setFetchSize(10000);
statement.setString(1, Plan.getServerUUID().toString());
set = statement.executeQuery();
while (set.next()) {
@ -132,7 +134,10 @@ public class TPSTable extends Table {
public void clean() throws SQLException {
PreparedStatement statement = null;
try {
statement = prepareStatement("DELETE FROM " + tableName + " WHERE (" + columnDate + "<?)");
statement = prepareStatement("DELETE FROM " + tableName +
" WHERE (" + columnDate + "<?)" +
" AND (" + columnPlayers + ")" +
" != MAX(" + columnPlayers + ")");
// More than 2 Months ago.
long fiveWeeks = TimeAmount.MONTH.ms() * 2L;
statement.setLong(1, MiscUtils.getTime() - fiveWeeks);
@ -143,4 +148,45 @@ public class TPSTable extends Table {
close(statement);
}
}
public Optional<TPS> getAllTimePeak(UUID serverUUID) throws SQLException {
return getPeakPlayerCount(serverUUID, 0);
}
public Optional<TPS> getAllTimePeak() throws SQLException {
return getPeakPlayerCount(0);
}
public Optional<TPS> getPeakPlayerCount(long afterDate) throws SQLException {
return getPeakPlayerCount(Plan.getServerUUID(), afterDate);
}
public Optional<TPS> getPeakPlayerCount(UUID serverUUID, long afterDate) throws SQLException {
PreparedStatement statement = null;
ResultSet set = null;
try {
statement = prepareStatement(Select.all(tableName)
.where(columnServerID + "=" + serverTable.statementSelectServerID)
.and(columnPlayers + "= MAX(" + columnPlayers + ")")
.and(columnDate + ">= ?")
.toString());
statement.setString(1, serverUUID.toString());
statement.setLong(2, afterDate);
set = statement.executeQuery();
if (set.next()) {
long date = set.getLong(columnDate);
double tps = set.getDouble(columnTPS);
int players = set.getInt(columnPlayers);
double cpuUsage = set.getDouble(columnCPUUsage);
long ramUsage = set.getLong(columnRAMUsage);
int entities = set.getInt(columnEntities);
int chunksLoaded = set.getInt(columnChunksLoaded);
return Optional.of(new TPS(date, tps, players, cpuUsage, ramUsage, entities, chunksLoaded));
}
return Optional.empty();
} finally {
endTransaction(statement);
close(set, statement);
}
}
}

View File

@ -15,6 +15,7 @@ import main.java.com.djrapitops.plan.data.additional.PluginData;
import main.java.com.djrapitops.plan.data.analysis.*;
import main.java.com.djrapitops.plan.data.time.WorldTimes;
import main.java.com.djrapitops.plan.database.Database;
import main.java.com.djrapitops.plan.database.tables.TPSTable;
import main.java.com.djrapitops.plan.locale.Locale;
import main.java.com.djrapitops.plan.locale.Msg;
import main.java.com.djrapitops.plan.systems.cache.DataCache;
@ -32,7 +33,10 @@ import org.apache.commons.lang3.StringUtils;
import java.io.Serializable;
import java.sql.SQLException;
import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.function.Function;
import java.util.stream.Collectors;
@ -90,33 +94,24 @@ public class Analysis {
Benchmark.start("Fetch Phase");
Log.debug("Database", "Analysis Fetch");
Log.debug("Analysis", "Analysis Fetch Phase");
//TODO Rewrite FETCH
List<TPS> tpsData = new ArrayList<>();
try {
tpsData = db.getTpsTable().getTPSData();
Log.debug("Analysis", "TPS Data Size: " + tpsData.size());
} catch (Exception ex) {
Log.toLog(this.getClass().getName(), ex);
}
return analyzeData(tpsData, infoManager, db);
return analyzeData(infoManager, db);
}
/**
* @param tpsData
* @param infoManager InformationManager of the plugin.
* @return
*/
public boolean analyzeData(List<TPS> tpsData, InformationManager infoManager, Database db) {
public boolean analyzeData(InformationManager infoManager, Database db) {
try {
// rawData.sort(new UserInfoLastPlayedComparator());
// List<UUID> uuids = rawData.stream().map(UserInfo::getUuid).collect(Collectors.toList());
Benchmark.start("Create Empty dataset");
DataCache dataCache = plugin.getDataCache();
Map<String, Integer> commandUse = plugin.getDB().getCommandUse();
AnalysisData analysisData = new AnalysisData(commandUse, tpsData);
AnalysisData analysisData = new AnalysisData();
List<PluginData> thirdPartyPlugins = plugin.getHookHandler().getAdditionalDataSources();
analysisData.setPluginsTabLayout(HtmlStructure.createAnalysisPluginsTabLayout(thirdPartyPlugins));
analysisData.setPlanVersion(plugin.getVersion());
@ -242,16 +237,29 @@ public class Analysis {
private void fillDataset(AnalysisData analysisData, Database db) {
ActivityPart activity = analysisData.getActivityPart();
CommandUsagePart commandUsagePart = analysisData.getCommandUsagePart();
GeolocationPart geolocPart = analysisData.getGeolocationPart();
JoinInfoPart joinInfo = analysisData.getJoinInfoPart();
PlayerCountPart playerCount = analysisData.getPlayerCountPart();
PlaytimePart playtime = analysisData.getPlaytimePart();
TPSPart tpsPart = analysisData.getTpsPart();
WorldPart worldPart = analysisData.getWorldPart();
long now = MiscUtils.getTime();
Benchmark.start("Fetch Phase");
try {
Map<String, Integer> commandUse = plugin.getDB().getCommandUse();
commandUsagePart.setCommandUsage(commandUse);
TPSTable tpsTable = db.getTpsTable();
List<TPS> tpsData = tpsTable.getTPSData();
tpsTable.getAllTimePeak().ifPresent(tpsPart::setAllTimePeak);
tpsTable.getPeakPlayerCount(now - (TimeAmount.DAY.ms() * 2)).ifPresent(tpsPart::setLastPeak);
tpsPart.addTpsData(tpsData);
Log.debug("Analysis", "TPS Data Size: " + tpsData.size());
List<UserInfo> userInfo = db.getUserInfoTable().getAllUserInfo();
Map<UUID, UserInfo> mappedUserInfo = userInfo.stream().collect(Collectors.toMap(UserInfo::getUuid, Function.identity()));
Map<UUID, Long> lastSeen = db.getSessionsTable().getLastSeenForAllPlayers();