From f2fb947f3819686b213e890ccd1552ecaac4806f Mon Sep 17 00:00:00 2001 From: "marcins78@gmail.com" Date: Sun, 31 Mar 2013 20:37:16 +0000 Subject: [PATCH] Improvements to Merchant performance. --- .../async/handler/DeckRequestHandler.java | 13 ------- .../async/handler/MerchantRequestHandler.java | 15 +++----- .../gempukku/lotro/db/CachedMerchantDAO.java | 10 ++++- .../gempukku/lotro/game/BasicCardItem.java | 33 +++++++++++++++++ .../gempukku/lotro/game/CardCollection.java | 3 ++ .../lotro/game/DefaultCardCollection.java | 16 ++++++-- .../lotro/game/SumCardCollection.java | 12 ++++-- .../lotro/merchant/MerchantService.java | 37 ++----------------- 8 files changed, 75 insertions(+), 64 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/BasicCardItem.java diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/DeckRequestHandler.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/DeckRequestHandler.java index 423369805..5c8d0547b 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/DeckRequestHandler.java +++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/DeckRequestHandler.java @@ -290,17 +290,4 @@ public class DeckRequestHandler extends LotroServerRequestHandler implements Uri return cardItems; } - - private static class BasicCardItem implements CardItem { - private String _blueprintId; - - private BasicCardItem(String blueprintId) { - _blueprintId = blueprintId; - } - - @Override - public String getBlueprintId() { - return _blueprintId; - } - } } diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/MerchantRequestHandler.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/MerchantRequestHandler.java index a3f52c907..db70cdd44 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/MerchantRequestHandler.java +++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/MerchantRequestHandler.java @@ -115,19 +115,16 @@ public class MerchantRequestHandler extends LotroServerRequestHandler implements CardCollection collection = _collectionsManager.getPlayerCollection(resourceOwner, "permanent"); Set cardItems = new HashSet(); - final Collection allItems = collection.getAll().values(); - for (CardCollection.Item item : allItems) { - if (item.getCount() >= ownedMin) - cardItems.add(item); - } - if (ownedMin <= 0) { - Set items = _merchantService.getSellableItems(); - for (CardItem item : items) { - if (collection.getItemCount(item.getBlueprintId()) == 0) + cardItems.addAll(_merchantService.getSellableItems()); + cardItems.addAll(collection.getAllCardsInCollection()); + } else { + for (CardCollection.Item item : collection.getAll().values()) { + if (item.getCount() >= ownedMin) cardItems.add(item); } } + List filteredResult = _sortAndFilterCards.process(filter, cardItems, _library, _formatLibrary, _rarities); List pageToDisplay = new ArrayList(); diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/CachedMerchantDAO.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/CachedMerchantDAO.java index 065b5c8a7..c8ae9f689 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/CachedMerchantDAO.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/CachedMerchantDAO.java @@ -10,6 +10,7 @@ import java.util.Map; public class CachedMerchantDAO implements MerchantDAO, Cached { private MerchantDAO _delegate; private Map _blueprintIdLastTransaction = Collections.synchronizedMap(new LRUMap(4000)); + private Transaction _nullTransaction = new Transaction(null, 0, null, 0); public CachedMerchantDAO(MerchantDAO delegate) { _delegate = delegate; @@ -33,10 +34,15 @@ public class CachedMerchantDAO implements MerchantDAO, Cached { @Override public Transaction getLastTransaction(String blueprintId) { - Transaction transaction = (Transaction) _blueprintIdLastTransaction.get(blueprintId); + Transaction transaction = _blueprintIdLastTransaction.get(blueprintId); if (transaction == null) { transaction = _delegate.getLastTransaction(blueprintId); - _blueprintIdLastTransaction.put(blueprintId, transaction); + if (transaction == null) + _blueprintIdLastTransaction.put(blueprintId, _nullTransaction); + else + _blueprintIdLastTransaction.put(blueprintId, transaction); + } else if (transaction == _nullTransaction) { + transaction = null; } return transaction; } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/BasicCardItem.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/BasicCardItem.java new file mode 100644 index 000000000..31b6c7a49 --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/BasicCardItem.java @@ -0,0 +1,33 @@ +package com.gempukku.lotro.game; + +public class BasicCardItem implements CardItem { + private String _blueprintId; + + public BasicCardItem(String blueprintId) { + _blueprintId = blueprintId; + } + + @Override + public String getBlueprintId() { + return _blueprintId; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + BasicCardItem that = (BasicCardItem) o; + + if (_blueprintId != null ? !_blueprintId.equals(that._blueprintId) : that._blueprintId != null) + return false; + + return true; + } + + @Override + public int hashCode() { + return _blueprintId != null ? _blueprintId.hashCode() : 0; + } +} + diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/CardCollection.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/CardCollection.java index 3a5d4f0c9..ca236ae6d 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/CardCollection.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/CardCollection.java @@ -1,6 +1,7 @@ package com.gempukku.lotro.game; import java.util.Map; +import java.util.Set; public interface CardCollection extends OwnershipCheck { public int getCurrency(); @@ -9,6 +10,8 @@ public interface CardCollection extends OwnershipCheck { public int getItemCount(String blueprintId); + public Set getAllCardsInCollection(); + public static class Item implements CardItem { public enum Type { PACK, CARD, SELECTION diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/DefaultCardCollection.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/DefaultCardCollection.java index ae62041f5..08b431c47 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/DefaultCardCollection.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/DefaultCardCollection.java @@ -6,6 +6,7 @@ import java.util.*; public class DefaultCardCollection implements MutableCardCollection { private Map _counts = new LinkedHashMap(); + private Set _basicItems = new HashSet(); private int _currency; public DefaultCardCollection() { @@ -39,9 +40,10 @@ public class DefaultCardCollection implements MutableCardCollection { public synchronized void addItem(String itemId, int toAdd) { if (toAdd > 0) { Item oldCount = _counts.get(itemId); - if (oldCount == null) + if (oldCount == null) { _counts.put(itemId, Item.createItem(itemId, toAdd)); - else + _basicItems.add(new BasicCardItem(itemId)); + } else _counts.put(itemId, Item.createItem(itemId, toAdd + oldCount.getCount())); } } @@ -52,14 +54,20 @@ public class DefaultCardCollection implements MutableCardCollection { Item oldCount = _counts.get(itemId); if (oldCount == null || oldCount.getCount() < toRemove) return false; - if (oldCount.getCount() == toRemove) + if (oldCount.getCount() == toRemove) { _counts.remove(itemId); - else + _basicItems.remove(new BasicCardItem(itemId)); + } else _counts.put(itemId, Item.createItem(itemId, oldCount.getCount() - toRemove)); } return true; } + @Override + public Set getAllCardsInCollection() { + return Collections.unmodifiableSet(_basicItems); + } + @Override public synchronized CardCollection openPack(String packId, String selection, PacksStorage packsStorage) { Item count = _counts.get(packId); diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/SumCardCollection.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/SumCardCollection.java index 5487a6545..939641db0 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/SumCardCollection.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/SumCardCollection.java @@ -1,8 +1,6 @@ package com.gempukku.lotro.game; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; public class SumCardCollection implements CardCollection { private List _cardCollections; @@ -46,4 +44,12 @@ public class SumCardCollection implements CardCollection { return sum; } + + @Override + public Set getAllCardsInCollection() { + Set result = new HashSet(); + for (CardCollection cardCollection : _cardCollections) + result.addAll(cardCollection.getAllCardsInCollection()); + return result; + } } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/merchant/MerchantService.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/merchant/MerchantService.java index c0b535b59..d6911d5cb 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/merchant/MerchantService.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/merchant/MerchantService.java @@ -5,6 +5,7 @@ import com.gempukku.lotro.cards.packs.SetDefinition; import com.gempukku.lotro.collection.CollectionsManager; import com.gempukku.lotro.db.MerchantDAO; import com.gempukku.lotro.db.vo.CollectionType; +import com.gempukku.lotro.game.BasicCardItem; import com.gempukku.lotro.game.CardItem; import com.gempukku.lotro.game.LotroCardBlueprintLibrary; import com.gempukku.lotro.game.Player; @@ -23,7 +24,7 @@ public class MerchantService { private Map _priceGuarantees = Collections.synchronizedMap(new LRUMap(100)); private ReadWriteLock _lock = new ReentrantReadWriteLock(true); - private Set _merchantableItems = new HashSet(); + private Set _merchantableItems = new HashSet(); private Set _merchantableStrings = new HashSet(); private Map _fixedPriceItems = new HashMap(); @@ -113,7 +114,7 @@ public class MerchantService { _merchantableStrings.add(blueprintId); } - public Set getSellableItems() { + public Set getSellableItems() { return Collections.unmodifiableSet(_merchantableItems); } @@ -132,6 +133,7 @@ public class MerchantService { sellPrices.put(blueprintId, fixedPrice); } else { Integer buyPrice = _merchant.getCardBuyPrice(blueprintId, currentTime); + if (buyPrice != null) buyPrices.put(blueprintId, buyPrice); if (_merchantableStrings.contains(blueprintId)) { @@ -209,37 +211,6 @@ public class MerchantService { } } - private static class BasicCardItem implements CardItem { - private String _blueprintId; - - private BasicCardItem(String blueprintId) { - _blueprintId = blueprintId; - } - - @Override - public String getBlueprintId() { - return _blueprintId; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - BasicCardItem that = (BasicCardItem) o; - - if (_blueprintId != null ? !_blueprintId.equals(that._blueprintId) : that._blueprintId != null) - return false; - - return true; - } - - @Override - public int hashCode() { - return _blueprintId != null ? _blueprintId.hashCode() : 0; - } - } - public static class PriceGuarantee { private Map _sellPrices; private Map _buyPrices;