/[projects]/dao/DaoAdresseService/src/dk/daoas/daoadresseservice/AdressSearch.java
ViewVC logotype

Annotation of /dao/DaoAdresseService/src/dk/daoas/daoadresseservice/AdressSearch.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2288 - (hide annotations) (download)
Fri Feb 13 22:12:58 2015 UTC (9 years, 3 months ago) by torben
File size: 9247 byte(s)
Add benchmarking statements

1 torben 2267 package dk.daoas.daoadresseservice;
2    
3 torben 2274 import java.sql.SQLException;
4 torben 2267 import java.util.HashMap;
5 torben 2274 import java.util.List;
6     import java.util.Map;
7     import java.util.concurrent.ConcurrentHashMap;
8 torben 2267
9 torben 2274 import dk.daoas.daoadresseservice.AddressUtils.SplitResult;
10 torben 2282 import dk.daoas.daoadresseservice.beans.Address;
11     import dk.daoas.daoadresseservice.beans.ExtendedBean;
12     import dk.daoas.daoadresseservice.beans.HundredePctBean;
13     import dk.daoas.daoadresseservice.beans.SearchResult;
14     import dk.daoas.daoadresseservice.beans.SearchResult.Status;
15 torben 2274 import dk.daoas.daoadresseservice.db.DatabaseLayer;
16    
17 torben 2267 public class AdressSearch {
18    
19 torben 2274 Map<Integer, Map<String,Long>> searchPostnrVejnavnGadeid;
20     Map<Long, Map<String,Address>> searchGadeidentAdresser;
21    
22     List<Address> alleAdresser;
23 torben 2267
24    
25 torben 2280 Map<Integer,HundredePctBean> hundredePct;
26    
27    
28 torben 2274 public SearchResult search(String postnrStr, String adresse) {
29 torben 2288 long start1 = System.currentTimeMillis();
30    
31 torben 2274 int postnr=0;
32 torben 2267
33 torben 2274 try {
34     postnr = Integer.parseInt(postnrStr);
35     } catch (Exception E) {
36     return new SearchResult(Status.ERROR_UNKNOWN_POSTAL);
37     }
38 torben 2288 long start2 = System.currentTimeMillis();
39 torben 2274
40     Map<String,Long> postnrVeje = searchPostnrVejnavnGadeid.get(postnr);
41    
42 torben 2267 if (postnrVeje == null) {
43 torben 2274 return new SearchResult(Status.ERROR_UNKNOWN_POSTAL);
44 torben 2267 }
45    
46 torben 2288 long start3 = System.currentTimeMillis();
47    
48 torben 2274 SplitResult split = AddressUtils.splitAdresse(adresse);
49 torben 2288 String vasketVejnavn = AddressUtils.vaskVejnavn( split.vej );
50 torben 2267
51 torben 2274 if (split.husnr.length() == 0) {
52     return new SearchResult(Status.ERROR_MISSING_HOUSENUMBER);
53     }
54 torben 2288 long start4 = System.currentTimeMillis();
55 torben 2267
56 torben 2274 Long gadeident = postnrVeje.get(vasketVejnavn);
57     if (gadeident == null) {
58     return new SearchResult(Status.ERROR_UNKNOWN_STREETNAME);
59 torben 2288 }
60     long start5 = System.currentTimeMillis();
61 torben 2274
62     Map<String, Address> gade = searchGadeidentAdresser.get(gadeident); //Denne søgning må ikke fejle
63    
64 torben 2288 long start6 = System.currentTimeMillis();
65 torben 2274
66     String husnrSearch = "" + split.husnr + split.litra;
67     Address addr = gade.get(husnrSearch);
68 torben 2288 long start7 = System.currentTimeMillis();
69 torben 2274 if (addr == null) {
70     return new SearchResult(Status.ERROR_UNKNOWN_ADDRESSPOINT);
71     }
72 torben 2276
73     if (addr.daekningsType == DaekningsType.DAEKNING_IKKEDAEKKET) {
74     return new SearchResult(Status.STATUS_NOT_COVERED);
75     }
76 torben 2277
77     if (addr.distributor.equals("LUKKET")) {
78     return new SearchResult(Status.STATUS_NOT_COVERED); //Skal vi have en special status til Lukkede adresser ?
79     }
80 torben 2288
81     System.out.println("Search2: " + (start2-start1) );
82     System.out.println("Search3: " + (start3-start1) );
83     System.out.println("Search4: " + (start4-start1) );
84     System.out.println("Search5: " + (start5-start1) );
85     System.out.println("Search6: " + (start6-start1) );
86     System.out.println("Search7: " + (start7-start1) );
87    
88 torben 2274
89    
90     return new SearchResult(addr);
91 torben 2267 }
92    
93 torben 2274
94     public void buildSearchStructures() throws SQLException{
95     searchPostnrVejnavnGadeid = new HashMap<Integer, Map<String,Long>>();
96     searchGadeidentAdresser = new HashMap<Long, Map<String,Address>>();
97 torben 2285
98 torben 2276 System.out.println("Build -- stage 1");
99    
100 torben 2274 alleAdresser = DatabaseLayer.getAllAdresses();
101 torben 2276
102 torben 2286
103 torben 2285 /* Mapper mellem db Row ID og adresse noden */
104     Map<Integer,Address> idAddressMap = new HashMap<Integer,Address>( alleAdresser.size() );
105    
106 torben 2274 for (Address a : alleAdresser) {
107     idAddressMap.put(a.id, a);
108    
109     Map<String,Long> postnrVeje = searchPostnrVejnavnGadeid.get(a.postnr);
110    
111     if (postnrVeje == null) {
112     postnrVeje = new ConcurrentHashMap<String,Long>();
113     searchPostnrVejnavnGadeid.put(a.postnr, postnrVeje);
114     }
115    
116 torben 2281 String vasketVejnavn = AddressUtils.vaskVejnavn(a.vejnavn);
117     Long gadeident = postnrVeje.get(vasketVejnavn);
118 torben 2274 if (gadeident == null) {
119 torben 2281 postnrVeje.put(vasketVejnavn, a.gadeid);
120 torben 2274 }
121    
122     Map<String, Address> gade = searchGadeidentAdresser.get(a.gadeid);
123     if (gade == null) {
124     gade = new HashMap<String, Address>();
125     searchGadeidentAdresser.put(a.gadeid, gade);
126     }
127     String husnrSearch = "" + a.husnr + a.husnrbogstav;
128 torben 2286 gade.put(husnrSearch, a);
129 torben 2276 }
130    
131    
132 torben 2279 ////////////////////////////////////////////////////////////////////////////////////////
133     System.out.println("Build -- stage 2 udvidet dækning");
134    
135     List<ExtendedBean> extDao = DatabaseLayer.getExtendedAdresslist();
136 torben 2276 for (ExtendedBean eb : extDao) {
137 torben 2274
138 torben 2276 Address orgAddress = idAddressMap.get(eb.orgId);
139     if (orgAddress == null)
140     continue;
141    
142     Address targetAddress = idAddressMap.get(eb.targetId);
143     if (targetAddress == null)
144     continue;
145    
146 torben 2277 if (orgAddress.distributor != null && orgAddress.distributor.equals("LUKKET")) {
147     continue;
148     }
149    
150     if (targetAddress.distributor.equals("LUKKET")) {
151     continue;
152     }
153    
154 torben 2276 orgAddress.extTarget = targetAddress;
155     orgAddress.extAfstand = eb.afstand;
156    
157 torben 2283 boolean covered = false;
158     if (targetAddress.distributor.equals("DAO")) {
159     orgAddress.rute = calculateExtendedDaoRoute(eb,orgAddress,targetAddress);
160     if (orgAddress.rute != null) {
161     orgAddress.koreliste = targetAddress.koreliste;
162     covered = true;
163     }
164     }
165 torben 2276
166 torben 2283 if (targetAddress.distributor.equals("BK")) {
167     orgAddress.koreliste = calculateExtendedBkKoreliste(eb,orgAddress,targetAddress);
168     if (orgAddress.koreliste != null) {
169     orgAddress.rute = targetAddress.rute;
170     covered = true;
171     }
172     }
173    
174     if (covered) { //Kopier resten af felterne
175 torben 2276 orgAddress.daekningsType = DaekningsType.DAEKNING_UDVIDET;
176     orgAddress.dbkBane = targetAddress.dbkBane;
177    
178     /* Sådan gør den gamle service */
179     orgAddress.kommunekode = targetAddress.kommunekode;
180     orgAddress.vejkode = targetAddress.vejkode;
181    
182     orgAddress.distributor = targetAddress.distributor;
183     }
184 torben 2274 }
185 torben 2286
186     // nu skal vi ikke bruge idAddressMap længere
187     idAddressMap = null;
188    
189 torben 2279 //////////////////////////////////////////////////////////////////////////////////////
190     System.out.println("Build -- stage 3 - 100pct");
191 torben 2274
192 torben 2280 hundredePct = DatabaseLayer.get100PctList();
193 torben 2279 for (Address addr : alleAdresser) {
194 torben 2286 if (addr.daekningsType != DaekningsType.DAEKNING_IKKEDAEKKET) {
195 torben 2279 continue;
196     }
197    
198     if (addr.distributor != null && addr.distributor.equals("LUKKET")) {
199     continue;
200     }
201    
202    
203     HundredePctBean bean = hundredePct.get(addr.postnr);
204     if (bean == null) {
205     continue;
206     }
207    
208     addr.daekningsType = DaekningsType.DAEKNING_100PCT;
209     addr.rute = bean.rute;
210     addr.koreliste = bean.koreliste;
211     addr.dbkBane = bean.dbkBane;
212     addr.distributor = bean.distributor;
213     }
214 torben 2276
215 torben 2286 ////////////////////////////////////////////////////////////////////////////////////
216     System.out.println("Build -- Gathering statistics");
217    
218     int direkteCount = 0;
219     int extendedCount = 0;
220     int hundredePctCount = 0;
221     int ikkeDaekketCount = 0;
222    
223     for (Address addr : alleAdresser) {
224     switch (addr.daekningsType) {
225     case DAEKNING_DIREKTE:
226     direkteCount++;
227     break;
228     case DAEKNING_UDVIDET:
229     extendedCount++;
230     break;
231     case DAEKNING_100PCT:
232     hundredePctCount++;
233     break;
234     default:
235     ikkeDaekketCount++;
236     }
237     }
238    
239     System.out.println("Build: direkteCount: " + direkteCount);
240     System.out.println("Build: extendedCount: " + extendedCount);
241     System.out.println("Build: hundredePctCount: " + hundredePctCount);
242     System.out.println("Build: ikkeDaekketCount: " + ikkeDaekketCount);
243    
244 torben 2281 System.out.println("Build Completed");
245    
246 torben 2274 }
247    
248 torben 2276
249 torben 2283 private String calculateExtendedDaoRoute(ExtendedBean eb, Address orgAddress, Address targetAddress) {
250    
251     // ///////////////////////////////////////////////////////////////////
252     switch( eb.transport) {
253     case "cykel":
254     if (eb.afstand < 0.151) {
255     return "." + targetAddress.rute;
256     } else if (eb.afstand < 0.501) {
257     return ".." + targetAddress.rute;
258     } else if (eb.afstand < 0.701) {
259     return "..." + targetAddress.rute;
260     } else if (eb.afstand < 0.501) {
261     return "...." + targetAddress.rute;
262 torben 2276 }
263 torben 2283 break;
264     case "scooter":
265     if (eb.afstand < 0.151) {
266     return "." + targetAddress.rute;
267     } else if (eb.afstand < 0.801) {
268     return ".." + targetAddress.rute;
269     } else if (eb.afstand < 1.201) {
270     return "..." + targetAddress.rute;
271     } else if (eb.afstand < 2.101) {
272     return "...." + targetAddress.rute;
273     }
274     break;
275     case "bil":
276     if (eb.afstand < 0.151) {
277     return "." + targetAddress.rute;
278     } else if (eb.afstand < 1.001) {
279     return ".." + targetAddress.rute;
280     } else if (eb.afstand < 1.601) {
281     return "..." + targetAddress.rute;
282     } else if (eb.afstand < 2.601) {
283     return "...." + targetAddress.rute;
284     }
285 torben 2276 break;
286 torben 2283 }
287 torben 2276 return null;
288     }
289    
290 torben 2283 ///////////////////////////////////////////////////////////
291     private String calculateExtendedBkKoreliste(ExtendedBean eb, Address orgAddress, Address targetAddress) {
292     String inject;
293     if (eb.afstand <= 0.500) {
294     inject = ".";
295     } else {
296     inject = "..";
297     }
298     return AddressUtils.injectIntoBk(targetAddress.koreliste, inject);
299     }
300 torben 2276
301 torben 2283
302 torben 2267 }

  ViewVC Help
Powered by ViewVC 1.1.20