package dk.daoas.fulddaekning; import java.sql.SQLException; import java.util.ArrayList; import java.util.Map; import java.util.Queue; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; import ags.utils.dataStructures.MaxHeap; import ags.utils.dataStructures.trees.thirdGenKD.DistanceFunction; import ags.utils.dataStructures.trees.thirdGenKD.KdTree; import ags.utils.dataStructures.trees.thirdGenKD.SquareEuclideanDistanceFunction; import dk.daoas.fulddaekning.osrm.OSRMHelper; public class LookupWorker implements Runnable { static final int MAX_RESULTS = 100; final static Logger logger = Logger.getLogger( LookupWorker.class.toString() ); OSRMHelper osrmHelper = new OSRMHelper(); CyclicBarrier barrier; Queue ikkeDaekkede; Map> hoTrees; Database db; Constants consts; AtomicInteger antalFundne; int workerID; boolean verbose; DistanceFunction dist = new SquareEuclideanDistanceFunction(); public LookupWorker(int workerID, CyclicBarrier barrier, Queue ikkeDaekkede, Map> hoTrees, AtomicInteger antalFundne, Database db, boolean verbose, Constants consts) { this.workerID = workerID; this.barrier = barrier; this.ikkeDaekkede = ikkeDaekkede; this.hoTrees = hoTrees; this.antalFundne = antalFundne; this.db = db; this.verbose = verbose; this.consts = consts; } @Override public void run() { System.out.println( "Worker/" + workerID + " starting"); try { while ( ! ikkeDaekkede.isEmpty() ) { Adresse qAdresse = ikkeDaekkede.remove(); short ho = qAdresse.ho; KdTree addressTree = hoTrees.get(ho); MaxHeap res = addressTree.findNearestNeighbors(qAdresse.xyz, MAX_RESULTS, dist); //Collection res = addressTree.nearestNeighbourSearch(MAX_RESULTS, qAdresse); int size = res.size(); if (size > MAX_RESULTS ) { System.out.println("Returnerede mere end MAX_RESULTS> " + res.size() ); System.exit(0); } ArrayList adrList = new ArrayList(); for (int i=0; i " + d); } Adresse bedsteAdr = adrList.get(size-1); //da det er en max-heap er det elementet med størst distance der er først og dermed den sidste der er tættest double bedsteAfstand = GeoPointHelper.beregnAfstand(qAdresse, bedsteAdr); /* //Hvis at den er inden for afstand, så prøver vi at lave findNærmste på vej distancen if (bedsteAfstand <= consts.getMaxDistance()) { //Adresse bedsteAdr2 = osrmHelper.getNearestViarouteHttp(qAdresse, res); //Adresse bedsteAdr2 = osrmHelper.getNearestViarouteJni(qAdresse, res); Adresse bedsteAdr2 = osrmHelper.getNearestTableHttp(qAdresse, res); //Adresse bedsteAdr2 = osrmHelper.getNearestTableJni(qAdresse, res); if (bedsteAdr2 != null) { bedsteAdr = bedsteAdr2; bedsteAfstand = GeoPointHelper.beregnAfstand(qAdresse, bedsteAdr); } else { logger.info("NearestViaTable returned null for " + qAdresse); } } */ if (bedsteAfstand <= consts.getMaxDistance() ) { //Gem kun hvis distancen er under max_distance for distributøren if (verbose == true) { logger.fine("(" +workerID + ") Bedste: " + qAdresse + "==>" + bedsteAdr + " ::: " + bedsteAfstand ); } antalFundne.incrementAndGet(); try { db.gemResultat(qAdresse, bedsteAdr, bedsteAfstand); } catch (SQLException e) { logger.log(Level.WARNING, "Error saving result", e); logger.warning("Shutting down"); System.exit(0); //hvis at indsættelsen fejler skal vi afbryde med det samme } } else { if (verbose == true) { System.out.println("For stor afstand: " + qAdresse + " > " + bedsteAfstand); } } } } catch (Exception e) { logger.log( Level.SEVERE, "Worker/" + workerID, e); } try { logger.info( "Worker/" + workerID + " afventer barrier"); barrier.await(); } catch (BrokenBarrierException e) { logger.log(Level.SEVERE, e.getMessage(), e); System.exit(-1); } catch(InterruptedException e) { logger.log(Level.SEVERE, e.getMessage(), e); } System.out.println( "Worker/" + workerID + " stopping"); } }