/[projects]/dao/DaoAdresseVedligehold/src/main/java/dk/daoas/adressevedligehold/afstandandenrute/Database.java
ViewVC logotype

Annotation of /dao/DaoAdresseVedligehold/src/main/java/dk/daoas/adressevedligehold/afstandandenrute/Database.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2879 - (hide annotations) (download)
Sat Jan 30 14:12:51 2016 UTC (8 years, 4 months ago) by torben
File size: 9622 byte(s)
FindBugs: use try-with-resources
1 torben 2878 package dk.daoas.adressevedligehold.afstandandenrute;
2    
3     import java.io.IOException;
4     import java.sql.Connection;
5     import java.sql.PreparedStatement;
6     import java.sql.ResultSet;
7     import java.sql.SQLException;
8 torben 2879 import java.sql.Statement;
9 torben 2878 import java.util.ArrayList;
10     import java.util.HashMap;
11     import java.util.List;
12     import java.util.Map;
13     import java.util.Queue;
14     import java.util.Set;
15     import java.util.TreeSet;
16     import java.util.concurrent.ConcurrentLinkedQueue;
17     import java.util.logging.Logger;
18    
19     import dk.daoas.adressevedligehold.beans.Address;
20     import dk.daoas.adressevedligehold.util.DeduplicateHelper;
21    
22    
23    
24     public class Database {
25     Logger logger = Logger.getLogger(Database.class.getName());
26    
27     int batchCount = 0;
28    
29     Connection conn;
30     PreparedStatement saveStmt;
31    
32     List<Address> alleAddressr;
33     Address alleIkkeDaekkede[];
34    
35     Map<Short,List<Address>> daekkedeAddressrHO = new HashMap<Short,List<Address>>();
36    
37    
38    
39    
40    
41     DeduplicateHelper<String> vejnavnCache = new DeduplicateHelper<String>();
42     DeduplicateHelper<String> husnrbogstavCache = new DeduplicateHelper<String>();
43     DeduplicateHelper<String> ruteCache = new DeduplicateHelper<String>();
44    
45     Set<Short> postnumre = new TreeSet<Short>();
46    
47     //Map<Short, List<Address>> ikkeDaekkedePrPost = new HashMap<Short, List<Address>>();
48    
49    
50     private HashMap<Short,BoundingBox> bbCache = new HashMap<Short,BoundingBox>();
51    
52     public Database(Connection conn) throws SQLException,IOException {
53     this.conn = conn;
54    
55     String sql = "INSERT INTO fulddaekning.afstand_anden_rute_ny (orgId,orgPostnr, orgAddress,orgGadeid,orgHusnr,orgHusnrBogstav,orgRute,id,postnr,Address,gadeid,husnr,husnrbogstav,rute,afstand,`timestamp`) "+
56     "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, now() )";
57    
58     saveStmt = conn.prepareStatement(sql);
59    
60     }
61    
62     public void resetResultTable() throws SQLException {
63 torben 2879 try (Statement stmt = conn.createStatement()) {
64     logger.info("Dropping old result table (if exists)");
65     String sql = "DROP TABLE IF EXISTS fulddaekning.afstand_anden_rute_ny";
66     stmt.executeUpdate(sql);
67    
68     logger.info("Create new result table");
69     sql = "CREATE TABLE fulddaekning.afstand_anden_rute_ny LIKE fulddaekning.afstand_anden_rute";
70     stmt.executeUpdate(sql);
71    
72     }
73 torben 2878 }
74    
75     public void renameResultTables() throws SQLException {
76     if (AfstandAndenRuteTask.test_mode == true) {
77     throw new RuntimeException("Can not rename tables in test mode");
78     }
79 torben 2879
80 torben 2878 Constants consts = Constants.getInstance();
81    
82 torben 2879 try (Statement stmt = conn.createStatement()) {
83    
84     String ext = consts.getTableExtension();
85    
86     logger.info("Dropping old backup table (if exists)");
87     String sql = "DROP TABLE IF EXISTS fulddaekning.afstand_anden_rute_old" + ext;
88     stmt.executeUpdate(sql);
89    
90     logger.info("Rename tables");
91     String sql2 = "RENAME TABLE fulddaekning.afstand_anden_rute" + ext + " TO fulddaekning.afstand_anden_rute_old" + ext + ", fulddaekning.afstand_anden_rute_ny TO fulddaekning.afstand_anden_rute" + ext;
92    
93     logger.info("Executing: " + sql2);
94     stmt.executeUpdate(sql2);
95     }
96    
97 torben 2878
98     }
99    
100     public BoundingBox getBoundingbox(short postnr) {
101     BoundingBox bb = bbCache.get(postnr);
102     return bb.clone();//never return the original / cached object
103     }
104    
105    
106     public Set<Short> hentPostnumreCache() {
107     return postnumre;
108     }
109    
110    
111     public Queue<Address> hentAlleIkkedaekkedeAdresser(int minPostnr, int maxPostnr) throws SQLException {
112    
113     logger.info("Henter alle IKKE-daekkede Addressr");
114    
115     String sql = "SELECT id,a.postnr,vejnavn,gadeid,husnr,husnrbogstav,latitude,longitude,ruteMa,p.distributor as ho " +
116     "FROM fulddaekning.Addresstabel a " +
117     "LEFT JOIN bogleveringer.postnummerdistributor p on (a.postnr=p.postnr) " +
118     "WHERE ruteMa IS NULL " + //Ingen dækning
119     "AND a.postnr BETWEEN ? AND ? " +
120     "AND latitude IS NOT NULL " +
121     "AND longitude IS NOT NULL " +
122     "AND gadeid IS NOT NULL " +
123     "AND (a.distributor IS NULL OR a.distributor<>'LUKKET') "
124     ;
125    
126     if (AfstandAndenRuteTask.test_mode == true) {
127     sql = sql + " LIMIT 100 ";
128     }
129    
130 torben 2879 try (PreparedStatement stmt = conn.prepareStatement(sql)) {
131    
132 torben 2878
133 torben 2879 stmt.setInt(1, minPostnr);
134     stmt.setInt(2, maxPostnr);
135    
136     List<Address> list = hentAdresseListe( stmt );
137     alleIkkeDaekkede = list.toArray( new Address[ list.size() ] );
138 torben 2878
139 torben 2879 logger.info("Analyserer ikke-daekkede Addressr");
140 torben 2878
141 torben 2879 for (Address a : alleIkkeDaekkede) {
142 torben 2878
143    
144 torben 2879 BoundingBox bbox;
145 torben 2878
146 torben 2879 if (! postnumre.contains(a.postnr )) {
147     postnumre.add( a.postnr );
148    
149     bbox = new BoundingBox();
150    
151     bbCache.put( a.postnr, bbox);
152    
153     } else {
154     bbox = bbCache.get( a.postnr);
155     }
156    
157     bbox.latitudeMax = Math.max(bbox.latitudeMax, a.latitude);
158     bbox.latitudeMin = Math.min(bbox.latitudeMin, a.latitude);
159     bbox.longitudeMax = Math.max(bbox.longitudeMax, a.longitude);
160     bbox.longitudeMin = Math.min(bbox.longitudeMin, a.longitude);
161    
162    
163 torben 2878 }
164 torben 2879 return new ConcurrentLinkedQueue<Address>( list );
165 torben 2878 }
166     }
167    
168    
169    
170    
171     public Map<Short, List<Address>> getDaekkedeAdresserHO() {
172     return daekkedeAddressrHO;
173     }
174    
175     public int hentAlleDaekkedeAdresser(String distributor) throws SQLException {
176    
177     if ( alleAddressr == null ) {
178     String sql = "SELECT id,a.postnr,vejnavn,gadeid,husnr,husnrbogstav,latitude,longitude,ruteMa,p.distributor as ho " +
179     "FROM fulddaekning.Addresstabel a " +
180     "LEFT JOIN bogleveringer.postnummerdistributor p on (a.postnr=p.postnr) " +
181     "WHERE ruteMa IS NOT NULL " +
182     "AND latitude IS NOT NULL " +
183     "AND longitude IS NOT NULL " +
184     "AND a.distributor = ? ";
185    
186     if (AfstandAndenRuteTask.test_mode == true) {
187     sql = sql + " AND a.postnr BETWEEN 6000 and 7200 ";
188     }
189    
190     // Forward only + concur_read_only + fetchsize tvinger driver til at hente en række af gangen (bedre performance ved store result sets)
191 torben 2879 // Se http://dev.mysql.com/doc/connector-j/en/connector-j-reference-implementation-notes.html
192 torben 2878
193 torben 2879 try (PreparedStatement stmt = conn.prepareStatement(sql, java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY)) {
194     stmt.setFetchSize(Integer.MIN_VALUE);
195    
196     stmt.setString(1, distributor);
197    
198     List<Address> list = hentAdresseListe( stmt );
199 torben 2878
200 torben 2879 alleAddressr = new ArrayList<Address>();
201     alleAddressr.addAll(list);
202 torben 2878
203 torben 2879 for(Address addr : list) {
204     short ho = addr.ho;
205     List<Address> hoListe = daekkedeAddressrHO.get(ho);
206     if ( hoListe == null) {
207     hoListe = new ArrayList<Address>();
208     daekkedeAddressrHO.put(ho, hoListe);
209     }
210    
211     hoListe.add(addr);
212    
213     }
214 torben 2878 }
215     }
216    
217     return alleAddressr.size();
218 torben 2879
219 torben 2878 }
220    
221    
222    
223     public synchronized void gemResultat(Address orgAddress, Address bedsteAddress, double bedsteAfstand) throws SQLException {
224     /*String sql = "INSERT INTO fulddaekning.afstand_anden_rute_thn (orgId,orgPostnr, orgVejnavn,orgGadeid,orgHusnr,orgHusnrBogstav,orgLatitude,orgLongitude,orgRute,id,postnr,vejnavn,gadeid,husnr,husnrbogstav,latitude,longitude,rute,afstand,`timestamp`) "+
225     "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, now() )";
226    
227    
228     PreparedStatement saveStmt = conn.prepareStatement(sql);*/
229    
230     saveStmt.setInt(1, orgAddress.id);
231     saveStmt.setShort(2, orgAddress.postnr);
232     saveStmt.setString(3, orgAddress.vejnavn);
233     saveStmt.setInt(4, orgAddress.gadeid);
234     saveStmt.setShort(5, orgAddress.husnr);
235     saveStmt.setString(6, orgAddress.husnrbogstav);
236     saveStmt.setString(7, orgAddress.ruteMandag);
237    
238    
239     saveStmt.setInt(8, bedsteAddress.id);
240     saveStmt.setShort(9, bedsteAddress.postnr);
241     saveStmt.setString(10, bedsteAddress.vejnavn);
242     saveStmt.setInt(11, bedsteAddress.gadeid);
243     saveStmt.setShort(12, bedsteAddress.husnr);
244     saveStmt.setString(13, bedsteAddress.husnrbogstav);
245     saveStmt.setString(14, bedsteAddress.ruteMandag);
246    
247     saveStmt.setDouble(15, bedsteAfstand);
248    
249     saveStmt.addBatch();
250     batchCount++;
251     if (batchCount >= 1000) {
252     saveStmt.executeBatch();
253     batchCount = 0;
254     }
255     //saveStmt.executeUpdate();
256     //saveStmt.clearParameters();
257    
258     //saveStmt.close();
259     }
260    
261     public synchronized void saveBatch() throws SQLException{
262     saveStmt.executeBatch();
263     batchCount = 0;
264     }
265    
266    
267    
268     protected ArrayList<Address> hentAdresseListe(PreparedStatement stmt) throws SQLException{
269     ArrayList<Address> list = new ArrayList<Address>( 1000000 );
270    
271     Constants consts = Constants.getInstance();
272    
273     //logger.info("Starting query");
274     ResultSet res = stmt.executeQuery();
275     //logger.info("Starting exec query done");
276    
277     while (res.next()) {
278    
279     double latitude = res.getDouble(7);
280     double longitude = res.getDouble(8);
281    
282    
283     Address adr = new Address(latitude,longitude);
284    
285     adr.id = res.getInt(1);
286     adr.postnr = res.getShort(2);
287     adr.vejnavn = vejnavnCache.getInstance( res.getString(3) );
288     adr.gadeid = res.getInt(4);
289     adr.husnr = res.getShort(5);
290     adr.husnrbogstav = husnrbogstavCache.getInstance( res.getString(6) );
291     //adr.latitude = res.getDouble(7);
292     //adr.longitude = res.getDouble(8);
293     adr.ruteMandag = ruteCache.getInstance( res.getString(9) );
294     adr.ho = res.getShort(10);
295    
296     list.add(adr);
297    
298     if (consts.doCheckHO() == true && adr.ho == 0) {
299     System.out.println( "Mangler HO" );
300     System.out.println( adr );
301     System.exit(0);
302     }
303    
304     //logger.info( "Adress:" + adr);
305     }
306    
307     res.close();
308     stmt.close();
309    
310     return list;
311     }
312    
313     }

  ViewVC Help
Powered by ViewVC 1.1.20