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;
}
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){
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<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);
VendorsGraph vGraph = new VendorsGraph(scorer, callback);
LOG.trace("Build vendors graph");

View File

@@ -192,7 +192,9 @@ public class MarketAnalyzer {
while (iterator.hasNext()){
Vendor vendor = iterator.next();
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);
callback.inc();
}
@@ -200,44 +202,66 @@ public class MarketAnalyzer {
return top;
}
public Collection<Route> getLoops(Vendor vendor, int limit){
return searcher.getLoops(vendor, getVendors(), limit);
public Collection<Route> getLoops(Vendor vendor, CrawlerSpecificator specificator){
return searcher.searchLoops(vendor, getVendors(), specificator);
}
public Collection<Route> getRoutes(Place from){
return searcher.getRoutes(getVendors(from), getVendors());
public Collection<Route> getRoutes(Place from, CrawlerSpecificator specificator){
return getRoutes(getVendors(from), getVendors(), specificator);
}
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){
return searcher.getRoutes(getVendors(from), Collections.singleton(to), getVendors());
public Collection<Route> getRoutes(Place from, Place to, CrawlerSpecificator specificator){
specificator.any(getVendors(to));
return getRoutes(from, specificator);
}
public Collection<Route> getRoutes(Vendor from){
return searcher.getRoutes(from, getVendors());
public Collection<Route> getRoutes(Vendor from, CrawlerSpecificator specificator){
specificator.any(getVendors());
return searcher.search(from, from, getVendors(), profile.getRoutesCount(), specificator);
}
public Collection<Route> getRoutes(Vendor from, Place to){
return searcher.getRoutes(Collections.singleton(from), getVendors(to), getVendors());
public Collection<Route> getRoutes(Vendor from, Place to, CrawlerSpecificator specificator){
specificator.any(getVendors(to));
return searcher.search(from, from, getVendors(), profile.getRoutesCount(), specificator);
}
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) {
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<Route> paths = searcher.getRoutes(from, vendors);
Optional<Route> route = paths.stream().filter(p -> p.contains(vendors)).findFirst();
if (route.isPresent() && (res == null || res.compareTo(route.get()) > 0)){
res = route.get();
Collection<Route> 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);
}
}

View File

@@ -83,7 +83,9 @@ public class RouteSearcherTest extends Assert{
assertEquals(72.42, route.getDistance(), 0.01);
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,
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<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());
Collection<Vendor> vendors = new ArrayList<>(40);
apaths.forEach(route -> {