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

  ViewVC Help
Powered by ViewVC 1.1.20