From ce6f6bf8d868eebb730dda5f714a5d9e2e2975de Mon Sep 17 00:00:00 2001 From: iMoHax Date: Wed, 9 Sep 2015 15:24:19 +0300 Subject: [PATCH] refactoring searcher --- .../ru/trader/analysis/RouteSearcher.java | 37 +--------- .../java/ru/trader/core/MarketAnalyzer.java | 67 +++++++++++++------ .../ru/trader/analysis/RouteSearcherTest.java | 8 ++- 3 files changed, 54 insertions(+), 58 deletions(-) diff --git a/core/src/main/java/ru/trader/analysis/RouteSearcher.java b/core/src/main/java/ru/trader/analysis/RouteSearcher.java index fa52785..441b13c 100644 --- a/core/src/main/java/ru/trader/analysis/RouteSearcher.java +++ b/core/src/main/java/ru/trader/analysis/RouteSearcher.java @@ -61,41 +61,6 @@ public class RouteSearcher { return paths; } - public List getRoutes(Collection fVendors, Collection vendors){ - return getRoutes(fVendors, vendors, vendors); - } - - public List getRoutes(Collection fVendors, Collection toVendors, Collection vendors){ - List res = new LimitedQueue<>(scorer.getProfile().getRoutesCount()); - int count = (int) Math.ceil(scorer.getProfile().getRoutesCount() / fVendors.size()); - CrawlerSpecificator specificator = new CrawlerSpecificator(); - specificator.any(toVendors); - for (Vendor fromVendor : fVendors) { - Collection routes = search(fromVendor, fromVendor, vendors, count, specificator); - res.addAll(routes); - } - return res; - } - - public List getRoutes(Vendor from, Collection vendors){ - CrawlerSpecificator specificator = new CrawlerSpecificator(); - specificator.any(vendors); - return search(from, from, vendors, scorer.getProfile().getRoutesCount(), specificator); - } - - public List getRoutes(Vendor from, Vendor to, Collection vendors){ - return getRoutes(from, to, vendors, scorer.getProfile().getRoutesCount()); - } - - public List getRoutes(Vendor source, Vendor target, Collection vendors, int count){ - return search(source, target, vendors, count, new CrawlerSpecificator()); - } - - - public List getLoops(Vendor source, Collection vendors, int count){ - return searchLoops(source, vendors, count, new CrawlerSpecificator()); - } - public List search(Vendor source, Vendor target, Collection vendors, int count, CrawlerSpecificator specificator){ LOG.trace("Start search route from {} to {}", source, target); VendorsGraph vGraph = new VendorsGraph(scorer, callback); @@ -109,7 +74,7 @@ public class RouteSearcher { return collector.get(); } - public List searchLoops(Vendor source, Collection vendors, int count, CrawlerSpecificator specificator){ + public List searchLoops(Vendor source, Collection vendors, CrawlerSpecificator specificator){ LOG.trace("Start search loops from {}", source); VendorsGraph vGraph = new VendorsGraph(scorer, callback); LOG.trace("Build vendors graph"); diff --git a/core/src/main/java/ru/trader/core/MarketAnalyzer.java b/core/src/main/java/ru/trader/core/MarketAnalyzer.java index dac6e31..5e203dd 100644 --- a/core/src/main/java/ru/trader/core/MarketAnalyzer.java +++ b/core/src/main/java/ru/trader/core/MarketAnalyzer.java @@ -192,7 +192,9 @@ public class MarketAnalyzer { while (iterator.hasNext()){ Vendor vendor = iterator.next(); if (callback.isCancel()) break; - Collection paths = searcher.getRoutes(vendor, vendor, vendors, 3); + CrawlerSpecificator specificator = new CrawlerSpecificator(); + specificator.target(vendor); + Collection paths = searcher.search(vendor, vendor, vendors, 3, specificator); top.addAll(paths); callback.inc(); } @@ -200,44 +202,66 @@ public class MarketAnalyzer { return top; } - public Collection getLoops(Vendor vendor, int limit){ - return searcher.getLoops(vendor, getVendors(), limit); + public Collection getLoops(Vendor vendor, CrawlerSpecificator specificator){ + return searcher.searchLoops(vendor, getVendors(), specificator); } - public Collection getRoutes(Place from){ - return searcher.getRoutes(getVendors(from), getVendors()); + public Collection getRoutes(Place from, CrawlerSpecificator specificator){ + return getRoutes(getVendors(from), getVendors(), specificator); } public Collection getRoutes(Place from, Place to){ - return searcher.getRoutes(getVendors(from), getVendors(to), getVendors()); + return getRoutes(from, to, new CrawlerSpecificator()); } - public Collection getRoutes(Place from, Vendor to){ - return searcher.getRoutes(getVendors(from), Collections.singleton(to), getVendors()); + public Collection getRoutes(Place from, Place to, CrawlerSpecificator specificator){ + specificator.any(getVendors(to)); + return getRoutes(from, specificator); } - public Collection getRoutes(Vendor from){ - return searcher.getRoutes(from, getVendors()); + public Collection getRoutes(Vendor from, CrawlerSpecificator specificator){ + specificator.any(getVendors()); + return searcher.search(from, from, getVendors(), profile.getRoutesCount(), specificator); } - public Collection getRoutes(Vendor from, Place to){ - return searcher.getRoutes(Collections.singleton(from), getVendors(to), getVendors()); + public Collection getRoutes(Vendor from, Place to, CrawlerSpecificator specificator){ + specificator.any(getVendors(to)); + return searcher.search(from, from, getVendors(), profile.getRoutesCount(), specificator); } public Collection getRoutes(Vendor from, Vendor to){ - return searcher.getRoutes(from, to, getVendors()); + CrawlerSpecificator specificator = new CrawlerSpecificator(); + specificator.target(to); + return getRoutes(from, to, specificator); + } + + public Collection getRoutes(Vendor from, Vendor to, CrawlerSpecificator specificator){ + return searcher.search(from, to, getVendors(), profile.getRoutesCount(), specificator); + } + + public List getRoutes(Collection fVendors, Collection vendors, CrawlerSpecificator specificator){ + List res = new LimitedQueue<>(profile.getRoutesCount()); + int count = (int) Math.ceil(profile.getRoutesCount() / fVendors.size()); + for (Vendor fromVendor : fVendors) { + Collection routes = searcher.search(fromVendor, fromVendor, vendors, count, specificator); + res.addAll(routes); + } + return res; } public Route getRoute(Collection vendors) { Route res = null; callback.start(vendors.size()); + CrawlerSpecificator specificator = new CrawlerSpecificator(); + specificator.all(vendors); for (Vendor from : vendors) { - //TODO: implement search with constant length - Collection paths = searcher.getRoutes(from, vendors); - Optional route = paths.stream().filter(p -> p.contains(vendors)).findFirst(); - if (route.isPresent() && (res == null || res.compareTo(route.get()) > 0)){ - res = route.get(); + Collection routes = searcher.search(from, from, vendors, 1, specificator); + if (!routes.isEmpty()){ + Route route = routes.iterator().next(); + if (res == null || res.compareTo(route) < 0){ + res = route; + } } callback.inc(); } @@ -271,7 +295,12 @@ public class MarketAnalyzer { return vendors; } - public MarketAnalyzer changeCallBack(AnalysisCallBack callback){ + public MarketAnalyzer newInstance(Profile profile, AnalysisCallBack callback){ return new MarketAnalyzer(market, profile, callback); } + + public MarketAnalyzer newInstance(AnalysisCallBack callback){ + return new MarketAnalyzer(market, profile, callback); + } + } diff --git a/core/src/test/java/ru/trader/analysis/RouteSearcherTest.java b/core/src/test/java/ru/trader/analysis/RouteSearcherTest.java index 094d973..0ab2e6c 100644 --- a/core/src/test/java/ru/trader/analysis/RouteSearcherTest.java +++ b/core/src/test/java/ru/trader/analysis/RouteSearcherTest.java @@ -83,7 +83,9 @@ public class RouteSearcherTest extends Assert{ assertEquals(72.42, route.getDistance(), 0.01); Collection world = fWorld.getMarkets(true).collect(Collectors.toList()); - List apaths = searcher.getRoutes(ithaca_st, ithaca_st, world); + CrawlerSpecificator specificator = new CrawlerSpecificator(); + specificator.target(ithaca_st); + List apaths = searcher.search(ithaca_st, ithaca_st, world, 10, specificator); /* List apaths = searcher.getRoutes(ithaca_st, ithaca_st, Arrays.asList(ithaca_st, lhs3262_st, morgor_st, lhs3006_st, ithaca.asTransit(), lhs3262.asTransit(), morgor.asTransit(), lhs3006.asTransit())); @@ -111,7 +113,7 @@ public class RouteSearcherTest extends Assert{ assertEquals(4, route.getLands()); assertEquals(109.51, route.getDistance(), 0.01); - apaths = searcher.getRoutes(ithaca_st, ithaca_st, world); + apaths = searcher.search(ithaca_st, ithaca_st, world, 10, specificator); actual = apaths.stream().findFirst().get(); assertEquals(route, actual); @@ -170,7 +172,7 @@ public class RouteSearcherTest extends Assert{ Vendor ithaca_st = ithaca.get().iterator().next(); Collection world = fWorld.getMarkets(true).collect(Collectors.toList()); - List apaths = searcher.getLoops(ithaca_st, world, profile.getRoutesCount()); + List apaths = searcher.searchLoops(ithaca_st, world, new CrawlerSpecificator()); assertEquals(39, apaths.size()); Collection vendors = new ArrayList<>(40); apaths.forEach(route -> {