Cleanup query generation

This commit is contained in:
Brokkonaut
2018-08-04 05:36:06 +02:00
parent 89d9da02e3
commit 83506e6cd9

View File

@@ -93,11 +93,65 @@ public final class QueryParams implements Cloneable {
return "LIMIT " + Config.hardLinesLimit; return "LIMIT " + Config.hardLinesLimit;
} }
public String getQuery() { public String getFrom() {
if (sum != SummarizationMode.NONE) {
throw new IllegalStateException("No implemented for summarization");
}
if (bct == BlockChangeType.CHAT) { if (bct == BlockChangeType.CHAT) {
String select = "SELECT "; String from = "FROM `lb-chat` ";
if (needPlayer || players.size() > 0) {
from += "INNER JOIN `lb-players` USING (playerid) ";
}
return from;
}
if (bct == BlockChangeType.KILLS) {
String from = "FROM `" + getTable() + "-kills` ";
if (needPlayer || needKiller || killers.size() > 0) {
from += "INNER JOIN `lb-players` as killers ON (killer=killers.playerid) ";
}
if (needPlayer || needVictim || victims.size() > 0) {
from += "INNER JOIN `lb-players` as victims ON (victim=victims.playerid) ";
}
return from;
}
String from = "FROM `" + getTable() + "-blocks` ";
if (needPlayer || players.size() > 0) {
from += "INNER JOIN `lb-players` USING (playerid) ";
}
if (!needCount && needData) {
from += "LEFT JOIN `" + getTable() + "-state` USING (id) ";
}
if (needChestAccess)
// If BlockChangeType is CHESTACCESS, we can use more efficient query
{
if (bct == BlockChangeType.CHESTACCESS) {
from += "RIGHT JOIN `" + getTable() + "-chestdata` USING (id) ";
} else {
from += "LEFT JOIN `" + getTable() + "-chestdata` USING (id) ";
}
}
return from;
}
public String getOrder() {
if (sum != SummarizationMode.NONE) {
throw new IllegalStateException("No implemented for summarization");
}
return "ORDER BY date " + order + ", id " + order + " ";
}
public String getFields() {
if (sum != SummarizationMode.NONE) {
throw new IllegalStateException("No implemented for summarization");
}
if (bct == BlockChangeType.CHAT) {
String select = "";
if (needCount) { if (needCount) {
select += "COUNT(*) AS count"; select += "COUNT(*) AS count ";
} else { } else {
if (needId) { if (needId) {
select += "id, "; select += "id, ";
@@ -111,105 +165,84 @@ public final class QueryParams implements Cloneable {
if (needMessage) { if (needMessage) {
select += "message, "; select += "message, ";
} }
select = select.substring(0, select.length() - 2); select = select.substring(0, select.length() - 2) + " ";
} }
String from = "FROM `lb-chat` "; return select;
if (needPlayer || players.size() > 0) {
from += "INNER JOIN `lb-players` USING (playerid) ";
}
return select + " " + from + getWhere() + "ORDER BY date " + order + ", id " + order + " " + getLimit();
} }
if (bct == BlockChangeType.KILLS) { if (bct == BlockChangeType.KILLS) {
if (sum == SummarizationMode.NONE) { String select = "";
String select = "SELECT ";
if (needCount) {
select += "COUNT(*) AS count";
} else {
if (needId) {
select += "id, ";
}
if (needDate) {
select += "date, ";
}
if (needPlayer || needKiller) {
select += "killers.playername as killer, ";
}
if (needPlayer || needVictim) {
select += "victims.playername as victim, ";
}
if (needWeapon) {
select += "weapon, ";
}
if (needCoords) {
select += "x, y, z, ";
}
select = select.substring(0, select.length() - 2);
}
String from = "FROM `" + getTable() + "-kills` ";
if (needPlayer || needKiller || killers.size() > 0) {
from += "INNER JOIN `lb-players` as killers ON (killer=killers.playerid) ";
}
if (needPlayer || needVictim || victims.size() > 0) {
from += "INNER JOIN `lb-players` as victims ON (victim=victims.playerid) ";
}
return select + " " + from + getWhere() + "ORDER BY date " + order + ", id " + order + " " + getLimit();
} else if (sum == SummarizationMode.PLAYERS) {
return "SELECT playername, UUID, SUM(kills) AS kills, SUM(killed) AS killed FROM ((SELECT killer AS playerid, count(*) AS kills, 0 as killed FROM `" + getTable() + "-kills` INNER JOIN `lb-players` as killers ON (killer=killers.playerid) INNER JOIN `lb-players` as victims ON (victim=victims.playerid) " + getWhere(BlockChangeType.KILLS) + "GROUP BY killer) UNION (SELECT victim AS playerid, 0 as kills, count(*) AS killed FROM `" + getTable() + "-kills` INNER JOIN `lb-players` as killers ON (killer=killers.playerid) INNER JOIN `lb-players` as victims ON (victim=victims.playerid) " + getWhere(BlockChangeType.KILLS) + "GROUP BY victim)) AS t INNER JOIN `lb-players` USING (playerid) GROUP BY playerid ORDER BY SUM(kills) + SUM(killed) " + order + " " + getLimit();
}
}
if (sum == SummarizationMode.NONE) {
String select = "SELECT ";
if (needCount) { if (needCount) {
select += "COUNT(*) AS count"; select += "COUNT(*) AS count ";
} else { } else {
if (needId) { if (needId) {
select += "`" + getTable() + "`-blocks.id, "; select += "id, ";
} }
if (needDate) { if (needDate) {
select += "date, "; select += "date, ";
} }
if (needType) { if (needPlayer || needKiller) {
select += "replaced, type, "; select += "killers.playername as killer, ";
} }
if (needData) { if (needPlayer || needVictim) {
select += "replacedData, typeData, "; select += "victims.playername as victim, ";
} }
if (needPlayer) { if (needWeapon) {
select += "playername, UUID, "; select += "weapon, ";
} }
if (needCoords) { if (needCoords) {
select += "x, y, z, "; select += "x, y, z, ";
} }
if (needData) { select = select.substring(0, select.length() - 2) + " ";
select += "replacedState, typeState, ";
}
if (needChestAccess) {
select += "item, itemremove, itemtype, ";
}
select = select.substring(0, select.length() - 2);
} }
String from = "FROM `" + getTable() + "-blocks` "; return select;
if (needPlayer || players.size() > 0) { }
from += "INNER JOIN `lb-players` USING (playerid) "; String select = "";
if (needCount) {
select += "COUNT(*) AS count ";
} else {
if (needId) {
select += "`" + getTable() + "`-blocks.id, ";
} }
if (!needCount && needData) { if (needDate) {
from += "LEFT JOIN `" + getTable() + "-state` USING (id) "; select += "date, ";
} }
if (needChestAccess) if (needType) {
// If BlockChangeType is CHESTACCESS, we can use more efficient query select += "replaced, type, ";
{
if (bct == BlockChangeType.CHESTACCESS) {
from += "RIGHT JOIN `" + getTable() + "-chestdata` USING (id) ";
} else {
from += "LEFT JOIN `" + getTable() + "-chestdata` USING (id) ";
}
} }
return select + " " + from + getWhere() + "ORDER BY date " + order + ", id " + order + " " + getLimit(); if (needData) {
} else if (sum == SummarizationMode.TYPES) { select += "replacedData, typeData, ";
}
if (needPlayer) {
select += "playername, UUID, ";
}
if (needCoords) {
select += "x, y, z, ";
}
if (needData) {
select += "replacedState, typeState, ";
}
if (needChestAccess) {
select += "item, itemremove, itemtype, ";
}
select = select.substring(0, select.length() - 2) + " ";
}
return select;
}
public String getQuery() {
if (sum == SummarizationMode.NONE) {
return "SELECT " + getFields() + getFrom() + getWhere() + getOrder() + getLimit();
}
if (bct == BlockChangeType.CHAT) {
throw new IllegalStateException("Invalid summarization for chat");
}
if (bct == BlockChangeType.KILLS) {
if (sum == SummarizationMode.PLAYERS) {
return "SELECT playername, UUID, SUM(kills) AS kills, SUM(killed) AS killed FROM ((SELECT killer AS playerid, count(*) AS kills, 0 as killed FROM `" + getTable() + "-kills` INNER JOIN `lb-players` as killers ON (killer=killers.playerid) INNER JOIN `lb-players` as victims ON (victim=victims.playerid) " + getWhere(BlockChangeType.KILLS) + "GROUP BY killer) UNION (SELECT victim AS playerid, 0 as kills, count(*) AS killed FROM `" + getTable() + "-kills` INNER JOIN `lb-players` as killers ON (killer=killers.playerid) INNER JOIN `lb-players` as victims ON (victim=victims.playerid) " + getWhere(BlockChangeType.KILLS) + "GROUP BY victim)) AS t INNER JOIN `lb-players` USING (playerid) GROUP BY playerid ORDER BY SUM(kills) + SUM(killed) " + order + " " + getLimit();
}
throw new IllegalStateException("Invalid summarization for kills");
}
if (sum == SummarizationMode.TYPES) {
return "SELECT type, SUM(created) AS created, SUM(destroyed) AS destroyed FROM ((SELECT type, count(*) AS created, 0 AS destroyed FROM `" + getTable() + "-blocks` INNER JOIN `lb-players` USING (playerid) " + getWhere(BlockChangeType.CREATED) + "GROUP BY type) UNION (SELECT replaced AS type, 0 AS created, count(*) AS destroyed FROM `" + getTable() + "-blocks` INNER JOIN `lb-players` USING (playerid) " + getWhere(BlockChangeType.DESTROYED) + "GROUP BY replaced)) AS t GROUP BY type ORDER BY SUM(created) + SUM(destroyed) " + order + " " + getLimit(); return "SELECT type, SUM(created) AS created, SUM(destroyed) AS destroyed FROM ((SELECT type, count(*) AS created, 0 AS destroyed FROM `" + getTable() + "-blocks` INNER JOIN `lb-players` USING (playerid) " + getWhere(BlockChangeType.CREATED) + "GROUP BY type) UNION (SELECT replaced AS type, 0 AS created, count(*) AS destroyed FROM `" + getTable() + "-blocks` INNER JOIN `lb-players` USING (playerid) " + getWhere(BlockChangeType.DESTROYED) + "GROUP BY replaced)) AS t GROUP BY type ORDER BY SUM(created) + SUM(destroyed) " + order + " " + getLimit();
} else { } else {
return "SELECT playername, UUID, SUM(created) AS created, SUM(destroyed) AS destroyed FROM ((SELECT playerid, count(*) AS created, 0 AS destroyed FROM `" + getTable() + "-blocks` " + getWhere(BlockChangeType.CREATED) + "GROUP BY playerid) UNION (SELECT playerid, 0 AS created, count(*) AS destroyed FROM `" + getTable() + "-blocks` " + getWhere(BlockChangeType.DESTROYED) + "GROUP BY playerid)) AS t INNER JOIN `lb-players` USING (playerid) GROUP BY playerid ORDER BY SUM(created) + SUM(destroyed) " + order + " " + getLimit(); return "SELECT playername, UUID, SUM(created) AS created, SUM(destroyed) AS destroyed FROM ((SELECT playerid, count(*) AS created, 0 AS destroyed FROM `" + getTable() + "-blocks` " + getWhere(BlockChangeType.CREATED) + "GROUP BY playerid) UNION (SELECT playerid, 0 AS created, count(*) AS destroyed FROM `" + getTable() + "-blocks` " + getWhere(BlockChangeType.DESTROYED) + "GROUP BY playerid)) AS t INNER JOIN `lb-players` USING (playerid) GROUP BY playerid ORDER BY SUM(created) + SUM(destroyed) " + order + " " + getLimit();
@@ -798,6 +831,9 @@ public final class QueryParams implements Cloneable {
if (!getWorldConfig(world).isLogging(Logging.KILL)) { if (!getWorldConfig(world).isLogging(Logging.KILL)) {
throw new IllegalArgumentException("Kill logging not enabled for world '" + world.getName() + "'"); throw new IllegalArgumentException("Kill logging not enabled for world '" + world.getName() + "'");
} }
if (sum != SummarizationMode.NONE && sum != SummarizationMode.PLAYERS) {
throw new IllegalArgumentException("Invalid summarization for kills");
}
} }
if (!prepareToolQuery && bct != BlockChangeType.CHAT) { if (!prepareToolQuery && bct != BlockChangeType.CHAT) {
if (world == null) { if (world == null) {
@@ -807,8 +843,13 @@ public final class QueryParams implements Cloneable {
throw new IllegalArgumentException("This world ('" + world.getName() + "') isn't logged"); throw new IllegalArgumentException("This world ('" + world.getName() + "') isn't logged");
} }
} }
if (bct == BlockChangeType.CHAT && !Config.isLogging(Logging.CHAT)) { if (bct == BlockChangeType.CHAT) {
throw new IllegalArgumentException("Chat is not logged"); if (!Config.isLogging(Logging.CHAT)) {
throw new IllegalArgumentException("Chat is not logged");
}
if (sum != SummarizationMode.NONE) {
throw new IllegalArgumentException("Invalid summarization for chat");
}
} }
} }