From c6c8aa40ecdf81b517e8d9522a9b68cabbb26771 Mon Sep 17 00:00:00 2001 From: casperwtf <49352026+casperwtf@users.noreply.github.com> Date: Sun, 6 Oct 2024 22:23:44 -0500 Subject: [PATCH] cache claim IDs (#2373) --- .../GriefPrevention/DataStore.java | 29 +++++++++---------- .../GriefPrevention/PlayerData.java | 12 +++++++- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/main/java/me/ryanhamshire/GriefPrevention/DataStore.java b/src/main/java/me/ryanhamshire/GriefPrevention/DataStore.java index 5504918cb..fcb02ee3e 100644 --- a/src/main/java/me/ryanhamshire/GriefPrevention/DataStore.java +++ b/src/main/java/me/ryanhamshire/GriefPrevention/DataStore.java @@ -71,6 +71,8 @@ public abstract class DataStore //in-memory cache for claim data ArrayList claims = new ArrayList<>(); + // claim id to claim cache + public final Map claimIDMap = new ConcurrentHashMap<>(); ConcurrentHashMap> chunksToClaimsMap = new ConcurrentHashMap<>(); //in-memory cache for messages @@ -447,6 +449,11 @@ synchronized void addClaim(Claim newClaim, boolean writeToStorage) //add it and mark it as added this.claims.add(newClaim); + this.claimIDMap.put(newClaim.id, newClaim); + for (Claim child : newClaim.children) + { + this.claimIDMap.put(child.id, child); + } addToChunkClaimMap(newClaim); newClaim.inDataStore = true; @@ -653,6 +660,12 @@ synchronized void deleteClaim(Claim claim, boolean fireEvent, boolean ignored) } } + claimIDMap.remove(claim.id); + for (Claim child : claim.children) + { + claimIDMap.remove(child.id); + } + removeFromChunkClaimMap(claim); //remove from secondary storage @@ -740,21 +753,7 @@ synchronized public Claim getClaimAt(Location location, boolean ignoreHeight, bo //finds a claim by ID public synchronized Claim getClaim(long id) { - for (Claim claim : this.claims) - { - if (claim.inDataStore) - { - if (claim.getID() == id) - return claim; - for (Claim subClaim : claim.children) - { - if (subClaim.getID() == id) - return subClaim; - } - } - } - - return null; + return this.claimIDMap.get(id); } //returns a read-only access point for the list of all land claims diff --git a/src/main/java/me/ryanhamshire/GriefPrevention/PlayerData.java b/src/main/java/me/ryanhamshire/GriefPrevention/PlayerData.java index 6072f7d03..4004ec4a3 100644 --- a/src/main/java/me/ryanhamshire/GriefPrevention/PlayerData.java +++ b/src/main/java/me/ryanhamshire/GriefPrevention/PlayerData.java @@ -255,12 +255,22 @@ public Vector getClaims() Claim claim = dataStore.claims.get(i); if (!claim.inDataStore) { - dataStore.claims.remove(i--); + Claim remove = dataStore.claims.remove(i--); + dataStore.claimIDMap.remove(remove.getID()); + for (Claim child : remove.children) + { + dataStore.claimIDMap.remove(child.getID()); + } continue; } if (playerID.equals(claim.ownerID)) { this.claims.add(claim); + dataStore.claimIDMap.put(claim.getID(), claim); + for (Claim child : claim.children) + { + dataStore.claimIDMap.put(child.getID(), child); + } totalClaimsArea += claim.getArea(); } }