Archived
0

refactoring searcher

This commit is contained in:
iMoHax
2015-09-09 15:24:19 +03:00
parent 5c1a31f992
commit ce6f6bf8d8
3 changed files with 54 additions and 58 deletions

View File

@@ -61,41 +61,6 @@ public class RouteSearcher {
return paths; return paths;
} }
public List<Route> getRoutes(Collection<Vendor> fVendors, Collection<Vendor> vendors){
return getRoutes(fVendors, vendors, vendors);
}
public List<Route> getRoutes(Collection<Vendor> fVendors, Collection<Vendor> toVendors, Collection<Vendor> vendors){
List<Route> 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<Route> routes = search(fromVendor, fromVendor, vendors, count, specificator);
res.addAll(routes);
}
return res;
}
public List<Route> getRoutes(Vendor from, Collection<Vendor> vendors){
CrawlerSpecificator specificator = new CrawlerSpecificator();
specificator.any(vendors);
return search(from, from, vendors, scorer.getProfile().getRoutesCount(), specificator);
}
public List<Route> getRoutes(Vendor from, Vendor to, Collection<Vendor> vendors){
return getRoutes(from, to, vendors, scorer.getProfile().getRoutesCount());
}
public List<Route> getRoutes(Vendor source, Vendor target, Collection<Vendor> vendors, int count){
return search(source, target, vendors, count, new CrawlerSpecificator());
}
public List<Route> getLoops(Vendor source, Collection<Vendor> vendors, int count){
return searchLoops(source, vendors, count, new CrawlerSpecificator());
}
public List<Route> search(Vendor source, Vendor target, Collection<Vendor> vendors, int count, CrawlerSpecificator specificator){ public List<Route> search(Vendor source, Vendor target, Collection<Vendor> vendors, int count, CrawlerSpecificator specificator){
LOG.trace("Start search route from {} to {}", source, target); LOG.trace("Start search route from {} to {}", source, target);
VendorsGraph vGraph = new VendorsGraph(scorer, callback); VendorsGraph vGraph = new VendorsGraph(scorer, callback);
@@ -109,7 +74,7 @@ public class RouteSearcher {
return collector.get(); return collector.get();
} }
public List<Route> searchLoops(Vendor source, Collection<Vendor> vendors, int count, CrawlerSpecificator specificator){ public List<Route> searchLoops(Vendor source, Collection<Vendor> vendors, CrawlerSpecificator specificator){
LOG.trace("Start search loops from {}", source); LOG.trace("Start search loops from {}", source);
VendorsGraph vGraph = new VendorsGraph(scorer, callback); VendorsGraph vGraph = new VendorsGraph(scorer, callback);
LOG.trace("Build vendors graph"); LOG.trace("Build vendors graph");

View File

@@ -192,7 +192,9 @@ public class MarketAnalyzer {
while (iterator.hasNext()){ while (iterator.hasNext()){
Vendor vendor = iterator.next(); Vendor vendor = iterator.next();
if (callback.isCancel()) break; if (callback.isCancel()) break;
Collection<Route> paths = searcher.getRoutes(vendor, vendor, vendors, 3); CrawlerSpecificator specificator = new CrawlerSpecificator();
specificator.target(vendor);
Collection<Route> paths = searcher.search(vendor, vendor, vendors, 3, specificator);
top.addAll(paths); top.addAll(paths);
callback.inc(); callback.inc();
} }
@@ -200,44 +202,66 @@ public class MarketAnalyzer {
return top; return top;
} }
public Collection<Route> getLoops(Vendor vendor, int limit){ public Collection<Route> getLoops(Vendor vendor, CrawlerSpecificator specificator){
return searcher.getLoops(vendor, getVendors(), limit); return searcher.searchLoops(vendor, getVendors(), specificator);
} }
public Collection<Route> getRoutes(Place from){ public Collection<Route> getRoutes(Place from, CrawlerSpecificator specificator){
return searcher.getRoutes(getVendors(from), getVendors()); return getRoutes(getVendors(from), getVendors(), specificator);
} }
public Collection<Route> getRoutes(Place from, Place to){ public Collection<Route> getRoutes(Place from, Place to){
return searcher.getRoutes(getVendors(from), getVendors(to), getVendors()); return getRoutes(from, to, new CrawlerSpecificator());
} }
public Collection<Route> getRoutes(Place from, Vendor to){ public Collection<Route> getRoutes(Place from, Place to, CrawlerSpecificator specificator){
return searcher.getRoutes(getVendors(from), Collections.singleton(to), getVendors()); specificator.any(getVendors(to));
return getRoutes(from, specificator);
} }
public Collection<Route> getRoutes(Vendor from){ public Collection<Route> getRoutes(Vendor from, CrawlerSpecificator specificator){
return searcher.getRoutes(from, getVendors()); specificator.any(getVendors());
return searcher.search(from, from, getVendors(), profile.getRoutesCount(), specificator);
} }
public Collection<Route> getRoutes(Vendor from, Place to){ public Collection<Route> getRoutes(Vendor from, Place to, CrawlerSpecificator specificator){
return searcher.getRoutes(Collections.singleton(from), getVendors(to), getVendors()); specificator.any(getVendors(to));
return searcher.search(from, from, getVendors(), profile.getRoutesCount(), specificator);
} }
public Collection<Route> getRoutes(Vendor from, Vendor to){ public Collection<Route> 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<Route> getRoutes(Vendor from, Vendor to, CrawlerSpecificator specificator){
return searcher.search(from, to, getVendors(), profile.getRoutesCount(), specificator);
}
public List<Route> getRoutes(Collection<Vendor> fVendors, Collection<Vendor> vendors, CrawlerSpecificator specificator){
List<Route> res = new LimitedQueue<>(profile.getRoutesCount());
int count = (int) Math.ceil(profile.getRoutesCount() / fVendors.size());
for (Vendor fromVendor : fVendors) {
Collection<Route> routes = searcher.search(fromVendor, fromVendor, vendors, count, specificator);
res.addAll(routes);
}
return res;
} }
public Route getRoute(Collection<Vendor> vendors) { public Route getRoute(Collection<Vendor> vendors) {
Route res = null; Route res = null;
callback.start(vendors.size()); callback.start(vendors.size());
CrawlerSpecificator specificator = new CrawlerSpecificator();
specificator.all(vendors);
for (Vendor from : vendors) { for (Vendor from : vendors) {
//TODO: implement search with constant length Collection<Route> routes = searcher.search(from, from, vendors, 1, specificator);
Collection<Route> paths = searcher.getRoutes(from, vendors); if (!routes.isEmpty()){
Optional<Route> route = paths.stream().filter(p -> p.contains(vendors)).findFirst(); Route route = routes.iterator().next();
if (route.isPresent() && (res == null || res.compareTo(route.get()) > 0)){ if (res == null || res.compareTo(route) < 0){
res = route.get(); res = route;
}
} }
callback.inc(); callback.inc();
} }
@@ -271,7 +295,12 @@ public class MarketAnalyzer {
return vendors; return vendors;
} }
public MarketAnalyzer changeCallBack(AnalysisCallBack callback){ public MarketAnalyzer newInstance(Profile profile, AnalysisCallBack callback){
return new MarketAnalyzer(market, profile, callback); return new MarketAnalyzer(market, profile, callback);
} }
public MarketAnalyzer newInstance(AnalysisCallBack callback){
return new MarketAnalyzer(market, profile, callback);
}
} }

View File

@@ -83,7 +83,9 @@ public class RouteSearcherTest extends Assert{
assertEquals(72.42, route.getDistance(), 0.01); assertEquals(72.42, route.getDistance(), 0.01);
Collection<Vendor> world = fWorld.getMarkets(true).collect(Collectors.toList()); Collection<Vendor> world = fWorld.getMarkets(true).collect(Collectors.toList());
List<Route> apaths = searcher.getRoutes(ithaca_st, ithaca_st, world); CrawlerSpecificator specificator = new CrawlerSpecificator();
specificator.target(ithaca_st);
List<Route> apaths = searcher.search(ithaca_st, ithaca_st, world, 10, specificator);
/* List<Route> apaths = searcher.getRoutes(ithaca_st, ithaca_st, Arrays.asList(ithaca_st, lhs3262_st, /* List<Route> apaths = searcher.getRoutes(ithaca_st, ithaca_st, Arrays.asList(ithaca_st, lhs3262_st,
morgor_st, lhs3006_st, ithaca.asTransit(), lhs3262.asTransit(), morgor_st, lhs3006_st, ithaca.asTransit(), lhs3262.asTransit(),
morgor.asTransit(), lhs3006.asTransit())); morgor.asTransit(), lhs3006.asTransit()));
@@ -111,7 +113,7 @@ public class RouteSearcherTest extends Assert{
assertEquals(4, route.getLands()); assertEquals(4, route.getLands());
assertEquals(109.51, route.getDistance(), 0.01); 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(); actual = apaths.stream().findFirst().get();
assertEquals(route, actual); assertEquals(route, actual);
@@ -170,7 +172,7 @@ public class RouteSearcherTest extends Assert{
Vendor ithaca_st = ithaca.get().iterator().next(); Vendor ithaca_st = ithaca.get().iterator().next();
Collection<Vendor> world = fWorld.getMarkets(true).collect(Collectors.toList()); Collection<Vendor> world = fWorld.getMarkets(true).collect(Collectors.toList());
List<Route> apaths = searcher.getLoops(ithaca_st, world, profile.getRoutesCount()); List<Route> apaths = searcher.searchLoops(ithaca_st, world, new CrawlerSpecificator());
assertEquals(39, apaths.size()); assertEquals(39, apaths.size());
Collection<Vendor> vendors = new ArrayList<>(40); Collection<Vendor> vendors = new ArrayList<>(40);
apaths.forEach(route -> { apaths.forEach(route -> {