/*
* 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.storage.database.queries.objects;
import com.djrapitops.plan.delivery.domain.DateObj;
import com.djrapitops.plan.gathering.domain.TPS;
import com.djrapitops.plan.gathering.domain.builders.TPSBuilder;
import com.djrapitops.plan.identification.ServerUUID;
import com.djrapitops.plan.storage.database.queries.Query;
import com.djrapitops.plan.storage.database.queries.QueryStatement;
import com.djrapitops.plan.storage.database.sql.tables.ServerTable;
import com.djrapitops.plan.utilities.dev.Benchmark;
import com.djrapitops.plan.utilities.java.Lists;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.*;
import java.util.concurrent.TimeUnit;
import static com.djrapitops.plan.storage.database.sql.building.Sql.*;
import static com.djrapitops.plan.storage.database.sql.tables.TPSTable.*;
/**
* Queries for {@link com.djrapitops.plan.gathering.domain.TPS} objects.
*
* @author AuroraLS3
*/
public class TPSQueries {
private TPSQueries() {
/* Static method class */
}
public static Query> fetchTPSDataOfServerInResolution(long after, long before, long resolution, ServerUUID serverUUID) {
return db -> {
String sql = SELECT +
min("t." + DATE) + " as " + DATE + ',' +
min("t." + TPS) + " as " + TPS + ',' +
max("t." + PLAYERS_ONLINE) + " as " + PLAYERS_ONLINE + ',' +
max("t." + RAM_USAGE) + " as " + RAM_USAGE + ',' +
max("t." + CPU_USAGE) + " as " + CPU_USAGE + ',' +
max("t." + ENTITIES) + " as " + ENTITIES + ',' +
max("t." + CHUNKS) + " as " + CHUNKS + ',' +
max("t." + FREE_DISK) + " as " + FREE_DISK +
FROM + TABLE_NAME + " t" +
WHERE + SERVER_ID + "=" + ServerTable.SELECT_SERVER_ID +
AND + DATE + ">=?" +
AND + DATE + "" +
GROUP_BY + floor(DATE + "/?") +
ORDER_BY + DATE;
return db.query(new QueryStatement>(sql, 50000) {
@Override
public void prepare(PreparedStatement statement) throws SQLException {
statement.setString(1, serverUUID.toString());
statement.setLong(2, after);
statement.setLong(3, before);
statement.setLong(4, resolution);
}
@Override
public List processResults(ResultSet set) throws SQLException {
List data = new ArrayList<>();
while (set.next()) {
data.add(extractTPS(set));
}
return data;
}
});
};
}
public static TPS extractTPS(ResultSet set) throws SQLException {
return TPSBuilder.get()
.date(set.getLong(DATE))
.tps(set.getDouble(TPS))
.playersOnline(set.getInt(PLAYERS_ONLINE))
.usedCPU(set.getDouble(CPU_USAGE))
.usedMemory(set.getLong(RAM_USAGE))
.entities(set.getInt(ENTITIES))
.chunksLoaded(set.getInt(CHUNKS))
.freeDiskSpace(set.getLong(FREE_DISK))
.toTPS();
}
public static Query> fetchTPSDataOfServer(long after, long before, ServerUUID serverUUID) {
String sql = SELECT + "*" + FROM + TABLE_NAME +
WHERE + SERVER_ID + "=" + ServerTable.SELECT_SERVER_ID +
AND + DATE + ">=?" +
AND + DATE + "<=?" +
ORDER_BY + DATE;
return new QueryStatement<>(sql, 50000) {
@Override
public void prepare(PreparedStatement statement) throws SQLException {
statement.setString(1, serverUUID.toString());
statement.setLong(2, after);
statement.setLong(3, before);
}
@Override
public List processResults(ResultSet set) throws SQLException {
List data = new ArrayList<>();
while (set.next()) {
TPS tps = extractTPS(set);
data.add(tps);
}
return data;
}
};
}
public static Query>> fetchViewPreviewGraphData(ServerUUID serverUUID) {
String sql = SELECT + min(DATE) + " as " + DATE + ',' +
max(PLAYERS_ONLINE) + " as " + PLAYERS_ONLINE +
FROM + TABLE_NAME +
WHERE + SERVER_ID + "=" + ServerTable.SELECT_SERVER_ID +
GROUP_BY + floor(DATE + "/?");
return new QueryStatement<>(sql) {
@Override
public void prepare(PreparedStatement statement) throws SQLException {
statement.setString(1, serverUUID.toString());
statement.setLong(2, TimeUnit.MINUTES.toMillis(15));
}
@Override
public List> processResults(ResultSet set) throws SQLException {
List> ofServer = new ArrayList<>();
while (set.next()) ofServer.add(new DateObj<>(set.getLong(DATE), set.getInt(PLAYERS_ONLINE)));
return ofServer;
}
};
}
public static Query>> fetchPlayersOnlineOfServer(long after, long before, ServerUUID serverUUID) {
String sql = SELECT + ServerTable.SERVER_UUID + ',' + DATE + ',' + PLAYERS_ONLINE +
FROM + TABLE_NAME +
INNER_JOIN + ServerTable.TABLE_NAME + " on " + ServerTable.TABLE_NAME + '.' + ServerTable.ID + '=' + SERVER_ID +
WHERE + ServerTable.SERVER_UUID + "=?" +
AND + DATE + "" +
AND + DATE + ">?";
return new QueryStatement<>(sql, 1000) {
@Override
public void prepare(PreparedStatement statement) throws SQLException {
statement.setString(1, serverUUID.toString());
statement.setLong(2, before);
statement.setLong(3, after);
}
@Override
public List> processResults(ResultSet set) throws SQLException {
List> ofServer = new ArrayList<>();
while (set.next()) {
ofServer.add(new DateObj<>(set.getLong(DATE), set.getInt(PLAYERS_ONLINE)));
}
return ofServer;
}
};
}
public static Query