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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2380 - (show annotations) (download)
Thu Feb 26 10:26:01 2015 UTC (9 years, 2 months ago) by torben
File size: 15012 byte(s)
Prevent NPE
1 package dk.daoas.daoadresseservice;
2
3 import java.sql.SQLException;
4 import java.text.SimpleDateFormat;
5 import java.util.ArrayList;
6 import java.util.Collections;
7 import java.util.Date;
8 import java.util.HashMap;
9 import java.util.HashSet;
10 import java.util.List;
11 import java.util.Map;
12 import java.util.Set;
13 import java.util.concurrent.ConcurrentHashMap;
14
15 import dk.daoas.daoadresseservice.admin.ServiceConfig;
16 import dk.daoas.daoadresseservice.beans.Address;
17 import dk.daoas.daoadresseservice.beans.DataStatisticsBean;
18 import dk.daoas.daoadresseservice.beans.ExtendedBean;
19 import dk.daoas.daoadresseservice.beans.HundredePctBean;
20 import dk.daoas.daoadresseservice.beans.SearchResult;
21 import dk.daoas.daoadresseservice.beans.SearchResult.Status;
22 import dk.daoas.daoadresseservice.db.DatabaseLayer;
23
24 public class AdressSearch {
25
26 private Map<Integer, Map<String,Long>> searchPostnrVejnavnGadeid;
27 private Map<Long, Map<String,Address>> searchGadeidentAdresser;
28
29 private List<Address> alleAdresser;
30
31 private Map<String,Long> helperCache;
32
33 private DataStatisticsBean stats = new DataStatisticsBean();
34
35 ServiceConfig config;
36
37 public AdressSearch(ServiceConfig config) {
38 this.config = config;
39 }
40
41
42 public SearchResult search(String postnrStr, String adresse) {
43
44 SearchResult result = new SearchResult();
45
46 int postnr=0;
47
48 String helperSearchKey = "";
49
50 try {
51 postnr = Integer.parseInt(postnrStr);
52 } catch (Exception E) {
53 result.status = Status.ERROR_UNKNOWN_POSTAL;
54 return result;
55 }
56
57 Map<String,Long> postnrVeje = searchPostnrVejnavnGadeid.get(postnr);
58
59 if (postnrVeje == null) {
60 result.status = Status.ERROR_UNKNOWN_POSTAL;
61 return result;
62 }
63
64
65 result.splitResult = AddressUtils.splitAdresse(adresse);
66
67
68 if (result.splitResult.husnr.length() == 0) {
69 result.status = Status.ERROR_MISSING_HOUSENUMBER;
70 return result;
71 }
72
73 String vasketVejnavn = AddressUtils.vaskVejnavn( result.splitResult.vej );
74
75 Long gadeident = postnrVeje.get(vasketVejnavn);
76
77
78 if ( gadeident == null) {
79 helperSearchKey = "" + postnr + "/" + vasketVejnavn;
80 gadeident = helperCache.get(helperSearchKey);
81 }
82
83
84 if ( gadeident == null) {
85 if (config.useGoogle) {
86 result.googleVej = GeocodeHelper.googleHelper(config, postnr, result.splitResult.vej );
87 result.google = true;
88
89 if (result.googleVej != null) {
90 String googleVasket = AddressUtils.vaskVejnavn( result.googleVej );
91 gadeident = postnrVeje.get(googleVasket);
92
93 if (gadeident != null) {
94 helperCache.put(helperSearchKey, gadeident);
95 }
96 }
97 }
98 }
99
100 if ( gadeident == null) {
101 if (config.useOpenStreetMaps) {
102 result.osmVej = GeocodeHelper.openstreetmapHelper(config, postnr, result.splitResult.vej );
103 result.osm = true;
104
105 if (result.osmVej != null) {
106 String osmVasket = AddressUtils.vaskVejnavn( result.osmVej );
107 gadeident = postnrVeje.get(osmVasket);
108
109 if (gadeident != null) {
110 helperCache.put(helperSearchKey, gadeident);
111 }
112 }
113 }
114 }
115
116 if (gadeident == null) {
117 result.status = Status.ERROR_UNKNOWN_STREETNAME;
118 return result;
119 }
120
121 Map<String, Address> gade = searchGadeidentAdresser.get(gadeident);
122 if (gade == null) { //Denne søgning må ikke fejle
123 result.status = Status.ERROR_INTERNAL;
124 return result;
125 }
126
127
128 String husnrSearch = "" + result.splitResult.husnr + result.splitResult.litra;
129 Address addr = gade.get(husnrSearch);
130
131 if (addr == null) {
132 result.status = Status.ERROR_UNKNOWN_ADDRESSPOINT;
133 return result;
134 }
135
136 result.address = addr;
137
138 if (addr.distributor != null && addr.distributor.equals("LUKKET")) {
139 result.status = Status.STATUS_NOT_COVERED; //Skal vi have en special status til Lukkede adresser ?
140 return result;
141 }
142
143 if (addr.daekningsType == DaekningsType.DAEKNING_IKKEDAEKKET) {
144 result.status = Status.STATUS_NOT_COVERED;
145 return result;
146 }
147
148
149 result.status = Status.STATUS_OK;
150
151 return result;
152 }
153
154
155 public void buildSearchStructures() throws SQLException{
156 searchPostnrVejnavnGadeid = new HashMap<Integer, Map<String,Long>>();
157 searchGadeidentAdresser = new HashMap<Long, Map<String,Address>>();
158 helperCache = new ConcurrentHashMap<String,Long>();
159
160 long start1 = System.currentTimeMillis();
161 System.out.println("Build -- stage 1");
162
163 alleAdresser = DatabaseLayer.getAllAdresses();
164
165
166 /* Mapper mellem db Row ID og adresse noden */
167 Map<Integer,Address> idAddressMap = new HashMap<Integer,Address>( alleAdresser.size() );
168
169 for (Address a : alleAdresser) {
170 idAddressMap.put(a.id, a);
171
172 Map<String,Long> postnrVeje = searchPostnrVejnavnGadeid.get(a.postnr);
173
174 if (postnrVeje == null) {
175 postnrVeje = new ConcurrentHashMap<String,Long>();
176 searchPostnrVejnavnGadeid.put(a.postnr, postnrVeje);
177 }
178
179 String vasketVejnavn = AddressUtils.vaskVejnavn(a.vejnavn);
180 Long gadeident = postnrVeje.get(vasketVejnavn);
181 if (gadeident == null) {
182 //postnrVeje.put(vasketVejnavn, a.gadeid);
183
184 Set<String> aliaser = findVejAliaser(a.vejnavn);
185 for(String alias : aliaser) {
186 String vasketAlias = AddressUtils.vaskVejnavn(alias);
187 postnrVeje.put(vasketAlias, a.gadeid);
188 }
189
190 }
191
192 Map<String, Address> gade = searchGadeidentAdresser.get(a.gadeid);
193 if (gade == null) {
194 gade = new HashMap<String, Address>();
195 searchGadeidentAdresser.put(a.gadeid, gade);
196 }
197 String husnrSearch = "" + a.husnr + a.husnrbogstav;
198 gade.put(husnrSearch, a);
199 }
200
201
202 ////////////////////////////////////////////////////////////////////////////////////////
203 long start2 = System.currentTimeMillis();
204 System.out.println("Build, stage1 elapsed: " + (start2-start1) );
205 System.out.println("Build -- stage 2 udvidet dækning");
206
207 List<ExtendedBean> extDao = DatabaseLayer.getExtendedAdresslist();
208 for (ExtendedBean eb : extDao) {
209
210 Address orgAddress = idAddressMap.get(eb.orgId);
211 if (orgAddress == null)
212 continue;
213
214 Address targetAddress = idAddressMap.get(eb.targetId);
215 if (targetAddress == null)
216 continue;
217
218 if (orgAddress.distributor != null && orgAddress.distributor.equals("LUKKET")) {
219 continue;
220 }
221
222 if (targetAddress.distributor.equals("LUKKET")) {
223 continue;
224 }
225
226 orgAddress.extTarget = targetAddress;
227 orgAddress.extAfstand = eb.afstand;
228
229 boolean covered = false;
230 if (targetAddress.distributor.equals("DAO")) {
231 orgAddress.rute = calculateExtendedDaoRoute(eb,orgAddress,targetAddress);
232 if (orgAddress.rute != null) {
233 orgAddress.koreliste = targetAddress.koreliste;
234 covered = true;
235 }
236 }
237
238 if (targetAddress.distributor.equals("BK")) {
239 orgAddress.koreliste = calculateExtendedBkKoreliste(eb,orgAddress,targetAddress);
240 if (orgAddress.koreliste != null) {
241 orgAddress.rute = targetAddress.rute;
242 covered = true;
243 }
244 }
245
246 if (covered) { //Kopier resten af felterne
247 orgAddress.daekningsType = DaekningsType.DAEKNING_UDVIDET;
248 orgAddress.dbkBane = targetAddress.dbkBane;
249
250 /* Sådan gør den gamle service */
251 orgAddress.kommunekode = targetAddress.kommunekode;
252 orgAddress.vejkode = targetAddress.vejkode;
253
254 orgAddress.distributor = targetAddress.distributor;
255 }
256 }
257
258 // nu skal vi ikke bruge idAddressMap længere
259 idAddressMap = null;
260
261 //////////////////////////////////////////////////////////////////////////////////////
262 long start3 = System.currentTimeMillis();
263 System.out.println("Build, stage2 elapsed: " + (start3-start2) );
264 System.out.println("Build -- stage 3 - 100pct");
265
266 Map<Integer,HundredePctBean> hundredePct = DatabaseLayer.get100PctList();
267 for (Address addr : alleAdresser) {
268 if (addr.daekningsType != DaekningsType.DAEKNING_IKKEDAEKKET) {
269 continue;
270 }
271
272 if (addr.distributor != null && addr.distributor.equals("LUKKET")) {
273 continue;
274 }
275
276
277 HundredePctBean bean = hundredePct.get(addr.postnr);
278 if (bean == null) {
279 continue;
280 }
281
282 addr.daekningsType = DaekningsType.DAEKNING_100PCT;
283 addr.rute = bean.rute;
284 addr.koreliste = bean.koreliste;
285 addr.dbkBane = bean.dbkBane;
286 addr.distributor = bean.distributor;
287 }
288
289 ////////////////////////////////////////////////////////////////////////////////////
290 long stop = System.currentTimeMillis();
291 System.out.println("Build, stage3 elapsed: " + (stop-start3) );
292 System.out.println("Build -- Gathering statistics");
293
294 for (Address addr : alleAdresser) {
295 switch (addr.daekningsType) {
296 case DAEKNING_DIREKTE:
297 stats.direkteCount++;
298 break;
299 case DAEKNING_UDVIDET:
300 stats.extendedCount++;
301 break;
302 case DAEKNING_100PCT:
303 stats.hundredePctCount++;
304 break;
305 default:
306 stats.ikkeDaekketCount++;
307 }
308 }
309
310
311 stats.elapsed = stop-start1;
312 stats.buildTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format( new Date() );
313
314 System.out.println("Build: direkteCount: " + stats.direkteCount);
315 System.out.println("Build: extendedCount: " + stats.extendedCount);
316 System.out.println("Build: hundredePctCount: " + stats.hundredePctCount);
317 System.out.println("Build: ikkeDaekketCount: " + stats.ikkeDaekketCount);
318
319 System.out.println("Build: Total Elapsed: " + (stop-start1) );
320 System.out.println("Build Completed");
321
322 }
323
324 public DataStatisticsBean getStatistics() {
325 return stats;
326 }
327
328 public void clear() {
329 searchPostnrVejnavnGadeid.clear();
330 searchGadeidentAdresser.clear();
331 alleAdresser.clear();
332 helperCache.clear();
333 }
334
335
336 private String calculateExtendedDaoRoute(ExtendedBean eb, Address orgAddress, Address targetAddress) {
337
338 // ///////////////////////////////////////////////////////////////////
339 switch( eb.transport) {
340 case "cykel":
341 if (eb.afstand < 0.151) {
342 return "." + targetAddress.rute;
343 } else if (eb.afstand < 0.501) {
344 return ".." + targetAddress.rute;
345 } else if (eb.afstand < 0.701) {
346 return "..." + targetAddress.rute;
347 } else if (eb.afstand < 0.501) {
348 return "...." + targetAddress.rute;
349 }
350 break;
351 case "scooter":
352 if (eb.afstand < 0.151) {
353 return "." + targetAddress.rute;
354 } else if (eb.afstand < 0.801) {
355 return ".." + targetAddress.rute;
356 } else if (eb.afstand < 1.201) {
357 return "..." + targetAddress.rute;
358 } else if (eb.afstand < 2.101) {
359 return "...." + targetAddress.rute;
360 }
361 break;
362 case "bil":
363 if (eb.afstand < 0.151) {
364 return "." + targetAddress.rute;
365 } else if (eb.afstand < 1.001) {
366 return ".." + targetAddress.rute;
367 } else if (eb.afstand < 1.601) {
368 return "..." + targetAddress.rute;
369 } else if (eb.afstand < 2.601) {
370 return "...." + targetAddress.rute;
371 }
372 break;
373 }
374 return null;
375 }
376
377 public List<Address> getNonCoveredAddresses() {
378 List<Address> result = new ArrayList<Address>(60000);
379 for (Address a : alleAdresser) {
380 if ( a.daekningsType == DaekningsType.DAEKNING_IKKEDAEKKET) {
381 result.add(a);
382 }
383 }
384 Collections.sort(result );
385 return result;
386 }
387
388 ///////////////////////////////////////////////////////////
389 private String calculateExtendedBkKoreliste(ExtendedBean eb, Address orgAddress, Address targetAddress) {
390 String inject;
391 if (eb.afstand <= 0.500) {
392 inject = ".";
393 } else {
394 inject = "..";
395 }
396 return AddressUtils.injectIntoBk(targetAddress.koreliste, inject);
397 }
398
399 private Set<String> findVejAliaser(String vejnavn) {
400 vejnavn = vejnavn.toLowerCase();
401 HashSet<String> aliasSet = new HashSet<String>();
402 aliasSet.add(vejnavn);
403
404 aliasSet.add(vejnavn.replace("u", "ü") );
405 aliasSet.add(vejnavn.replace("ü", "u") );
406
407 aliasSet.add(vejnavn.replace("alle", "allé") );
408 aliasSet.add(vejnavn.replace("allé", "alle") );
409
410 aliasSet.add(vejnavn.replace("dronningens", "dr") );
411 aliasSet.add(vejnavn.replace("dr.", "dronningens") );
412 aliasSet.add(vejnavn.replace("dr ", "dronningens") );
413
414 aliasSet.add(vejnavn.replace("kvt", "kvarter") );
415 aliasSet.add(vejnavn.replace("kvarter", "kvt") );
416
417 aliasSet.add(vejnavn.replace("gl", "gammel") );
418 aliasSet.add(vejnavn.replace("gammel", "gl") );
419
420 aliasSet.add(vejnavn.replace("lille", "ll") );
421 aliasSet.add(vejnavn.replace("ll ", "lille") );
422 aliasSet.add(vejnavn.replace("ll.", "lille") );
423
424 aliasSet.add(vejnavn.replace("store", "st") );
425 aliasSet.add(vejnavn.replace("st ", "store") );
426 aliasSet.add(vejnavn.replace("st.", "store") );
427
428 aliasSet.add(vejnavn.replace("søndre", "sdr") );
429 aliasSet.add(vejnavn.replace("sdr", "søndre") );
430
431
432 aliasSet.add(vejnavn.replace("nørre", "nr") );
433 aliasSet.add(vejnavn.replace("nr", "nørre") );
434
435 aliasSet.add(vejnavn.replace("nordre", "ndr") );
436 aliasSet.add(vejnavn.replace("ndr", "nordre") );
437
438 aliasSet.add(vejnavn.replace("sankt", "skt") );
439 aliasSet.add(vejnavn.replace("sankt", "sct") );
440 aliasSet.add(vejnavn.replace("skt", "sankt") );
441
442 aliasSet.add(vejnavn.replace("skt", "sct") );
443 aliasSet.add(vejnavn.replace("sct", "skt") );
444
445
446 //alternative måder at stave vej/gade/alle
447 aliasSet.add(vejnavn.replace("vej", "ve") );
448 aliasSet.add(vejnavn.replace("vej", "vj") );
449
450 aliasSet.add(vejnavn.replace("alle", "all") );
451 aliasSet.add(vejnavn.replace("allé", "all") );
452
453 aliasSet.add(vejnavn.replace("gade", "gaed") );
454
455
456 // Opbyg æøå varianter over alle fundne aliaser
457
458 @SuppressWarnings("unchecked")
459 HashSet<String> variants = (HashSet<String>) aliasSet.clone();
460
461 for (String vVejnavn : variants) {
462 // danske tegn 1
463 aliasSet.add( vVejnavn.replace("æ", "ae") );
464 aliasSet.add( vVejnavn.replace("ø", "oe") );
465 aliasSet.add( vVejnavn.replace("å", "aa") );
466 aliasSet.add( vVejnavn.replace("ae", "æ") );
467 aliasSet.add( vVejnavn.replace("oe", "ø") );
468 aliasSet.add( vVejnavn.replace("aa", "å") );
469
470 //danske tegn 2
471 aliasSet.add( vVejnavn.replace("æ", "ae").replace("ø", "oe") );
472 aliasSet.add( vVejnavn.replace("æ", "ae").replace("å", "aa") );
473 aliasSet.add( vVejnavn.replace("ø", "ae").replace("å", "aa") );
474 aliasSet.add( vVejnavn.replace("ae", "æ").replace("oe","ø") );
475 aliasSet.add( vVejnavn.replace("ae", "æ").replace("aa","å") );
476 aliasSet.add( vVejnavn.replace("oe", "ø").replace("aa", "å") );
477
478 //danske tegn 3
479 aliasSet.add( vejnavn.replace("æ", "ae").replace("ø", "oe").replace("å", "aa") );
480 aliasSet.add( vejnavn.replace("ae", "æ").replace("oe", "ø").replace("aa", "å") );
481 }
482
483 return aliasSet;
484 }
485
486
487 }

  ViewVC Help
Powered by ViewVC 1.1.20