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

  ViewVC Help
Powered by ViewVC 1.1.20