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

  ViewVC Help
Powered by ViewVC 1.1.20