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

Contents of /dao/DaoAdresseService/src/main/java/dk/daoas/daoadresseservice/db/DatabaseLayerImplementation.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3110 - (show annotations) (download)
Fri Sep 9 08:58:41 2016 UTC (7 years, 8 months ago) by torben
File size: 10987 byte(s)
Forbered til at dbkBane kan indeholde bogstaver
1 package dk.daoas.daoadresseservice.db;
2
3 import java.sql.Connection;
4 import java.sql.PreparedStatement;
5 import java.sql.ResultSet;
6 import java.sql.SQLException;
7 import java.sql.Statement;
8 import java.util.ArrayList;
9 import java.util.HashMap;
10 import java.util.List;
11 import java.util.Map;
12
13 import dk.daoas.daoadresseservice.AddressUtils;
14 import dk.daoas.daoadresseservice.beans.Address;
15 import dk.daoas.daoadresseservice.beans.AliasBean;
16 import dk.daoas.daoadresseservice.beans.ExtendedBean;
17 import dk.daoas.daoadresseservice.beans.HundredePctBean;
18 import dk.daoas.daoadresseservice.beans.SearchResult;
19 import dk.daoas.daoadresseservice.util.DeduplicateHelper;
20 import dk.daoas.daoadresseservice.util.TimingHelper;
21
22 public class DatabaseLayerImplementation implements DatabaseLayer {
23
24 public static final boolean DEBUG = false;
25
26 @Override
27 public List<Address> getAllAdresses() throws SQLException {
28 TimingHelper timing = new TimingHelper();
29
30 String debugFilter = DatabaseLayerImplementation.DEBUG ? " AND postnr = 8700 " : "";
31
32 String sql =
33 "SELECT id,vejnavn,husnr,husnrbogstav,kommunekode,vejkode,postnr,gadeid,upper(distributor) AS distributor,dbkbane,latitude,longitude, "
34 + "rutema,korelistema,ruteti,korelisteti,ruteon,korelisteon,ruteto,korelisteto,rutefr,korelistefr,rutelo,korelistelo,ruteso,korelisteso "
35 + "FROM fulddaekning.adressetabel "
36 + "WHERE gadeid IS NOT NULL "
37 + debugFilter
38 ;
39
40
41 try ( Connection conn = DBConnection.getConnection();
42 Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
43 ) {
44 stmt.setFetchSize(Integer.MIN_VALUE);
45 ResultSet res = stmt.executeQuery(sql);
46
47 List<Address> list = new ArrayList<Address>(2600000);//initial capacity 2.6 mio
48
49 DeduplicateHelper<String> vejnavnCache = new DeduplicateHelper<String>(81920);
50 DeduplicateHelper<String> husnrbogstavCache = new DeduplicateHelper<String>();
51 DeduplicateHelper<String> distributorCache = new DeduplicateHelper<String>();
52 DeduplicateHelper<String> dirigeringsCache = new DeduplicateHelper<String>(16*1024);
53
54 DeduplicateHelper<String> baneCache = new DeduplicateHelper<String>();
55
56
57 while (res.next()) {
58
59 Address a = new Address();
60 a.id = res.getInt(1);
61 a.vejnavn = vejnavnCache.getInstance( res.getString(2) );
62 a.husnr = (short) res.getInt(3);
63 a.husnrbogstav = husnrbogstavCache.getInstance( res.getString(4) );
64 a.kommunekode = (short) res.getInt(5);
65 a.vejkode = (short)res.getInt(6);
66 a.postnr = (short)res.getInt(7);
67 a.gadeid = res.getInt(8);
68 a.distributor = distributorCache.getInstance(res.getString(9));
69 a.dbkBane = baneCache.getInstance( res.getString(10) );
70 a.latitude = (float) res.getDouble(11);
71 a.longitude = (float) res.getDouble(12);
72
73 a.routingMandag.rute = dirigeringsCache.getInstance( res.getString(13) );
74 a.routingMandag.koreliste = dirigeringsCache.getInstance( res.getString(14) );
75
76 a.routingTirsdag.rute = dirigeringsCache.getInstance( res.getString(15) );
77 a.routingTirsdag.koreliste = dirigeringsCache.getInstance( res.getString(16) );
78
79 a.routingOnsdag.rute = dirigeringsCache.getInstance( res.getString(17) );
80 a.routingOnsdag.koreliste = dirigeringsCache.getInstance( res.getString(18) );
81
82 a.routingTorsdag.rute = dirigeringsCache.getInstance( res.getString(19) );
83 a.routingTorsdag.koreliste = dirigeringsCache.getInstance( res.getString(20) );
84
85 a.routingFredag.rute = dirigeringsCache.getInstance( res.getString(21) );
86 a.routingFredag.koreliste = dirigeringsCache.getInstance( res.getString(22) );
87
88 a.routingLordag.rute = dirigeringsCache.getInstance( res.getString(23) );
89 a.routingLordag.koreliste = dirigeringsCache.getInstance( res.getString(24) );
90
91 a.routingSondag.rute = dirigeringsCache.getInstance( res.getString(25) );
92 a.routingSondag.koreliste = dirigeringsCache.getInstance( res.getString(26) );
93
94
95 //Ajourfør adresse objectets dækningstype
96 AddressUtils.updateDaekningstype(a);
97
98 list.add(a);
99 }
100 res.close();
101
102
103 System.out.println("DB Loaded " + list.size() + " adresses in " + timing.getElapsed() + "ms");
104
105 return list;
106 }
107 }
108
109 @Override
110 public List<AliasBean> getAliasList() throws SQLException {
111 TimingHelper timing = new TimingHelper();
112
113
114 String sql = "SELECT postnr,vejnavn,aliasvejnavn " +
115 "FROM bogleveringer.vejtabelprod "
116 ;
117
118 try ( Connection conn = DBConnection.getConnection();
119 Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
120 ) {
121
122 stmt.setFetchSize(Integer.MIN_VALUE);
123
124 ResultSet res = stmt.executeQuery(sql);
125
126 DeduplicateHelper<String> vejCache = new DeduplicateHelper<String>();
127
128 List<AliasBean> list = new ArrayList<AliasBean>( 5000);
129 while (res.next()) {
130
131 AliasBean ab = new AliasBean();
132 ab.postnr = res.getShort(1);
133 ab.vejnavn = vejCache.getInstance( res.getString(2) );
134 ab.aliasVejnavn = vejCache.getInstance( res.getString(3) );
135
136 list.add(ab);
137 }
138
139 res.close();
140
141 System.out.println("DB Loaded " + list.size() + " aliase beans in " + timing.getElapsed() + "ms");
142
143 return list;
144 }
145
146 }
147
148 @Override
149 public List<ExtendedBean> getExtendedAdresslist() throws SQLException {
150
151 TimingHelper timing = new TimingHelper();
152
153 String debugFilter1 = DatabaseLayerImplementation.DEBUG ? " WHERE orgPostnr = 8700 " : "";
154 String debugFilter2 = DatabaseLayerImplementation.DEBUG ? " AND orgPostnr = 8700 " : "";
155
156
157 String sql = "select orgid, a.id as targetid, afstand, LOWER(type) as type from fulddaekning.afstand_anden_rute a " +
158 "LEFT join odbc.transporttype t " +
159 "ON (t.Rute = a.Rute) " +
160 debugFilter1 +
161
162 "UNION ALL " +
163
164 "SELECT orgid, a.id as targetid, afstand,'' as type FROM fulddaekning.afstand_anden_rute_bk a " +
165 "left join bogleveringer.postnummerdistributor d on d.PostNr = a.orgPostnr " +
166 "WHERE d.Distributor <> 10057 " +
167 debugFilter2
168 ;
169
170 try ( Connection conn = DBConnection.getConnection();
171 Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
172 ) {
173
174
175 stmt.setFetchSize(Integer.MIN_VALUE);
176
177 ResultSet res = stmt.executeQuery(sql);
178
179 DeduplicateHelper<String> transportCache = new DeduplicateHelper<String>();
180
181 List<ExtendedBean> list = new ArrayList<ExtendedBean>( 350000); //Initial capacity 350K
182 while (res.next()) {
183
184 ExtendedBean eb = new ExtendedBean();
185 eb.orgId = res.getInt(1);
186 eb.targetId = res.getInt(2);
187 eb.afstand = (float) res.getDouble(3);
188 eb.transport = transportCache.getInstance(res.getString(4));
189
190 list.add(eb);
191 }
192
193 res.close();
194
195 System.out.println("DB Loaded " + list.size() + " extendedbeans in " + timing.getElapsed() + "ms");
196
197 return list;
198 }
199 }
200
201 @Override
202 public Map<Short,HundredePctBean> get100PctList() throws SQLException {
203 TimingHelper timing = new TimingHelper();
204
205 String sql = "SELECT postnr,UPPER(distributor) as distributor,rute,koreliste,dbkbane " +
206 "FROM bogleveringer.adresser_udenfor_daekning";
207
208 try ( Connection conn = DBConnection.getConnection();
209 Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
210 ) {
211 ResultSet res = stmt.executeQuery(sql);
212
213 Map<Short, HundredePctBean> map = new HashMap<Short,HundredePctBean>();
214
215 DeduplicateHelper<String> distributorCache = new DeduplicateHelper<String>();
216 DeduplicateHelper<String> ruteCache = new DeduplicateHelper<String>();
217 DeduplicateHelper<String> korelisteCache = new DeduplicateHelper<String>();
218 DeduplicateHelper<String> baneCache = new DeduplicateHelper<String>();
219
220 while (res.next()) {
221
222
223 HundredePctBean bean = new HundredePctBean();
224 bean.postnr = (short) res.getInt(1);
225 bean.distributor = distributorCache.getInstance(res.getString(2));
226 bean.rute = ruteCache.getInstance( res.getString(3) );
227 bean.koreliste = korelisteCache.getInstance(res.getString(4) );
228 bean.dbkBane = baneCache.getInstance(res.getString(5) );
229
230 map.put(bean.postnr, bean);
231 }
232
233 res.close();
234
235 System.out.println("DB Loaded " + map.size() + " 100pct beans in " + timing.getElapsed() + "ms");
236
237 return map;
238 }
239
240 }
241
242 @Override
243 public void saveRequestLog(String brugerid, String postnr, String adresse, String omdelingsdag, SearchResult result) throws SQLException {
244 String setVar = "set sql_mode = 'NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' ";
245
246 String sql = "INSERT INTO logs.hentruteinformation (postnr,adresse,vejnavn,googlevejnavn,husnr,husnr_bogstav,etage,lejlighed,rest,brugerid,status, OmdelingDag, indlast) " +
247 "VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NOW() )";
248
249
250
251 try ( Connection conn = DBConnection.getConnection();
252 Statement setStmt = conn.createStatement();
253 PreparedStatement stmt = conn.prepareStatement(sql);
254 ) {
255
256 setStmt.execute(setVar);
257
258
259 stmt.setInt( 1, safeInt(postnr) );
260 stmt.setString( 2, adresse);
261 stmt.setString( 3, result.splitResult.vej);
262 stmt.setString( 4, coalesce(result.googleVej,result.osmVej) );
263 stmt.setString( 5, nullify(result.splitResult.husnr) );
264 stmt.setString( 6, result.splitResult.litra);
265 stmt.setString( 7, result.splitResult.etage);
266 stmt.setString( 8, result.splitResult.lejlighed);
267 stmt.setString( 9, result.splitResult.resten);
268 stmt.setString(10, brugerid);
269 stmt.setInt(11, getStatusInt(result.status) );
270 stmt.setString(12, omdelingsdag);
271
272 stmt.executeUpdate();
273
274 }
275 }
276
277
278
279
280 private static int safeInt(String str) {
281 try {
282 return Integer.parseInt( str );
283 } catch (NumberFormatException e) {
284 return 0;
285 }
286 }
287
288 private static String nullify(String str) {
289 if (str == null)
290 return null;
291
292 if (str.equals("")) {
293 return null;
294 } else {
295 return str;
296 }
297 }
298
299 private static String coalesce(String s1, String s2) {
300 if (s1 != null)
301 return s1;
302
303 return s2;
304 }
305
306 public static int getStatusInt(SearchResult.Status status) {
307
308 switch (status) {
309 case ERROR_UNKNOWN_POSTAL:
310 return 20;
311 case ERROR_MISSING_HOUSENUMBER:
312 return 21;
313 case ERROR_POSTBOX:
314 return 22;
315 case ERROR_UNKNOWN_STREETNAME:
316 return 23;
317 case ERROR_UNKNOWN_ADDRESSPOINT:
318 return 24;
319 case STATUS_NOT_COVERED:
320 return 25;
321 case ERROR_INTERNAL: //
322 return 26;
323
324 case STATUS_OK:
325 return 30;
326
327 default:
328 return 31;
329 }
330 }
331
332 }

  ViewVC Help
Powered by ViewVC 1.1.20