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

  ViewVC Help
Powered by ViewVC 1.1.20