From f81ef495c29ad1ce5adc4f0eac6a9f102309dfb7 Mon Sep 17 00:00:00 2001 From: DerFlash Date: Sun, 10 Mar 2013 14:15:37 +0100 Subject: [PATCH] * better location query mechanism * fix override / update WE dependency version in pom --- pom.xml | 2 +- .../java/de/diddiz/LogBlock/QueryParams.java | 95 +++++++++++++++---- 2 files changed, 78 insertions(+), 19 deletions(-) diff --git a/pom.xml b/pom.xml index 7844cdb..f493155 100644 --- a/pom.xml +++ b/pom.xml @@ -57,7 +57,7 @@ com.sk89q worldedit - 5.4.6-SNAPSHOT + 5.5 diff --git a/src/main/java/de/diddiz/LogBlock/QueryParams.java b/src/main/java/de/diddiz/LogBlock/QueryParams.java index 435694e..964aa3e 100755 --- a/src/main/java/de/diddiz/LogBlock/QueryParams.java +++ b/src/main/java/de/diddiz/LogBlock/QueryParams.java @@ -270,15 +270,31 @@ public final class QueryParams implements Cloneable for (final String victimName : victims) where.append("victims.playername != '").append(victimName).append("' AND "); - if (loc != null) { - if (radius == 0) - where.append("x = '").append(loc.getBlockX()).append("' AND y = '").append(loc.getBlockY()).append("' AND z = '").append(loc.getBlockZ()).append("' AND "); - else if (radius > 0) - where.append("x > '").append(loc.getBlockX() - radius).append("' AND x < '").append(loc.getBlockX() + radius).append("' AND y > '").append(loc.getBlockY() - radius).append("' AND y < '").append(loc.getBlockY() + radius).append("' AND z > '").append(loc.getBlockZ() - radius).append("' AND z < '").append(loc.getBlockZ() + radius).append("' AND "); - } else if (sel != null) - where.append("x >= '").append(sel.getSelection().getMinimumPoint().getBlockX()).append("' AND x <= '").append(sel.getSelection().getMaximumPoint().getBlockX()) - .append("' AND y >= '").append(sel.getSelection().getMinimumPoint().getBlockY()).append("' AND y <= '").append(sel.getSelection().getMaximumPoint().getBlockY()) - .append("' AND z >= '").append(sel.getSelection().getMinimumPoint().getBlockZ()).append("' AND z <= '").append(sel.getSelection().getMaximumPoint().getBlockZ()).append("' AND "); + if (loc != null) { + if (radius == 0) + compileLocationQuery( + where, + loc.getBlockX(), loc.getBlockX(), + loc.getBlockY(), loc.getBlockY(), + loc.getBlockZ(), loc.getBlockZ() + ); + + else if (radius > 0) + compileLocationQuery( + where, + loc.getBlockX() - radius + 1, loc.getBlockX() + radius - 1, + loc.getBlockY() - radius + 1, loc.getBlockY() + radius - 1, + loc.getBlockZ() - radius + 1, loc.getBlockZ() + radius - 1 + ); + + } else if (sel != null) + compileLocationQuery( + where, + sel.getSelection().getMinimumPoint().getBlockX(), sel.getSelection().getMaximumPoint().getBlockX(), + sel.getSelection().getMinimumPoint().getBlockY(), sel.getSelection().getMaximumPoint().getBlockY(), + sel.getSelection().getMinimumPoint().getBlockZ(), sel.getSelection().getMaximumPoint().getBlockZ() + ); + } else { switch (blockChangeType) { case ALL: @@ -368,15 +384,31 @@ public final class QueryParams implements Cloneable } break; } - if (loc != null) { - if (radius == 0) - where.append("x = '").append(loc.getBlockX()).append("' AND y = '").append(loc.getBlockY()).append("' AND z = '").append(loc.getBlockZ()).append("' AND "); - else if (radius > 0) - where.append("x > '").append(loc.getBlockX() - radius).append("' AND x < '").append(loc.getBlockX() + radius).append("' AND y > '").append(loc.getBlockY() - radius).append("' AND y < '").append(loc.getBlockY() + radius).append("' AND z > '").append(loc.getBlockZ() - radius).append("' AND z < '").append(loc.getBlockZ() + radius).append("' AND "); - } else if (sel != null) - where.append("x >= '").append(sel.getSelection().getMinimumPoint().getBlockX()).append("' AND x <= '").append(sel.getSelection().getMaximumPoint().getBlockX()) - .append("' AND y >= '").append(sel.getSelection().getMinimumPoint().getBlockY()).append("' AND y <= '").append(sel.getSelection().getMaximumPoint().getBlockY()). - append("' AND z >= '").append(sel.getSelection().getMinimumPoint().getBlockZ()).append("' AND z <= '").append(sel.getSelection().getMaximumPoint().getBlockZ()).append("' AND "); + if (loc != null) { + if (radius == 0) + compileLocationQuery( + where, + loc.getBlockX(), loc.getBlockX(), + loc.getBlockY(), loc.getBlockY(), + loc.getBlockZ(), loc.getBlockZ() + ); + + else if (radius > 0) + compileLocationQuery( + where, + loc.getBlockX() - radius + 1, loc.getBlockX() + radius - 1, + loc.getBlockY() - radius + 1, loc.getBlockY() + radius - 1, + loc.getBlockZ() - radius + 1, loc.getBlockZ() + radius - 1 + ); + + } else if (sel != null) + compileLocationQuery( + where, + sel.getSelection().getMinimumPoint().getBlockX(), sel.getSelection().getMaximumPoint().getBlockX(), + sel.getSelection().getMinimumPoint().getBlockY(), sel.getSelection().getMaximumPoint().getBlockY(), + sel.getSelection().getMinimumPoint().getBlockZ(), sel.getSelection().getMaximumPoint().getBlockZ() + ); + } if (!players.isEmpty() && sum != SummarizationMode.PLAYERS && blockChangeType != BlockChangeType.KILLS) if (!excludePlayersMode) { @@ -398,6 +430,33 @@ public final class QueryParams implements Cloneable where.delete(0, where.length()); return where.toString(); } + + private void compileLocationQuery(StringBuilder where, int blockX, int blockX2, int blockY, int blockY2, int blockZ, int blockZ2) { + compileLocationQueryPart(where, "x", blockX, blockX2); + where.append(" AND "); + compileLocationQueryPart(where, "y", blockY, blockY2); + where.append(" AND "); + compileLocationQueryPart(where, "z", blockZ, blockZ2); + where.append(" AND "); + } + + private void compileLocationQueryPart(StringBuilder where, String locValue, int loc, int loc2) { + int min = Math.min(loc, loc2); + int max = Math.max(loc2, loc); + + if (min == max) + where.append(locValue).append(" = ").append(min); + else if (max - min > 50) + where.append(locValue).append(" >= ").append(min).append(" AND ").append(locValue).append(" <= ").append(max); + else { + where.append(locValue).append(" in ("); + for (int c = min; c < max; c++) { + where.append(c).append(","); + } + where.append(max); + where.append(")"); + } + } public void parseArgs(CommandSender sender, List args) throws IllegalArgumentException { if (args == null || args.isEmpty())