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

Annotation of /dao/DaoAdresseService/src/main/java/dk/daoas/daoadresseservice/AddressSearch.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2289 - (hide annotations) (download)
Sat Feb 14 08:43:45 2015 UTC (9 years, 3 months ago) by torben
Original Path: dao/DaoAdresseService/src/dk/daoas/daoadresseservice/AdressSearch.java
File size: 9243 byte(s)
Disable timing/debugging 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 2289 //long start1 = System.currentTimeMillis();
30 torben 2288
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 2289 //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 2289 //long start3 = System.currentTimeMillis();
47 torben 2288
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 2289 //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 torben 2289 //long start5 = System.currentTimeMillis();
61 torben 2274
62     Map<String, Address> gade = searchGadeidentAdresser.get(gadeident); //Denne søgning må ikke fejle
63    
64 torben 2289 //long start6 = System.currentTimeMillis();
65 torben 2274
66     String husnrSearch = "" + split.husnr + split.litra;
67     Address addr = gade.get(husnrSearch);
68 torben 2289 //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 torben 2289 /*
82     System.out.println("Search2: " + (start2-start1) );
83     System.out.println("Search3: " + (start3-start1) );
84     System.out.println("Search4: " + (start4-start1) );
85     System.out.println("Search5: " + (start5-start1) );
86     System.out.println("Search6: " + (start6-start1) );
87     System.out.println("Search7: " + (start7-start1) );
88     */
89 torben 2288
90 torben 2274
91    
92     return new SearchResult(addr);
93 torben 2267 }
94    
95 torben 2274
96     public void buildSearchStructures() throws SQLException{
97     searchPostnrVejnavnGadeid = new HashMap<Integer, Map<String,Long>>();
98     searchGadeidentAdresser = new HashMap<Long, Map<String,Address>>();
99 torben 2285
100 torben 2276 System.out.println("Build -- stage 1");
101    
102 torben 2274 alleAdresser = DatabaseLayer.getAllAdresses();
103 torben 2276
104 torben 2286
105 torben 2285 /* Mapper mellem db Row ID og adresse noden */
106     Map<Integer,Address> idAddressMap = new HashMap<Integer,Address>( alleAdresser.size() );
107    
108 torben 2274 for (Address a : alleAdresser) {
109     idAddressMap.put(a.id, a);
110    
111     Map<String,Long> postnrVeje = searchPostnrVejnavnGadeid.get(a.postnr);
112    
113     if (postnrVeje == null) {
114     postnrVeje = new ConcurrentHashMap<String,Long>();
115     searchPostnrVejnavnGadeid.put(a.postnr, postnrVeje);
116     }
117    
118 torben 2281 String vasketVejnavn = AddressUtils.vaskVejnavn(a.vejnavn);
119     Long gadeident = postnrVeje.get(vasketVejnavn);
120 torben 2274 if (gadeident == null) {
121 torben 2281 postnrVeje.put(vasketVejnavn, a.gadeid);
122 torben 2274 }
123    
124     Map<String, Address> gade = searchGadeidentAdresser.get(a.gadeid);
125     if (gade == null) {
126     gade = new HashMap<String, Address>();
127     searchGadeidentAdresser.put(a.gadeid, gade);
128     }
129     String husnrSearch = "" + a.husnr + a.husnrbogstav;
130 torben 2286 gade.put(husnrSearch, a);
131 torben 2276 }
132    
133    
134 torben 2279 ////////////////////////////////////////////////////////////////////////////////////////
135     System.out.println("Build -- stage 2 udvidet dækning");
136    
137     List<ExtendedBean> extDao = DatabaseLayer.getExtendedAdresslist();
138 torben 2276 for (ExtendedBean eb : extDao) {
139 torben 2274
140 torben 2276 Address orgAddress = idAddressMap.get(eb.orgId);
141     if (orgAddress == null)
142     continue;
143    
144     Address targetAddress = idAddressMap.get(eb.targetId);
145     if (targetAddress == null)
146     continue;
147    
148 torben 2277 if (orgAddress.distributor != null && orgAddress.distributor.equals("LUKKET")) {
149     continue;
150     }
151    
152     if (targetAddress.distributor.equals("LUKKET")) {
153     continue;
154     }
155    
156 torben 2276 orgAddress.extTarget = targetAddress;
157     orgAddress.extAfstand = eb.afstand;
158    
159 torben 2283 boolean covered = false;
160     if (targetAddress.distributor.equals("DAO")) {
161     orgAddress.rute = calculateExtendedDaoRoute(eb,orgAddress,targetAddress);
162     if (orgAddress.rute != null) {
163     orgAddress.koreliste = targetAddress.koreliste;
164     covered = true;
165     }
166     }
167 torben 2276
168 torben 2283 if (targetAddress.distributor.equals("BK")) {
169     orgAddress.koreliste = calculateExtendedBkKoreliste(eb,orgAddress,targetAddress);
170     if (orgAddress.koreliste != null) {
171     orgAddress.rute = targetAddress.rute;
172     covered = true;
173     }
174     }
175    
176     if (covered) { //Kopier resten af felterne
177 torben 2276 orgAddress.daekningsType = DaekningsType.DAEKNING_UDVIDET;
178     orgAddress.dbkBane = targetAddress.dbkBane;
179    
180     /* Sådan gør den gamle service */
181     orgAddress.kommunekode = targetAddress.kommunekode;
182     orgAddress.vejkode = targetAddress.vejkode;
183    
184     orgAddress.distributor = targetAddress.distributor;
185     }
186 torben 2274 }
187 torben 2286
188     // nu skal vi ikke bruge idAddressMap længere
189     idAddressMap = null;
190    
191 torben 2279 //////////////////////////////////////////////////////////////////////////////////////
192     System.out.println("Build -- stage 3 - 100pct");
193 torben 2274
194 torben 2280 hundredePct = DatabaseLayer.get100PctList();
195 torben 2279 for (Address addr : alleAdresser) {
196 torben 2286 if (addr.daekningsType != DaekningsType.DAEKNING_IKKEDAEKKET) {
197 torben 2279 continue;
198     }
199    
200     if (addr.distributor != null && addr.distributor.equals("LUKKET")) {
201     continue;
202     }
203    
204    
205     HundredePctBean bean = hundredePct.get(addr.postnr);
206     if (bean == null) {
207     continue;
208     }
209    
210     addr.daekningsType = DaekningsType.DAEKNING_100PCT;
211     addr.rute = bean.rute;
212     addr.koreliste = bean.koreliste;
213     addr.dbkBane = bean.dbkBane;
214     addr.distributor = bean.distributor;
215     }
216 torben 2276
217 torben 2286 ////////////////////////////////////////////////////////////////////////////////////
218     System.out.println("Build -- Gathering statistics");
219    
220     int direkteCount = 0;
221     int extendedCount = 0;
222     int hundredePctCount = 0;
223     int ikkeDaekketCount = 0;
224    
225     for (Address addr : alleAdresser) {
226     switch (addr.daekningsType) {
227     case DAEKNING_DIREKTE:
228     direkteCount++;
229     break;
230     case DAEKNING_UDVIDET:
231     extendedCount++;
232     break;
233     case DAEKNING_100PCT:
234     hundredePctCount++;
235     break;
236     default:
237     ikkeDaekketCount++;
238     }
239     }
240    
241     System.out.println("Build: direkteCount: " + direkteCount);
242     System.out.println("Build: extendedCount: " + extendedCount);
243     System.out.println("Build: hundredePctCount: " + hundredePctCount);
244     System.out.println("Build: ikkeDaekketCount: " + ikkeDaekketCount);
245    
246 torben 2281 System.out.println("Build Completed");
247    
248 torben 2274 }
249    
250 torben 2276
251 torben 2283 private String calculateExtendedDaoRoute(ExtendedBean eb, Address orgAddress, Address targetAddress) {
252    
253     // ///////////////////////////////////////////////////////////////////
254     switch( eb.transport) {
255     case "cykel":
256     if (eb.afstand < 0.151) {
257     return "." + targetAddress.rute;
258     } else if (eb.afstand < 0.501) {
259     return ".." + targetAddress.rute;
260     } else if (eb.afstand < 0.701) {
261     return "..." + targetAddress.rute;
262     } else if (eb.afstand < 0.501) {
263     return "...." + targetAddress.rute;
264 torben 2276 }
265 torben 2283 break;
266     case "scooter":
267     if (eb.afstand < 0.151) {
268     return "." + targetAddress.rute;
269     } else if (eb.afstand < 0.801) {
270     return ".." + targetAddress.rute;
271     } else if (eb.afstand < 1.201) {
272     return "..." + targetAddress.rute;
273     } else if (eb.afstand < 2.101) {
274     return "...." + targetAddress.rute;
275     }
276     break;
277     case "bil":
278     if (eb.afstand < 0.151) {
279     return "." + targetAddress.rute;
280     } else if (eb.afstand < 1.001) {
281     return ".." + targetAddress.rute;
282     } else if (eb.afstand < 1.601) {
283     return "..." + targetAddress.rute;
284     } else if (eb.afstand < 2.601) {
285     return "...." + targetAddress.rute;
286     }
287 torben 2276 break;
288 torben 2283 }
289 torben 2276 return null;
290     }
291    
292 torben 2283 ///////////////////////////////////////////////////////////
293     private String calculateExtendedBkKoreliste(ExtendedBean eb, Address orgAddress, Address targetAddress) {
294     String inject;
295     if (eb.afstand <= 0.500) {
296     inject = ".";
297     } else {
298     inject = "..";
299     }
300     return AddressUtils.injectIntoBk(targetAddress.koreliste, inject);
301     }
302 torben 2276
303 torben 2283
304 torben 2267 }

  ViewVC Help
Powered by ViewVC 1.1.20