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

Annotation of /dao/FuldDaekningWorker/src/main/java/dk/daoas/fulddaekning/LookupWorker.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2755 - (hide annotations) (download)
Tue Oct 20 10:36:06 2015 UTC (8 years, 7 months ago) by torben
File size: 4646 byte(s)
warn if table lookup returned a different number of results than expected
1 torben 2711 package dk.daoas.fulddaekning;
2    
3     import java.sql.SQLException;
4 torben 2744 import java.util.ArrayList;
5 torben 2711 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 torben 2744 import ags.utils.dataStructures.MaxHeap;
14     import ags.utils.dataStructures.trees.thirdGenKD.DistanceFunction;
15     import ags.utils.dataStructures.trees.thirdGenKD.KdTree;
16     import ags.utils.dataStructures.trees.thirdGenKD.SquareEuclideanDistanceFunction;
17 torben 2711 import dk.daoas.fulddaekning.osrm.OSRMHelper;
18    
19     public class LookupWorker implements Runnable {
20    
21 torben 2755 static final int MAX_RESULTS = 99;
22 torben 2711
23    
24    
25     final static Logger logger = Logger.getLogger( LookupWorker.class.toString() );
26    
27     OSRMHelper osrmHelper = new OSRMHelper();
28    
29     CyclicBarrier barrier;
30     Queue<Adresse> ikkeDaekkede;
31     Map<Short, KdTree<Adresse>> hoTrees;
32     Database db;
33     Constants consts;
34    
35     AtomicInteger antalFundne;
36    
37     int workerID;
38     boolean verbose;
39    
40 torben 2744 DistanceFunction dist = new SquareEuclideanDistanceFunction();
41    
42 torben 2711 public LookupWorker(int workerID,
43     CyclicBarrier barrier,
44     Queue<Adresse> ikkeDaekkede,
45     Map<Short, KdTree<Adresse>> hoTrees,
46     AtomicInteger antalFundne,
47     Database db,
48     boolean verbose,
49     Constants consts) {
50    
51     this.workerID = workerID;
52     this.barrier = barrier;
53     this.ikkeDaekkede = ikkeDaekkede;
54     this.hoTrees = hoTrees;
55     this.antalFundne = antalFundne;
56     this.db = db;
57     this.verbose = verbose;
58     this.consts = consts;
59    
60     }
61    
62    
63     @Override
64     public void run() {
65     System.out.println( "Worker/" + workerID + " starting");
66    
67 torben 2722 try {
68     while ( ! ikkeDaekkede.isEmpty() ) {
69 torben 2713
70 torben 2722 Adresse qAdresse = ikkeDaekkede.remove();
71 torben 2711
72 torben 2722 short ho = qAdresse.ho;
73     KdTree<Adresse> addressTree = hoTrees.get(ho);
74 torben 2711
75 torben 2744 MaxHeap<Adresse> res = addressTree.findNearestNeighbors(qAdresse.xyz, MAX_RESULTS, dist);
76     //Collection<Adresse> res = addressTree.nearestNeighbourSearch(MAX_RESULTS, qAdresse);
77     int size = res.size();
78     if (size > MAX_RESULTS ) {
79 torben 2722 System.out.println("Returnerede mere end MAX_RESULTS> " + res.size() );
80     System.exit(0);
81     }
82 torben 2744
83     ArrayList<Adresse> adrList = new ArrayList<Adresse>();
84 torben 2711
85 torben 2744 for (int i=0; i<size; i++) {
86     Adresse a = res.getMax();
87     adrList.add(a);
88     res.removeMax();
89     }
90     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
91     double bedsteAfstand = GeoPointHelper.beregnAfstand(qAdresse, bedsteAdr);
92 torben 2711
93 torben 2722
94 torben 2753 if ( LookupMain.use_osrm == true) {
95     //Hvis at den er inden for afstand, så prøver vi at lave findNærmste på vej distancen
96     if (bedsteAfstand <= consts.getMaxDistance()) {
97     //Adresse bedsteAdr2 = osrmHelper.getNearestViarouteHttp(qAdresse, res);
98     //Adresse bedsteAdr2 = osrmHelper.getNearestViarouteJni(qAdresse, res);
99     Adresse bedsteAdr2 = osrmHelper.getNearestTableHttp(qAdresse, adrList);
100     //Adresse bedsteAdr2 = osrmHelper.getNearestTableJni(qAdresse, res);
101    
102     if (bedsteAdr2 != null) {
103     bedsteAdr = bedsteAdr2;
104     bedsteAfstand = GeoPointHelper.beregnAfstand(qAdresse, bedsteAdr);
105     } else {
106     logger.info("OSRM returned null for " + qAdresse);
107     }
108 torben 2722 }
109 torben 2718 }
110 torben 2711
111 torben 2753
112 torben 2718
113 torben 2711
114 torben 2718
115 torben 2711 if (bedsteAfstand <= consts.getMaxDistance() ) { //Gem kun hvis distancen er under max_distance for distributøren
116     if (verbose == true) {
117     logger.fine("(" +workerID + ") Bedste: " + qAdresse + "==>" + bedsteAdr + " ::: " + bedsteAfstand );
118     }
119    
120     antalFundne.incrementAndGet();
121    
122     try {
123     db.gemResultat(qAdresse, bedsteAdr, bedsteAfstand);
124     } catch (SQLException e) {
125     logger.log(Level.WARNING, "Error saving result", e);
126     logger.warning("Shutting down");
127    
128     System.exit(0); //hvis at indsættelsen fejler skal vi afbryde med det samme
129     }
130     } else {
131     if (verbose == true) {
132     System.out.println("For stor afstand: " + qAdresse + " > " + bedsteAfstand);
133     }
134     }
135    
136 torben 2722 }
137    
138     } catch (Exception e) {
139     logger.log( Level.SEVERE, "Worker/" + workerID, e);
140 torben 2711 }
141    
142 torben 2722
143    
144 torben 2711 try {
145 torben 2722 logger.info( "Worker/" + workerID + " afventer barrier");
146 torben 2711 barrier.await();
147     } catch (BrokenBarrierException e) {
148     logger.log(Level.SEVERE, e.getMessage(), e);
149     System.exit(-1);
150     } catch(InterruptedException e) {
151 torben 2719 logger.log(Level.SEVERE, e.getMessage(), e);
152 torben 2711 }
153    
154    
155     System.out.println( "Worker/" + workerID + " stopping");
156     }
157    
158     }

  ViewVC Help
Powered by ViewVC 1.1.20