diff --git a/Mage/src/main/java/mage/cards/repository/CardRepository.java b/Mage/src/main/java/mage/cards/repository/CardRepository.java index 88cb2fbadda..9f6e39d6a75 100644 --- a/Mage/src/main/java/mage/cards/repository/CardRepository.java +++ b/Mage/src/main/java/mage/cards/repository/CardRepository.java @@ -43,6 +43,9 @@ public enum CardRepository { private Dao cardsDao; + // store names lists like all cards, lands, etc (it's static data and can be calculated one time only) + private static final Map> namesQueryCache = new HashMap<>(); + // sets with exclusively snow basics public static final Set snowLandSetCodes = new HashSet<>(Arrays.asList( "CSP", @@ -156,8 +159,11 @@ public enum CardRepository { return snowLandSetCodes.contains(setCode); } - public Set getNames() { - Set names = new TreeSet<>(); + public synchronized Set getNames() { + Set names = namesQueryCache.computeIfAbsent("getNames", x -> new TreeSet<>()); + if (!names.isEmpty()) { + return names; + } try { QueryBuilder qb = cardsDao.queryBuilder(); qb.distinct().selectColumns("name", "modalDoubleFacedSecondSideName", "secondSideName", "flipCardName", "spellOptionCardName"); @@ -172,8 +178,11 @@ public enum CardRepository { return names; } - public Set getNonLandNames() { - Set names = new TreeSet<>(); + public synchronized Set getNonLandNames() { + Set names = namesQueryCache.computeIfAbsent("getNonLandNames", x -> new TreeSet<>()); + if (!names.isEmpty()) { + return names; + } try { QueryBuilder qb = cardsDao.queryBuilder(); qb.distinct().selectColumns("name", "modalDoubleFacedSecondSideName", "secondSideName", "flipCardName", "spellOptionCardName"); @@ -189,8 +198,11 @@ public enum CardRepository { return names; } - public Set getNonbasicLandNames() { - Set names = new TreeSet<>(); + public synchronized Set getNonbasicLandNames() { + Set names = namesQueryCache.computeIfAbsent("getNonbasicLandNames", x -> new TreeSet<>()); + if (!names.isEmpty()) { + return names; + } try { QueryBuilder qb = cardsDao.queryBuilder(); qb.distinct().selectColumns("name", "modalDoubleFacedSecondSideName", "secondSideName", "flipCardName", "spellOptionCardName"); @@ -210,8 +222,11 @@ public enum CardRepository { return names; } - public Set getNotBasicLandNames() { - Set names = new TreeSet<>(); + public synchronized Set getNotBasicLandNames() { + Set names = namesQueryCache.computeIfAbsent("getNotBasicLandNames", x -> new TreeSet<>()); + if (!names.isEmpty()) { + return names; + } try { QueryBuilder qb = cardsDao.queryBuilder(); qb.distinct().selectColumns("name", "modalDoubleFacedSecondSideName", "secondSideName", "flipCardName", "spellOptionCardName"); @@ -227,8 +242,11 @@ public enum CardRepository { return names; } - public Set getCreatureNames() { - Set names = new TreeSet<>(); + public synchronized Set getCreatureNames() { + Set names = namesQueryCache.computeIfAbsent("getCreatureNames", x -> new TreeSet<>()); + if (!names.isEmpty()) { + return names; + } try { QueryBuilder qb = cardsDao.queryBuilder(); qb.distinct().selectColumns("name", "modalDoubleFacedSecondSideName", "secondSideName", "flipCardName", "spellOptionCardName"); @@ -244,8 +262,11 @@ public enum CardRepository { return names; } - public Set getArtifactNames() { - Set names = new TreeSet<>(); + public synchronized Set getArtifactNames() { + Set names = namesQueryCache.computeIfAbsent("getArtifactNames", x -> new TreeSet<>()); + if (!names.isEmpty()) { + return names; + } try { QueryBuilder qb = cardsDao.queryBuilder(); qb.distinct().selectColumns("name", "modalDoubleFacedSecondSideName", "secondSideName", "flipCardName", "spellOptionCardName"); @@ -261,8 +282,11 @@ public enum CardRepository { return names; } - public Set getNonLandAndNonCreatureNames() { - Set names = new TreeSet<>(); + public synchronized Set getNonLandAndNonCreatureNames() { + Set names = namesQueryCache.computeIfAbsent("getNonLandAndNonCreatureNames", x -> new TreeSet<>()); + if (!names.isEmpty()) { + return names; + } try { QueryBuilder qb = cardsDao.queryBuilder(); qb.distinct().selectColumns("name", "modalDoubleFacedSecondSideName", "secondSideName", "flipCardName", "spellOptionCardName"); @@ -282,8 +306,11 @@ public enum CardRepository { return names; } - public Set getNonArtifactAndNonLandNames() { - Set names = new TreeSet<>(); + public synchronized Set getNonArtifactAndNonLandNames() { + Set names = namesQueryCache.computeIfAbsent("getNonArtifactAndNonLandNames", x -> new TreeSet<>()); + if (!names.isEmpty()) { + return names; + } try { QueryBuilder qb = cardsDao.queryBuilder(); qb.distinct().selectColumns("name", "modalDoubleFacedSecondSideName", "secondSideName", "flipCardName", "spellOptionCardName");