/[projects]/dao/FuldDaekningWorker/src/dk/daoas/fulddaekning/LookupWorker.java
ViewVC logotype

Contents of /dao/FuldDaekningWorker/src/dk/daoas/fulddaekning/LookupWorker.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2718 - (show annotations) (download)
Mon Sep 28 11:09:33 2015 UTC (8 years, 7 months ago) by torben
File size: 3346 byte(s)
Det er ikke alle tilfælde hvor at det kan betale sig at lave beregning af vej-afstand
1 package dk.daoas.fulddaekning;
2
3 import java.sql.SQLException;
4 import java.util.Collection;
5 import java.util.Map;
6 import java.util.Queue;
7 import java.util.concurrent.BrokenBarrierException;
8 import java.util.concurrent.CyclicBarrier;
9 import java.util.concurrent.atomic.AtomicInteger;
10 import java.util.logging.Level;
11 import java.util.logging.Logger;
12
13 import com.jwetherell.algorithms.data_structures.KdTree;
14
15 import dk.daoas.fulddaekning.osrm.OSRMHelper;
16
17 public class LookupWorker implements Runnable {
18
19 static final int MAX_RESULTS = 100;
20
21
22
23 final static Logger logger = Logger.getLogger( LookupWorker.class.toString() );
24
25 OSRMHelper osrmHelper = new OSRMHelper();
26
27 CyclicBarrier barrier;
28 Queue<Adresse> ikkeDaekkede;
29 Map<Short, KdTree<Adresse>> hoTrees;
30 Database db;
31 Constants consts;
32
33 AtomicInteger antalFundne;
34
35 int workerID;
36 boolean verbose;
37
38 public LookupWorker(int workerID,
39 CyclicBarrier barrier,
40 Queue<Adresse> ikkeDaekkede,
41 Map<Short, KdTree<Adresse>> hoTrees,
42 AtomicInteger antalFundne,
43 Database db,
44 boolean verbose,
45 Constants consts) {
46
47 this.workerID = workerID;
48 this.barrier = barrier;
49 this.ikkeDaekkede = ikkeDaekkede;
50 this.hoTrees = hoTrees;
51 this.antalFundne = antalFundne;
52 this.db = db;
53 this.verbose = verbose;
54 this.consts = consts;
55
56 }
57
58
59 @Override
60 public void run() {
61 System.out.println( "Worker/" + workerID + " starting");
62
63 while ( ! ikkeDaekkede.isEmpty() ) {
64
65 Adresse qAdresse = ikkeDaekkede.remove();
66
67 short ho = qAdresse.ho;
68 KdTree<Adresse> addressTree = hoTrees.get(ho);
69
70 Collection<Adresse> res = addressTree.nearestNeighbourSearch(MAX_RESULTS, qAdresse);
71 if (res.size() > MAX_RESULTS ) {
72 System.out.println("Returnerede mere end MAX_RESULTS> " + res.size() );
73 System.exit(0);
74 }
75
76
77 Adresse bedsteAdr = res.iterator().next(); //Tag første element
78 double bedsteAfstand = GeoPointHelper.beregnAfstand(qAdresse, bedsteAdr);
79
80 //Hvis at den er inden for afstand, så prøver vi at lave findNærmste på vej distancen
81 if (bedsteAfstand <= consts.getMaxDistance()) {
82 bedsteAdr = osrmHelper.getNearestViaTable(qAdresse, res);
83 bedsteAfstand = GeoPointHelper.beregnAfstand(qAdresse, bedsteAdr);
84 }
85
86
87
88
89
90 if (bedsteAfstand <= consts.getMaxDistance() ) { //Gem kun hvis distancen er under max_distance for distributøren
91 if (verbose == true) {
92 logger.fine("(" +workerID + ") Bedste: " + qAdresse + "==>" + bedsteAdr + " ::: " + bedsteAfstand );
93 }
94
95 antalFundne.incrementAndGet();
96
97 try {
98 db.gemResultat(qAdresse, bedsteAdr, bedsteAfstand);
99 } catch (SQLException e) {
100 logger.log(Level.WARNING, "Error saving result", e);
101 logger.warning("Shutting down");
102
103 System.exit(0); //hvis at indsættelsen fejler skal vi afbryde med det samme
104 }
105 } else {
106 if (verbose == true) {
107 System.out.println("For stor afstand: " + qAdresse + " > " + bedsteAfstand);
108 }
109 }
110
111 }
112
113 try {
114 barrier.await();
115 } catch (BrokenBarrierException e) {
116 logger.log(Level.SEVERE, e.getMessage(), e);
117 System.exit(-1);
118 } catch(InterruptedException e) {
119 //Do nothing
120 }
121
122
123 System.out.println( "Worker/" + workerID + " stopping");
124 }
125
126 }

  ViewVC Help
Powered by ViewVC 1.1.20