diff --git a/core/src/main/java/ru/trader/analysis/CrawlerSpecificator.java b/core/src/main/java/ru/trader/analysis/CrawlerSpecificator.java index fbc8da6..23ff359 100644 --- a/core/src/main/java/ru/trader/analysis/CrawlerSpecificator.java +++ b/core/src/main/java/ru/trader/analysis/CrawlerSpecificator.java @@ -62,6 +62,10 @@ public class CrawlerSpecificator { } } + public void buy(Offer offer){ + offers.add(offer); + } + public void buy(Collection offers){ this.offers.addAll(offers); } @@ -70,6 +74,21 @@ public class CrawlerSpecificator { this.groupCount = groupCount; } + public int getMinHop(){ + return all.size() + (any.isEmpty() ? 0 : 1) + (containsAny.isEmpty() ? 0 : 1) + offers.size()/4 ; + } + + public boolean contains(Vendor vendor){ + boolean res = all.contains(vendor) || any.contains(vendor) || containsAny.contains(vendor); + if (res) return true; + for (Offer offer : offers) { + Offer sell = vendor.getSell(offer.getItem()); + res = sell != null && sell.getCount() >= offer.getCount(); + if (res) return true; + } + return false; + } + private RouteSpecification buildOffersSpec(Collection vendors){ RouteSpecification res = null; for (Offer offer : offers) { diff --git a/core/src/main/java/ru/trader/analysis/RouteSpecificationByTargets.java b/core/src/main/java/ru/trader/analysis/RouteSpecificationByTargets.java index ec4e097..11b2a7d 100644 --- a/core/src/main/java/ru/trader/analysis/RouteSpecificationByTargets.java +++ b/core/src/main/java/ru/trader/analysis/RouteSpecificationByTargets.java @@ -5,6 +5,7 @@ import ru.trader.analysis.graph.Traversal; import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; import java.util.Iterator; public class RouteSpecificationByTargets implements RouteSpecification { @@ -15,7 +16,7 @@ public class RouteSpecificationByTargets implements RouteSpecification { private RouteSpecificationByTargets(Collection targets, boolean all, boolean targetOnly) { this.all = all; this.targetOnly = targetOnly; - this.targets = new ArrayList<>(targets); + this.targets = new HashSet<>(targets); } @Override diff --git a/core/src/main/java/ru/trader/core/MarketAnalyzer.java b/core/src/main/java/ru/trader/core/MarketAnalyzer.java index 5e203dd..a8714f1 100644 --- a/core/src/main/java/ru/trader/core/MarketAnalyzer.java +++ b/core/src/main/java/ru/trader/core/MarketAnalyzer.java @@ -186,7 +186,7 @@ public class MarketAnalyzer { public Collection getTopRoutes(int limit){ LOG.debug("Get top {}", limit); LimitedQueue top = new LimitedQueue<>(limit); - Collection vendors = getVendors(); + Collection vendors = getVendors(new CrawlerSpecificator()); callback.start(vendors.size()); Iterator iterator = market.getMarkets(false).iterator(); while (iterator.hasNext()){ @@ -203,11 +203,11 @@ public class MarketAnalyzer { } public Collection getLoops(Vendor vendor, CrawlerSpecificator specificator){ - return searcher.searchLoops(vendor, getVendors(), specificator); + return searcher.searchLoops(vendor, getVendors(specificator), specificator); } public Collection getRoutes(Place from, CrawlerSpecificator specificator){ - return getRoutes(getVendors(from), getVendors(), specificator); + return getRoutes(getVendors(from), getVendors(specificator), specificator); } public Collection getRoutes(Place from, Place to){ @@ -220,13 +220,14 @@ public class MarketAnalyzer { } public Collection getRoutes(Vendor from, CrawlerSpecificator specificator){ - specificator.any(getVendors()); - return searcher.search(from, from, getVendors(), profile.getRoutesCount(), specificator); + Collection vendors = getVendors(specificator); + specificator.any(vendors); + return searcher.search(from, from, vendors, profile.getRoutesCount(), specificator); } public Collection getRoutes(Vendor from, Place to, CrawlerSpecificator specificator){ specificator.any(getVendors(to)); - return searcher.search(from, from, getVendors(), profile.getRoutesCount(), specificator); + return searcher.search(from, from, getVendors(specificator), profile.getRoutesCount(), specificator); } public Collection getRoutes(Vendor from, Vendor to){ @@ -236,7 +237,7 @@ public class MarketAnalyzer { } public Collection getRoutes(Vendor from, Vendor to, CrawlerSpecificator specificator){ - return searcher.search(from, to, getVendors(), profile.getRoutesCount(), specificator); + return searcher.search(from, to, getVendors(specificator), profile.getRoutesCount(), specificator); } public List getRoutes(Collection fVendors, Collection vendors, CrawlerSpecificator specificator){ @@ -283,7 +284,13 @@ public class MarketAnalyzer { return market.get().collect(Collectors.toList()); } - private List getVendors(){ + private List getVendors(CrawlerSpecificator specificator){ + List vendors; + if (specificator.getMinHop() >= profile.getLands()){ + vendors = market.get().map(Place::asTransit).collect(Collectors.toList()); + market.getVendors().filter(specificator::contains).forEach(vendors::add); + return vendors; + } return market.getMarkets(true).collect(Collectors.toList()); }