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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2286 - (hide annotations) (download)
Fri Feb 13 16:15:49 2015 UTC (9 years, 3 months ago) by torben
File size: 8585 byte(s)
Collect statistics
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     int postnr=0;
30 torben 2267
31 torben 2274 try {
32     postnr = Integer.parseInt(postnrStr);
33     } catch (Exception E) {
34     return new SearchResult(Status.ERROR_UNKNOWN_POSTAL);
35     }
36    
37     Map<String,Long> postnrVeje = searchPostnrVejnavnGadeid.get(postnr);
38    
39 torben 2267 if (postnrVeje == null) {
40 torben 2274 return new SearchResult(Status.ERROR_UNKNOWN_POSTAL);
41 torben 2267 }
42    
43 torben 2274 SplitResult split = AddressUtils.splitAdresse(adresse);
44     String vasketVejnavn = AddressUtils.vaskVejnavn( split.vej );
45 torben 2267
46 torben 2274 if (split.husnr.length() == 0) {
47     return new SearchResult(Status.ERROR_MISSING_HOUSENUMBER);
48     }
49 torben 2267
50 torben 2274 Long gadeident = postnrVeje.get(vasketVejnavn);
51     if (gadeident == null) {
52     return new SearchResult(Status.ERROR_UNKNOWN_STREETNAME);
53     }
54    
55     Map<String, Address> gade = searchGadeidentAdresser.get(gadeident); //Denne søgning må ikke fejle
56    
57    
58     String husnrSearch = "" + split.husnr + split.litra;
59     Address addr = gade.get(husnrSearch);
60     if (addr == null) {
61     return new SearchResult(Status.ERROR_UNKNOWN_ADDRESSPOINT);
62     }
63 torben 2276
64     if (addr.daekningsType == DaekningsType.DAEKNING_IKKEDAEKKET) {
65     return new SearchResult(Status.STATUS_NOT_COVERED);
66     }
67 torben 2277
68     if (addr.distributor.equals("LUKKET")) {
69     return new SearchResult(Status.STATUS_NOT_COVERED); //Skal vi have en special status til Lukkede adresser ?
70     }
71 torben 2274
72    
73     return new SearchResult(addr);
74 torben 2267 }
75    
76 torben 2274
77     public void buildSearchStructures() throws SQLException{
78     searchPostnrVejnavnGadeid = new HashMap<Integer, Map<String,Long>>();
79     searchGadeidentAdresser = new HashMap<Long, Map<String,Address>>();
80 torben 2285
81 torben 2276 System.out.println("Build -- stage 1");
82    
83 torben 2274 alleAdresser = DatabaseLayer.getAllAdresses();
84 torben 2276
85 torben 2286
86 torben 2285 /* Mapper mellem db Row ID og adresse noden */
87     Map<Integer,Address> idAddressMap = new HashMap<Integer,Address>( alleAdresser.size() );
88    
89 torben 2274 for (Address a : alleAdresser) {
90     idAddressMap.put(a.id, a);
91    
92     Map<String,Long> postnrVeje = searchPostnrVejnavnGadeid.get(a.postnr);
93    
94     if (postnrVeje == null) {
95     postnrVeje = new ConcurrentHashMap<String,Long>();
96     searchPostnrVejnavnGadeid.put(a.postnr, postnrVeje);
97     }
98    
99 torben 2281 String vasketVejnavn = AddressUtils.vaskVejnavn(a.vejnavn);
100     Long gadeident = postnrVeje.get(vasketVejnavn);
101 torben 2274 if (gadeident == null) {
102 torben 2281 postnrVeje.put(vasketVejnavn, a.gadeid);
103 torben 2274 }
104    
105     Map<String, Address> gade = searchGadeidentAdresser.get(a.gadeid);
106     if (gade == null) {
107     gade = new HashMap<String, Address>();
108     searchGadeidentAdresser.put(a.gadeid, gade);
109     }
110     String husnrSearch = "" + a.husnr + a.husnrbogstav;
111 torben 2286 gade.put(husnrSearch, a);
112 torben 2276 }
113    
114    
115 torben 2279 ////////////////////////////////////////////////////////////////////////////////////////
116     System.out.println("Build -- stage 2 udvidet dækning");
117    
118     List<ExtendedBean> extDao = DatabaseLayer.getExtendedAdresslist();
119 torben 2276 for (ExtendedBean eb : extDao) {
120 torben 2274
121 torben 2276 Address orgAddress = idAddressMap.get(eb.orgId);
122     if (orgAddress == null)
123     continue;
124    
125     Address targetAddress = idAddressMap.get(eb.targetId);
126     if (targetAddress == null)
127     continue;
128    
129 torben 2277 if (orgAddress.distributor != null && orgAddress.distributor.equals("LUKKET")) {
130     continue;
131     }
132    
133     if (targetAddress.distributor.equals("LUKKET")) {
134     continue;
135     }
136    
137 torben 2276 orgAddress.extTarget = targetAddress;
138     orgAddress.extAfstand = eb.afstand;
139    
140 torben 2283 boolean covered = false;
141     if (targetAddress.distributor.equals("DAO")) {
142     orgAddress.rute = calculateExtendedDaoRoute(eb,orgAddress,targetAddress);
143     if (orgAddress.rute != null) {
144     orgAddress.koreliste = targetAddress.koreliste;
145     covered = true;
146     }
147     }
148 torben 2276
149 torben 2283 if (targetAddress.distributor.equals("BK")) {
150     orgAddress.koreliste = calculateExtendedBkKoreliste(eb,orgAddress,targetAddress);
151     if (orgAddress.koreliste != null) {
152     orgAddress.rute = targetAddress.rute;
153     covered = true;
154     }
155     }
156    
157     if (covered) { //Kopier resten af felterne
158 torben 2276 orgAddress.daekningsType = DaekningsType.DAEKNING_UDVIDET;
159     orgAddress.dbkBane = targetAddress.dbkBane;
160    
161     /* Sådan gør den gamle service */
162     orgAddress.kommunekode = targetAddress.kommunekode;
163     orgAddress.vejkode = targetAddress.vejkode;
164    
165     orgAddress.distributor = targetAddress.distributor;
166     }
167 torben 2274 }
168 torben 2286
169     // nu skal vi ikke bruge idAddressMap længere
170     idAddressMap = null;
171    
172 torben 2279 //////////////////////////////////////////////////////////////////////////////////////
173     System.out.println("Build -- stage 3 - 100pct");
174 torben 2274
175 torben 2280 hundredePct = DatabaseLayer.get100PctList();
176 torben 2279 for (Address addr : alleAdresser) {
177 torben 2286 if (addr.daekningsType != DaekningsType.DAEKNING_IKKEDAEKKET) {
178 torben 2279 continue;
179     }
180    
181     if (addr.distributor != null && addr.distributor.equals("LUKKET")) {
182     continue;
183     }
184    
185    
186     HundredePctBean bean = hundredePct.get(addr.postnr);
187     if (bean == null) {
188     continue;
189     }
190    
191     addr.daekningsType = DaekningsType.DAEKNING_100PCT;
192     addr.rute = bean.rute;
193     addr.koreliste = bean.koreliste;
194     addr.dbkBane = bean.dbkBane;
195     addr.distributor = bean.distributor;
196     }
197 torben 2276
198 torben 2286 ////////////////////////////////////////////////////////////////////////////////////
199     System.out.println("Build -- Gathering statistics");
200    
201     int direkteCount = 0;
202     int extendedCount = 0;
203     int hundredePctCount = 0;
204     int ikkeDaekketCount = 0;
205    
206     for (Address addr : alleAdresser) {
207     switch (addr.daekningsType) {
208     case DAEKNING_DIREKTE:
209     direkteCount++;
210     break;
211     case DAEKNING_UDVIDET:
212     extendedCount++;
213     break;
214     case DAEKNING_100PCT:
215     hundredePctCount++;
216     break;
217     default:
218     ikkeDaekketCount++;
219     }
220     }
221    
222     System.out.println("Build: direkteCount: " + direkteCount);
223     System.out.println("Build: extendedCount: " + extendedCount);
224     System.out.println("Build: hundredePctCount: " + hundredePctCount);
225     System.out.println("Build: ikkeDaekketCount: " + ikkeDaekketCount);
226    
227 torben 2281 System.out.println("Build Completed");
228    
229 torben 2274 }
230    
231 torben 2276
232 torben 2283 private String calculateExtendedDaoRoute(ExtendedBean eb, Address orgAddress, Address targetAddress) {
233    
234     // ///////////////////////////////////////////////////////////////////
235     switch( eb.transport) {
236     case "cykel":
237     if (eb.afstand < 0.151) {
238     return "." + targetAddress.rute;
239     } else if (eb.afstand < 0.501) {
240     return ".." + targetAddress.rute;
241     } else if (eb.afstand < 0.701) {
242     return "..." + targetAddress.rute;
243     } else if (eb.afstand < 0.501) {
244     return "...." + targetAddress.rute;
245 torben 2276 }
246 torben 2283 break;
247     case "scooter":
248     if (eb.afstand < 0.151) {
249     return "." + targetAddress.rute;
250     } else if (eb.afstand < 0.801) {
251     return ".." + targetAddress.rute;
252     } else if (eb.afstand < 1.201) {
253     return "..." + targetAddress.rute;
254     } else if (eb.afstand < 2.101) {
255     return "...." + targetAddress.rute;
256     }
257     break;
258     case "bil":
259     if (eb.afstand < 0.151) {
260     return "." + targetAddress.rute;
261     } else if (eb.afstand < 1.001) {
262     return ".." + targetAddress.rute;
263     } else if (eb.afstand < 1.601) {
264     return "..." + targetAddress.rute;
265     } else if (eb.afstand < 2.601) {
266     return "...." + targetAddress.rute;
267     }
268 torben 2276 break;
269 torben 2283 }
270 torben 2276 return null;
271     }
272    
273 torben 2283 ///////////////////////////////////////////////////////////
274     private String calculateExtendedBkKoreliste(ExtendedBean eb, Address orgAddress, Address targetAddress) {
275     String inject;
276     if (eb.afstand <= 0.500) {
277     inject = ".";
278     } else {
279     inject = "..";
280     }
281     return AddressUtils.injectIntoBk(targetAddress.koreliste, inject);
282     }
283 torben 2276
284 torben 2283
285 torben 2267 }

  ViewVC Help
Powered by ViewVC 1.1.20