/[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 2286 - (show 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 package dk.daoas.daoadresseservice;
2
3 import java.sql.SQLException;
4 import java.util.HashMap;
5 import java.util.List;
6 import java.util.Map;
7 import java.util.concurrent.ConcurrentHashMap;
8
9 import dk.daoas.daoadresseservice.AddressUtils.SplitResult;
10 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 import dk.daoas.daoadresseservice.db.DatabaseLayer;
16
17 public class AdressSearch {
18
19 Map<Integer, Map<String,Long>> searchPostnrVejnavnGadeid;
20 Map<Long, Map<String,Address>> searchGadeidentAdresser;
21
22 List<Address> alleAdresser;
23
24
25 Map<Integer,HundredePctBean> hundredePct;
26
27
28 public SearchResult search(String postnrStr, String adresse) {
29 int postnr=0;
30
31 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 if (postnrVeje == null) {
40 return new SearchResult(Status.ERROR_UNKNOWN_POSTAL);
41 }
42
43 SplitResult split = AddressUtils.splitAdresse(adresse);
44 String vasketVejnavn = AddressUtils.vaskVejnavn( split.vej );
45
46 if (split.husnr.length() == 0) {
47 return new SearchResult(Status.ERROR_MISSING_HOUSENUMBER);
48 }
49
50 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
64 if (addr.daekningsType == DaekningsType.DAEKNING_IKKEDAEKKET) {
65 return new SearchResult(Status.STATUS_NOT_COVERED);
66 }
67
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
72
73 return new SearchResult(addr);
74 }
75
76
77 public void buildSearchStructures() throws SQLException{
78 searchPostnrVejnavnGadeid = new HashMap<Integer, Map<String,Long>>();
79 searchGadeidentAdresser = new HashMap<Long, Map<String,Address>>();
80
81 System.out.println("Build -- stage 1");
82
83 alleAdresser = DatabaseLayer.getAllAdresses();
84
85
86 /* Mapper mellem db Row ID og adresse noden */
87 Map<Integer,Address> idAddressMap = new HashMap<Integer,Address>( alleAdresser.size() );
88
89 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 String vasketVejnavn = AddressUtils.vaskVejnavn(a.vejnavn);
100 Long gadeident = postnrVeje.get(vasketVejnavn);
101 if (gadeident == null) {
102 postnrVeje.put(vasketVejnavn, a.gadeid);
103 }
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 gade.put(husnrSearch, a);
112 }
113
114
115 ////////////////////////////////////////////////////////////////////////////////////////
116 System.out.println("Build -- stage 2 udvidet dækning");
117
118 List<ExtendedBean> extDao = DatabaseLayer.getExtendedAdresslist();
119 for (ExtendedBean eb : extDao) {
120
121 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 if (orgAddress.distributor != null && orgAddress.distributor.equals("LUKKET")) {
130 continue;
131 }
132
133 if (targetAddress.distributor.equals("LUKKET")) {
134 continue;
135 }
136
137 orgAddress.extTarget = targetAddress;
138 orgAddress.extAfstand = eb.afstand;
139
140 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
149 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 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 }
168
169 // nu skal vi ikke bruge idAddressMap længere
170 idAddressMap = null;
171
172 //////////////////////////////////////////////////////////////////////////////////////
173 System.out.println("Build -- stage 3 - 100pct");
174
175 hundredePct = DatabaseLayer.get100PctList();
176 for (Address addr : alleAdresser) {
177 if (addr.daekningsType != DaekningsType.DAEKNING_IKKEDAEKKET) {
178 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
198 ////////////////////////////////////////////////////////////////////////////////////
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 System.out.println("Build Completed");
228
229 }
230
231
232 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 }
246 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 break;
269 }
270 return null;
271 }
272
273 ///////////////////////////////////////////////////////////
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
284
285 }

  ViewVC Help
Powered by ViewVC 1.1.20