From 7ecdd03727bea0e1485728807d9a7f9f8bc81090 Mon Sep 17 00:00:00 2001 From: iMoHax Date: Wed, 12 Aug 2015 15:12:49 +0300 Subject: [PATCH] optimize BDB place, vendor --- core/src/main/java/ru/trader/core/Place.java | 2 +- .../java/ru/trader/core/PlacesWrapper.java | 2 +- .../ru/trader/store/berkeley/PlaceProxy.java | 20 +++++++++++++++++++ .../ru/trader/store/berkeley/VendorProxy.java | 20 +++++++++++++++---- .../trader/store/berkeley/dao/VendorDA.java | 8 ++++++++ 5 files changed, 46 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/ru/trader/core/Place.java b/core/src/main/java/ru/trader/core/Place.java index 04149b0..efbca69 100644 --- a/core/src/main/java/ru/trader/core/Place.java +++ b/core/src/main/java/ru/trader/core/Place.java @@ -36,7 +36,7 @@ public interface Place extends Connectable { Vendor addVendor(String name); void remove(Vendor vendor); - default int count(){ + default long count(){ return get().size(); } diff --git a/core/src/main/java/ru/trader/core/PlacesWrapper.java b/core/src/main/java/ru/trader/core/PlacesWrapper.java index a7bef30..a40e8d4 100644 --- a/core/src/main/java/ru/trader/core/PlacesWrapper.java +++ b/core/src/main/java/ru/trader/core/PlacesWrapper.java @@ -16,7 +16,7 @@ public class PlacesWrapper extends AbstractCollection { this.includeTransit = includeTransit; size = 0; for (Place place : places) { - int count = place.count(); + long count = place.count(); size += count > 0 ? count : includeTransit ? 1 : 0; } } diff --git a/core/src/main/java/ru/trader/store/berkeley/PlaceProxy.java b/core/src/main/java/ru/trader/store/berkeley/PlaceProxy.java index 59950bd..08da317 100644 --- a/core/src/main/java/ru/trader/store/berkeley/PlaceProxy.java +++ b/core/src/main/java/ru/trader/store/berkeley/PlaceProxy.java @@ -10,10 +10,12 @@ import java.util.Collection; public class PlaceProxy extends AbstractPlace { private final BDBPlace place; private BDBStore store; + private long count; public PlaceProxy(BDBPlace place, BDBStore store) { this.place = place; this.store = store; + count = -1; } public PlaceProxy(BDBPlace place, BDBMarket market, BDBStore store) { @@ -49,11 +51,13 @@ public class PlaceProxy extends AbstractPlace { @Override protected void addVendor(Vendor vendor) { store.getVendorAccessor().put(((VendorProxy)vendor).getEntity()); + if (count != -1) count++; } @Override protected void removeVendor(Vendor vendor) { store.getVendorAccessor().delete(((VendorProxy)vendor).getEntity()); + if (count != -1) count--; } @Override @@ -81,6 +85,22 @@ public class PlaceProxy extends AbstractPlace { return store.getVendorAccessor().getAllByPlace(place.getId()); } + @Override + public long count() { + if (count == -1){ + count = store.getVendorAccessor().count(place.getId()); + } + return count; + } + + @Override + public boolean isEmpty() { + if (count > -1){ + return count == 0; + } + return !store.getVendorAccessor().contains(place.getId()); + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/core/src/main/java/ru/trader/store/berkeley/VendorProxy.java b/core/src/main/java/ru/trader/store/berkeley/VendorProxy.java index 16624f3..25184c3 100644 --- a/core/src/main/java/ru/trader/store/berkeley/VendorProxy.java +++ b/core/src/main/java/ru/trader/store/berkeley/VendorProxy.java @@ -18,22 +18,34 @@ public class VendorProxy extends AbstractVendor { public VendorProxy(BDBVendor vendor, BDBStore store) { this.vendor = vendor; this.store = store; - init(); } - private void init(){ + private void initSellCache(){ sell = new ConcurrentHashMap<>(20, 0.9f, 2); - buy = new ConcurrentHashMap<>(20, 0.9f, 2); for (Offer offer : store.getOfferAccessor().getAllByType(vendor.getId(), OFFER_TYPE.SELL)) { sell.put(((ItemProxy)offer.getItem()).getId(), offer); } + } + + private void initBuyCache(){ + buy = new ConcurrentHashMap<>(20, 0.9f, 2); for (Offer offer : store.getOfferAccessor().getAllByType(vendor.getId(), OFFER_TYPE.BUY)) { buy.put(((ItemProxy)offer.getItem()).getId(), offer); } } private Map getCache(OFFER_TYPE type){ - return type == OFFER_TYPE.SELL ? sell : buy; + if (type == OFFER_TYPE.SELL){ + if (sell == null){ + initSellCache(); + } + return sell; + } else { + if (buy == null){ + initBuyCache(); + } + return buy; + } } protected long getId(){ diff --git a/core/src/main/java/ru/trader/store/berkeley/dao/VendorDA.java b/core/src/main/java/ru/trader/store/berkeley/dao/VendorDA.java index cc0caa8..8921833 100644 --- a/core/src/main/java/ru/trader/store/berkeley/dao/VendorDA.java +++ b/core/src/main/java/ru/trader/store/berkeley/dao/VendorDA.java @@ -30,6 +30,14 @@ public class VendorDA { return DAUtils.getAll(indexByPlaceId, placeId, convertFunc); } + public boolean contains(long placeId){ + return indexByPlaceId.contains(placeId); + } + + public long count(long placeId){ + return indexByPlaceId.subIndex(placeId).count(); + } + public BDBVendor put(BDBVendor vendor){ return indexById.put(vendor); }