Skip to content

Commit

Permalink
wip: improve performance of looking up platform players and users by …
Browse files Browse the repository at this point in the history
…uuid or name
  • Loading branch information
jorisguffens committed Sep 19, 2024
1 parent a7ee154 commit d496d56
Show file tree
Hide file tree
Showing 6 changed files with 97 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public interface KingdomCraft {

// players

Set<PlatformPlayer> getOnlinePlayers();
Collection<PlatformPlayer> getOnlinePlayers();

PlatformPlayer getPlayer(UUID uuid);

Expand Down Expand Up @@ -95,7 +95,7 @@ public interface KingdomCraft {

// users

Set<User> getOnlineUsers();
Collection<User> getOnlineUsers();

User getOnlineUser(String name);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
import com.gufli.kingdomcraft.api.entity.PlatformPlayer;
import com.gufli.kingdomcraft.api.events.KingdomCreateEvent;
import com.gufli.kingdomcraft.api.events.PlayerLeaveEvent;
import com.gufli.kingdomcraft.api.events.PlayerLoginEvent;
import com.gufli.kingdomcraft.api.placeholders.PlaceholderManager;
import com.gufli.kingdomcraft.common.chat.ChatManagerImpl;
import com.gufli.kingdomcraft.common.command.CommandManagerImpl;
Expand Down Expand Up @@ -145,7 +144,7 @@ public PermissionManager getPermissionManager() {
// players

@Override
public Set<PlatformPlayer> getOnlinePlayers() {
public Collection<PlatformPlayer> getOnlinePlayers() {
return context.getPlayers();
}

Expand Down Expand Up @@ -267,7 +266,7 @@ public void purgeUsers() {
}

@Override
public Set<User> getOnlineUsers() {
public Collection<User> getOnlineUsers() {
return context.getOnlineUsers();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package com.gufli.kingdomcraft.common.ebean;

import com.gufli.kingdomcraft.api.domain.User;
import com.gufli.kingdomcraft.api.entity.PlatformPlayer;

import java.util.Collection;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;

public class PlayerStore {

private final Map<UUID, User> usersByUuid = new ConcurrentHashMap<>();
private final Map<String, User> usersByName = new ConcurrentHashMap<>();

private final Map<UUID, PlatformPlayer> playersByUuid = new ConcurrentHashMap<>();
private final Map<String, PlatformPlayer> playersByName = new ConcurrentHashMap<>();

public final User getUser(UUID uuid) {
return usersByUuid.get(uuid);
}

public final User getUser(String name) {
return usersByName.get(name);
}

public final User getUser(PlatformPlayer player) {
return usersByUuid.get(player.getUniqueId());
}

public final PlatformPlayer getPlayer(UUID uuid) {
return playersByUuid.get(uuid);
}

public final PlatformPlayer getPlayer(String name) {
return playersByName.get(name);
}

public final PlatformPlayer getPlayer(User user) {
return playersByUuid.get(user.getUniqueId());
}

public final Collection<PlatformPlayer> getPlayers() {
return playersByUuid.values();
}

public final Collection<User> getUsers() {
return usersByUuid.values();
}

public final void remove(UUID uuid) {
User user = usersByUuid.remove(uuid);
if ( user != null ) {
usersByName.remove(user.getName());
}

PlatformPlayer player = playersByUuid.remove(uuid);
if ( player != null ) {
playersByName.remove(player.getName());
}
}

public final void add(User user, PlatformPlayer player) {
usersByUuid.put(user.getUniqueId(), user);
usersByName.put(user.getName(), user);

playersByUuid.put(user.getUniqueId(), player);
playersByName.put(user.getName(), player);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.logging.Level;
import java.util.stream.Collectors;
Expand All @@ -55,7 +54,7 @@ public class StorageContext {
public static final Set<BKingdom> kingdoms = new CopyOnWriteArraySet<>();
public static final Set<BRelation> relations = new CopyOnWriteArraySet<>();

public static final Map<PlatformPlayer, User> players = new ConcurrentHashMap<>();
public static final PlayerStore players = new PlayerStore();

private boolean initialized = false;
private final KingdomCraftPlugin plugin;
Expand Down Expand Up @@ -293,10 +292,13 @@ private void reassign(Relation relation) {

public void clearUsers() {
new QBUser().delete();
for ( User user : players.values() ) {
user.setKingdom(null);
((BUser) user).insert();

for ( PlatformPlayer player : players.getPlayers() ) {
User user = createUser(player.getUniqueId(), player.getName());
players.add(user, player);
}
saveAsync(players.getUsers());

for ( BKingdom kingdom : kingdoms ) {
kingdom.resetMemberCount();
}
Expand All @@ -307,23 +309,23 @@ public void purgeUsers() {
new QBUser().updatedAt.before(Instant.now().minus(2, ChronoUnit.WEEKS)).delete();
}

public Set<User> getOnlineUsers() {
return new HashSet<>(players.values());
public Collection<User> getOnlineUsers() {
return Collections.unmodifiableCollection(players.getUsers());
}

public User getOnlineUser(String name) {
return players.values().stream().filter(u -> u.getName().equalsIgnoreCase(name)).findFirst().orElse(null);
return players.getUser(name);
}

public User getOnlineUser(UUID uuid) {
return players.values().stream().filter(u -> u.getUniqueId().equals(uuid)).findFirst().orElse(null);
return players.getUser(uuid);
}

public CompletableFuture<List<User>> getUsers() {
return plugin.getScheduler().makeAsyncFuture(() -> {
List<BUser> users = new QBUser().findList();
users.forEach(this::reassign);
return users.stream().map((u) -> (User) u).collect(Collectors.toList());
return users.stream().map(User.class::cast).collect(Collectors.toList());
});
}

Expand Down Expand Up @@ -399,27 +401,27 @@ private void reassign(User user) {
// players

public void addPlayer(PlatformPlayer player, User user) {
players.put(player, user);
players.add(user, player);
}

public void removePlayer(PlatformPlayer player) {
players.remove(player);
players.remove(player.getUniqueId());
}

public Set<PlatformPlayer> getPlayers() {
return new HashSet<>(players.keySet());
public Collection<PlatformPlayer> getPlayers() {
return Collections.unmodifiableCollection(players.getPlayers());
}

public PlatformPlayer getPlayer(UUID uuid) {
return players.keySet().stream().filter(p -> p.getUniqueId().equals(uuid)).findFirst().orElse(null);
return players.getPlayer(uuid);
}

public PlatformPlayer getPlayer(User user) {
return getPlayer(user.getUniqueId());
}

public PlatformPlayer getPlayer(String name) {
return players.keySet().stream().filter(p -> p.getName().equalsIgnoreCase(name)).findFirst().orElse(null);
return players.getPlayer(name);
}

//
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,8 @@ public BKingdom() {
@Override
public boolean delete() {
StorageContext.kingdoms.remove(this);
StorageContext.players.values().stream().filter(user -> user.getKingdom() == this)
StorageContext.players.getUsers().stream()
.filter(user -> user.getKingdom() == this)
.forEach(user -> user.setKingdom(null));

KingdomCraftProvider.get().getEventManager().dispatch(new KingdomDeleteEvent(this));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,8 @@ public boolean delete() {
kingdom.defaultRank = null;
}
Rank defaultRank = kingdom.defaultRank;
StorageContext.players.values().stream().filter(user -> user.getRank() == this)
StorageContext.players.getUsers().stream()
.filter(user -> user.getRank() == this)
.forEach(user -> user.setRank(defaultRank));
return super.delete();
}
Expand Down

0 comments on commit d496d56

Please sign in to comment.