From 317c7152e3bb654233685ba0124ae41813b4cf74 Mon Sep 17 00:00:00 2001 From: rfresh2 <89827146+rfresh2@users.noreply.github.com> Date: Wed, 4 Dec 2024 18:59:12 -0800 Subject: [PATCH] optimize out intermediary highlight list from getter --- .../ChunkHighlightCacheDimensionHandler.java | 13 +++----- .../highlights/ChunkHighlightDatabase.java | 33 ++++++++++++++++++- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/common/src/main/java/xaeroplus/feature/render/highlights/ChunkHighlightCacheDimensionHandler.java b/common/src/main/java/xaeroplus/feature/render/highlights/ChunkHighlightCacheDimensionHandler.java index 896c639c..58be4d05 100644 --- a/common/src/main/java/xaeroplus/feature/render/highlights/ChunkHighlightCacheDimensionHandler.java +++ b/common/src/main/java/xaeroplus/feature/render/highlights/ChunkHighlightCacheDimensionHandler.java @@ -44,16 +44,13 @@ public void setWindow(int regionX, int regionZ, int regionSize) { private void loadHighlightsInWindow() { executorService.execute(() -> { - final List chunks = database.getHighlightsInWindow( + synchronized (this.chunks) { + database.getHighlightsInWindow( dimension, windowRegionX - windowRegionSize, windowRegionX + windowRegionSize, - windowRegionZ - windowRegionSize, windowRegionZ + windowRegionSize - ); - synchronized (this.chunks) { - for (int i = 0; i < chunks.size(); i++) { - final ChunkHighlightData chunk = chunks.get(i); - this.chunks.put(chunkPosToLong(chunk.x(), chunk.z()), chunk.foundTime()); - } + windowRegionZ - windowRegionSize, windowRegionZ + windowRegionSize, + (x, y, time) -> this.chunks.put(chunkPosToLong(x, y), time) + ); } }); } diff --git a/common/src/main/java/xaeroplus/feature/render/highlights/ChunkHighlightDatabase.java b/common/src/main/java/xaeroplus/feature/render/highlights/ChunkHighlightDatabase.java index bb200e9a..7be28633 100644 --- a/common/src/main/java/xaeroplus/feature/render/highlights/ChunkHighlightDatabase.java +++ b/common/src/main/java/xaeroplus/feature/render/highlights/ChunkHighlightDatabase.java @@ -112,7 +112,7 @@ public List getHighlightsInWindow( chunks.add(new ChunkHighlightData( resultSet.getInt("x"), resultSet.getInt("z"), - resultSet.getInt("foundTime"))); + resultSet.getLong("foundTime"))); } return chunks; } @@ -123,6 +123,37 @@ public List getHighlightsInWindow( return Collections.emptyList(); } + @FunctionalInterface + public interface HighlightConsumer { + void accept(int x, int z, long foundTime); + } + + // avoids instantiating the intermediary list + public void getHighlightsInWindow( + final ResourceKey dimension, + final int regionXMin, final int regionXMax, + final int regionZMin, final int regionZMax, + HighlightConsumer consumer + ) { + try (var statement = connection.createStatement()) { + try (ResultSet resultSet = statement.executeQuery( + "SELECT * FROM \"" + getTableName(dimension) + "\" " + + "WHERE x >= " + regionCoordToChunkCoord(regionXMin) + " AND x <= " + regionCoordToChunkCoord(regionXMax) + + " AND z >= " + regionCoordToChunkCoord(regionZMin) + " AND z <= " + regionCoordToChunkCoord(regionZMax))) { + while (resultSet.next()) { + consumer.accept( + resultSet.getInt("x"), + resultSet.getInt("z"), + resultSet.getLong("foundTime") + ); + } + } + } catch (final Exception e) { + XaeroPlus.LOGGER.error("Error getting chunks from {} database in dimension: {}, window: {}-{}, {}-{}", databaseName, dimension.location(), regionXMin, regionXMax, regionZMin, regionZMax, e); + // fall through + } + } + public void removeHighlight(final int x, final int z, final ResourceKey dimension) { try (var statement = connection.createStatement()) { statement.executeUpdate("DELETE FROM \"" + getTableName(dimension) + "\" WHERE x = " + x + " AND z = " + z);