From b4636b2ce16571d3223527a27e310eec6ef0a183 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 10 Feb 2015 00:51:36 +0100 Subject: [PATCH] * Rework of booster generation to reduce DB load while starting a tournament. --- Mage.Sets/src/mage/sets/DragonsMaze.java | 90 +++++++++++-------- Mage.Sets/src/mage/sets/FateReforged.java | 64 ++++++++----- Mage/src/mage/cards/CardsImpl.java | 2 +- Mage/src/mage/cards/ExpansionSet.java | 90 +++++++++---------- Mage/src/mage/game/draft/BoosterDraft.java | 1 + Mage/src/mage/game/draft/Draft.java | 2 + Mage/src/mage/game/draft/DraftImpl.java | 14 +++ Mage/src/mage/game/draft/DraftPlayer.java | 10 +-- .../mage/game/tournament/TournamentImpl.java | 12 +++ 9 files changed, 174 insertions(+), 111 deletions(-) diff --git a/Mage.Sets/src/mage/sets/DragonsMaze.java b/Mage.Sets/src/mage/sets/DragonsMaze.java index bda1dc8e8cc..45c316b308e 100644 --- a/Mage.Sets/src/mage/sets/DragonsMaze.java +++ b/Mage.Sets/src/mage/sets/DragonsMaze.java @@ -54,6 +54,8 @@ public class DragonsMaze extends ExpansionSet { return fINSTANCE; } + List savedSpecialRares = new ArrayList<>(); + private DragonsMaze() { super("Dragon's Maze", "DGM", "mage.sets.dragonsmaze", new GregorianCalendar(2013, 5, 03).getTime(), SetType.EXPANSION); this.blockName = "Return to Ravnica"; @@ -69,10 +71,23 @@ public class DragonsMaze extends ExpansionSet { } @Override - public List getCommon() { - CardCriteria criteria = new CardCriteria(); - criteria.setCodes(this.code).rarities(Rarity.COMMON).notTypes(CardType.LAND).doubleFaced(false); - return CardRepository.instance.findCards(criteria); + public List getCardsByRarity(Rarity rarity) { + if (rarity.equals(Rarity.COMMON)) { + List savedCardsInfos = savedCards.get(rarity); + if (savedCardsInfos == null) { + CardCriteria criteria = new CardCriteria(); + criteria.setCodes(this.code).notTypes(CardType.LAND); + criteria.rarities(rarity).doubleFaced(false); + if (maxCardNumberInBooster != Integer.MAX_VALUE) { + criteria.maxCardNumber(maxCardNumberInBooster); + } + savedCardsInfos = CardRepository.instance.findCards(criteria); + savedCards.put(rarity, savedCardsInfos); + } + return savedCardsInfos; + } else { + return super.getCardsByRarity(rarity); + } } @Override @@ -84,39 +99,42 @@ public class DragonsMaze extends ExpansionSet { @Override public List getSpecialRare() { - List specialRare = new ArrayList<>(); - CardCriteria criteria = new CardCriteria(); - criteria.setCodes("GTC").name("Breeding Pool"); - specialRare.addAll(CardRepository.instance.findCards(criteria)); - criteria = new CardCriteria(); - criteria.setCodes("GTC").name("Godless Shrine"); - specialRare.addAll(CardRepository.instance.findCards(criteria)); - criteria = new CardCriteria(); - criteria.setCodes("GTC").name("Sacred Foundry"); - specialRare.addAll(CardRepository.instance.findCards(criteria)); - criteria = new CardCriteria(); - criteria.setCodes("GTC").name("Stomping Ground"); - specialRare.addAll(CardRepository.instance.findCards(criteria)); - criteria = new CardCriteria(); - criteria.setCodes("GTC").name("Watery Grave"); - specialRare.addAll(CardRepository.instance.findCards(criteria)); + List specialRares = new ArrayList<>(); + if (savedSpecialRares == null) { + CardCriteria criteria = new CardCriteria(); + criteria.setCodes("GTC").name("Breeding Pool"); + savedSpecialRares.addAll(CardRepository.instance.findCards(criteria)); + criteria = new CardCriteria(); + criteria.setCodes("GTC").name("Godless Shrine"); + savedSpecialRares.addAll(CardRepository.instance.findCards(criteria)); + criteria = new CardCriteria(); + criteria.setCodes("GTC").name("Sacred Foundry"); + savedSpecialRares.addAll(CardRepository.instance.findCards(criteria)); + criteria = new CardCriteria(); + criteria.setCodes("GTC").name("Stomping Ground"); + savedSpecialRares.addAll(CardRepository.instance.findCards(criteria)); + criteria = new CardCriteria(); + criteria.setCodes("GTC").name("Watery Grave"); + savedSpecialRares.addAll(CardRepository.instance.findCards(criteria)); - criteria = new CardCriteria(); - criteria.setCodes("RTR").name("Blood Crypt"); - specialRare.addAll(CardRepository.instance.findCards(criteria)); - criteria = new CardCriteria(); - criteria.setCodes("RTR").name("Hallowed Fountain"); - specialRare.addAll(CardRepository.instance.findCards(criteria)); - criteria = new CardCriteria(); - criteria.setCodes("RTR").name("Overgrown Tomb"); - specialRare.addAll(CardRepository.instance.findCards(criteria)); - criteria = new CardCriteria(); - criteria.setCodes("RTR").name("Steam Vents"); - specialRare.addAll(CardRepository.instance.findCards(criteria)); - criteria = new CardCriteria(); - criteria.setCodes("RTR").name("Temple Garden"); - specialRare.addAll(CardRepository.instance.findCards(criteria)); - return specialRare; + criteria = new CardCriteria(); + criteria.setCodes("RTR").name("Blood Crypt"); + savedSpecialRares.addAll(CardRepository.instance.findCards(criteria)); + criteria = new CardCriteria(); + criteria.setCodes("RTR").name("Hallowed Fountain"); + savedSpecialRares.addAll(CardRepository.instance.findCards(criteria)); + criteria = new CardCriteria(); + criteria.setCodes("RTR").name("Overgrown Tomb"); + savedSpecialRares.addAll(CardRepository.instance.findCards(criteria)); + criteria = new CardCriteria(); + criteria.setCodes("RTR").name("Steam Vents"); + savedSpecialRares.addAll(CardRepository.instance.findCards(criteria)); + criteria = new CardCriteria(); + criteria.setCodes("RTR").name("Temple Garden"); + savedSpecialRares.addAll(CardRepository.instance.findCards(criteria)); + } + specialRares.addAll(savedSpecialRares); + return specialRares; } @Override diff --git a/Mage.Sets/src/mage/sets/FateReforged.java b/Mage.Sets/src/mage/sets/FateReforged.java index da447e6837d..58bab5da106 100644 --- a/Mage.Sets/src/mage/sets/FateReforged.java +++ b/Mage.Sets/src/mage/sets/FateReforged.java @@ -47,6 +47,8 @@ public class FateReforged extends ExpansionSet { private static final FateReforged fINSTANCE = new FateReforged(); + List savedSpecialRares = new ArrayList<>(); + public static FateReforged getInstance() { return fINSTANCE; } @@ -65,11 +67,24 @@ public class FateReforged extends ExpansionSet { this.ratioBoosterMythic = 8; } - @Override - public List getCommon() { - CardCriteria criteria = new CardCriteria(); - criteria.setCodes(this.code).rarities(Rarity.COMMON).notTypes(CardType.LAND).doubleFaced(false); - return CardRepository.instance.findCards(criteria); + @Override + public List getCardsByRarity(Rarity rarity) { + if (rarity.equals(Rarity.COMMON)) { + List savedCardsInfos = savedCards.get(rarity); + if (savedCardsInfos == null) { + CardCriteria criteria = new CardCriteria(); + criteria.setCodes(this.code).notTypes(CardType.LAND); + criteria.rarities(rarity).doubleFaced(false); + if (maxCardNumberInBooster != Integer.MAX_VALUE) { + criteria.maxCardNumber(maxCardNumberInBooster); + } + savedCardsInfos = CardRepository.instance.findCards(criteria); + savedCards.put(rarity, savedCardsInfos); + } + return savedCardsInfos; + } else { + return super.getCardsByRarity(rarity); + } } @Override @@ -81,22 +96,25 @@ public class FateReforged extends ExpansionSet { @Override public List getSpecialRare() { - List specialRare = new ArrayList<>(); - CardCriteria criteria = new CardCriteria(); - criteria.setCodes("KTK").name("Bloodstained Mire"); - specialRare.addAll(CardRepository.instance.findCards(criteria)); - criteria = new CardCriteria(); - criteria.setCodes("KTK").name("Flooded Strand"); - specialRare.addAll(CardRepository.instance.findCards(criteria)); - criteria = new CardCriteria(); - criteria.setCodes("KTK").name("Polluted Delta"); - specialRare.addAll(CardRepository.instance.findCards(criteria)); - criteria = new CardCriteria(); - criteria.setCodes("KTK").name("Windswept Heath"); - specialRare.addAll(CardRepository.instance.findCards(criteria)); - criteria = new CardCriteria(); - criteria.setCodes("KTK").name("Wooded Foothills"); - specialRare.addAll(CardRepository.instance.findCards(criteria)); - return specialRare; + List specialRares = new ArrayList<>(); + if (savedSpecialRares.isEmpty()) { + CardCriteria criteria = new CardCriteria(); + criteria.setCodes("KTK").name("Bloodstained Mire"); + savedSpecialRares.addAll(CardRepository.instance.findCards(criteria)); + criteria = new CardCriteria(); + criteria.setCodes("KTK").name("Flooded Strand"); + savedSpecialRares.addAll(CardRepository.instance.findCards(criteria)); + criteria = new CardCriteria(); + criteria.setCodes("KTK").name("Polluted Delta"); + savedSpecialRares.addAll(CardRepository.instance.findCards(criteria)); + criteria = new CardCriteria(); + criteria.setCodes("KTK").name("Windswept Heath"); + savedSpecialRares.addAll(CardRepository.instance.findCards(criteria)); + criteria = new CardCriteria(); + criteria.setCodes("KTK").name("Wooded Foothills"); + savedSpecialRares.addAll(CardRepository.instance.findCards(criteria)); + } + specialRares.addAll(savedSpecialRares); + return specialRares; } -} \ No newline at end of file +} diff --git a/Mage/src/mage/cards/CardsImpl.java b/Mage/src/mage/cards/CardsImpl.java index 006178ef4a0..9eebeb683e2 100644 --- a/Mage/src/mage/cards/CardsImpl.java +++ b/Mage/src/mage/cards/CardsImpl.java @@ -189,7 +189,7 @@ public class CardsImpl extends LinkedHashSet implements Cards, Serializabl if (card != null) { cards.add(card); } else { - // this bug seems to happen, if cause is removed, this check can also be removed + // seems like this can happen during the cancelation of a game logger.error("Card not found cardId: " + cardId + " gameId: " + game.getId() ); } } diff --git a/Mage/src/mage/cards/ExpansionSet.java b/Mage/src/mage/cards/ExpansionSet.java index 62388aeb577..5a808a456c5 100644 --- a/Mage/src/mage/cards/ExpansionSet.java +++ b/Mage/src/mage/cards/ExpansionSet.java @@ -31,6 +31,7 @@ package mage.cards; import java.io.Serializable; import java.util.ArrayList; import java.util.Date; +import java.util.EnumMap; import java.util.List; import java.util.Random; import mage.cards.repository.CardCriteria; @@ -66,6 +67,8 @@ public abstract class ExpansionSet implements Serializable { protected String packageName; protected int maxCardNumberInBooster; + protected final EnumMap> savedCards; + public ExpansionSet(String name, String code, String packageName, Date releaseDate, SetType setType) { this.name = name; this.code = code; @@ -73,6 +76,7 @@ public abstract class ExpansionSet implements Serializable { this.setType = setType; this.packageName = packageName; this.maxCardNumberInBooster = Integer.MAX_VALUE; + savedCards = new EnumMap<>(Rarity.class); } public String getName() { @@ -113,50 +117,28 @@ public abstract class ExpansionSet implements Serializable { if (!hasBoosters) { return booster; } - - List common = getCommon(); - - CardCriteria criteria = new CardCriteria(); - criteria.setCodes(this.code).rarities(Rarity.UNCOMMON).doubleFaced(false); - if (maxCardNumberInBooster != Integer.MAX_VALUE) { - criteria.maxCardNumber(maxCardNumberInBooster); - } - List uncommon = CardRepository.instance.findCards(criteria); - - criteria = new CardCriteria(); - criteria.setCodes(this.code).rarities(Rarity.RARE).doubleFaced(false); - if (maxCardNumberInBooster != Integer.MAX_VALUE) { - criteria.maxCardNumber(maxCardNumberInBooster); - } - List rare = CardRepository.instance.findCards(criteria); - - criteria = new CardCriteria(); - criteria.setCodes(this.code).rarities(Rarity.MYTHIC).doubleFaced(false); - if (maxCardNumberInBooster != Integer.MAX_VALUE) { - criteria.maxCardNumber(maxCardNumberInBooster); - } - List mythic = CardRepository.instance.findCards(criteria); - + if (numBoosterLands > 0) { - criteria = new CardCriteria(); - criteria.setCodes(!hasBasicLands && parentSet != null ? parentSet.code : this.code).rarities(Rarity.LAND).doubleFaced(false); - List basicLand = CardRepository.instance.findCards(criteria); + List basicLands = getCardsByRarity(Rarity.LAND); for (int i = 0; i < numBoosterLands; i++) { - addToBooster(booster, basicLand); + addToBooster(booster, basicLands); } - } - + } + List commons = getCardsByRarity(Rarity.COMMON); for (int i = 0; i < numBoosterCommon; i++) { - addToBooster(booster, common); + addToBooster(booster, commons); } + List uncommons = getCardsByRarity(Rarity.UNCOMMON); for (int i = 0; i < numBoosterUncommon; i++) { - addToBooster(booster, uncommon); + addToBooster(booster, uncommons); } + List rares = getCardsByRarity(Rarity.RARE); + List mythics = getCardsByRarity(Rarity.MYTHIC); for (int i = 0; i < numBoosterRare; i++) { if (ratioBoosterMythic > 0 && rnd.nextInt(ratioBoosterMythic) == 1) { - addToBooster(booster, mythic); + addToBooster(booster, mythics); } else { - addToBooster(booster, rare); + addToBooster(booster, rares); } } @@ -189,7 +171,7 @@ public abstract class ExpansionSet implements Serializable { if (specialCards > 0) { for (int i = 0; i < numBoosterSpecial; i++) { if (rnd.nextInt(15) < 10) { - if (specialCommon != null) { + if (specialCommon != null && !specialCommon.isEmpty()) { addToBooster(booster, specialCommon); } else { i--; @@ -197,7 +179,7 @@ public abstract class ExpansionSet implements Serializable { continue; } if (rnd.nextInt(4) < 3) { - if (specialUncommon != null) { + if (specialUncommon != null && !specialUncommon.isEmpty()) { addToBooster(booster, specialUncommon); } else { i--; @@ -205,15 +187,15 @@ public abstract class ExpansionSet implements Serializable { continue; } if (rnd.nextInt(8) < 7) { - if (specialRare != null) { + if (specialRare != null && !specialRare.isEmpty()) { addToBooster(booster, specialRare); } else { i--; } continue; } - if (specialMythic != null) { - if (specialBonus != null) { + if (specialMythic != null && !specialMythic.isEmpty()) { + if (specialBonus != null && !specialBonus.isEmpty()) { if (rnd.nextInt(3) < 2) { addToBooster(booster, specialMythic); continue; @@ -225,7 +207,7 @@ public abstract class ExpansionSet implements Serializable { } else { i--; } - if (specialBonus != null) { + if (specialBonus != null && !specialBonus.isEmpty()) { addToBooster(booster, specialBonus); } } @@ -276,13 +258,25 @@ public abstract class ExpansionSet implements Serializable { return hasBasicLands; } - public List getCommon() { - CardCriteria criteria = new CardCriteria(); - criteria.setCodes(this.code).rarities(Rarity.COMMON).doubleFaced(false); - if (maxCardNumberInBooster != Integer.MAX_VALUE) { - criteria.maxCardNumber(maxCardNumberInBooster); + public List getCardsByRarity(Rarity rarity) { + List savedCardsInfos = savedCards.get(rarity); + if (savedCardsInfos == null) { + CardCriteria criteria = new CardCriteria(); + if (rarity.equals(Rarity.LAND)) { + criteria.setCodes(!hasBasicLands && parentSet != null ? parentSet.code : this.code); + } else { + criteria.setCodes(this.code); + } + criteria.rarities(rarity).doubleFaced(false); + if (maxCardNumberInBooster != Integer.MAX_VALUE) { + criteria.maxCardNumber(maxCardNumberInBooster); + } + savedCardsInfos = CardRepository.instance.findCards(criteria); + savedCards.put(rarity, savedCardsInfos); } - return CardRepository.instance.findCards(criteria); + List cards = new ArrayList<>(); + cards.addAll(savedCardsInfos); + return cards; } public List getSpecialCommon() { @@ -304,4 +298,8 @@ public abstract class ExpansionSet implements Serializable { public List getSpecialBonus() { return null; } + + public void removeSavedCards() { + savedCards.clear(); + } } diff --git a/Mage/src/mage/game/draft/BoosterDraft.java b/Mage/src/mage/game/draft/BoosterDraft.java index 305bdb1476e..c0bb75f99bd 100644 --- a/Mage/src/mage/game/draft/BoosterDraft.java +++ b/Mage/src/mage/game/draft/BoosterDraft.java @@ -54,6 +54,7 @@ public class BoosterDraft extends DraftImpl { fireUpdatePlayersEvent(); } } + resetBufferedCards(); this.fireEndDraftEvent(); } diff --git a/Mage/src/mage/game/draft/Draft.java b/Mage/src/mage/game/draft/Draft.java index de1e7f674c9..2d8b17380d0 100644 --- a/Mage/src/mage/game/draft/Draft.java +++ b/Mage/src/mage/game/draft/Draft.java @@ -70,6 +70,8 @@ public interface Draft extends MageItem, Serializable { void addPlayerQueryEventListener(Listener listener); void firePickCardEvent(UUID playerId); + void resetBufferedCards(); + boolean isAbort(); void setAbort(boolean abort); diff --git a/Mage/src/mage/game/draft/DraftImpl.java b/Mage/src/mage/game/draft/DraftImpl.java index 4cd801cd0c6..babf5359bd4 100644 --- a/Mage/src/mage/game/draft/DraftImpl.java +++ b/Mage/src/mage/game/draft/DraftImpl.java @@ -29,6 +29,7 @@ package mage.game.draft; import java.util.Collection; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -351,4 +352,17 @@ public abstract class DraftImpl implements Draft { started = true; } + @Override + public void resetBufferedCards() { + HashSet setsDone = new HashSet<>(); + for(ExpansionSet set: sets) { + if (!setsDone.contains(set)) { + set.removeSavedCards(); + setsDone.add(set); + } + } + + } + + } diff --git a/Mage/src/mage/game/draft/DraftPlayer.java b/Mage/src/mage/game/draft/DraftPlayer.java index 19ce58e99c1..01932738691 100644 --- a/Mage/src/mage/game/draft/DraftPlayer.java +++ b/Mage/src/mage/game/draft/DraftPlayer.java @@ -97,11 +97,11 @@ public class DraftPlayer { picking = false; } - public void openBooster(ExpansionSet set) { - synchronized(booster) { - booster = set.createBooster(); - } - } +// public void openBooster(ExpansionSet set) { +// synchronized(booster) { +// booster = set.createBooster(); +// } +// } public void setBooster(List booster) { this.booster = booster; diff --git a/Mage/src/mage/game/tournament/TournamentImpl.java b/Mage/src/mage/game/tournament/TournamentImpl.java index 85c2e51ec87..2719c4a277d 100644 --- a/Mage/src/mage/game/tournament/TournamentImpl.java +++ b/Mage/src/mage/game/tournament/TournamentImpl.java @@ -32,6 +32,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Random; @@ -399,9 +400,20 @@ public abstract class TournamentImpl implements Tournament { } } } + resetBufferedCards(); nextStep(); } + public void resetBufferedCards() { + HashSet setsDone = new HashSet<>(); + for(ExpansionSet set: sets) { + if (!setsDone.contains(set)) { + set.removeSavedCards(); + setsDone.add(set); + } + } + } + public void playMatch(TournamentPairing pair) { options.getMatchOptions().getPlayerTypes().clear(); options.getMatchOptions().getPlayerTypes().add(pair.getPlayer1().getPlayerType());