--- dao/DaoAdresseVedligehold/src/main/java/dk/daoas/adressevedligehold/afstandandenrute/Database.java 2016/01/30 14:15:53 2880 +++ dao/DaoAdresseVedligehold/src/main/java/dk/daoas/adressevedligehold/afstandandenrute/DatabaseRouteDistance.java 2016/03/08 09:41:53 2972 @@ -14,15 +14,16 @@ import java.util.Set; import java.util.TreeSet; import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.logging.Logger; import dk.daoas.adressevedligehold.beans.Address; +import dk.daoas.adressevedligehold.tasks.TaskLogger; import dk.daoas.adressevedligehold.util.DeduplicateHelper; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -public class Database { - Logger logger = Logger.getLogger(Database.class.getName()); +public class DatabaseRouteDistance { + private TaskLogger logger = TaskLogger.getInstance(); int batchCount = 0; @@ -34,6 +35,8 @@ Map> daekkedeAddressrHO = new HashMap>(); + String weekdayField; + @@ -46,20 +49,33 @@ //Map> ikkeDaekkedePrPost = new HashMap>(); + boolean isIncremental; private HashMap bbCache = new HashMap(); - public Database(Connection conn) throws SQLException,IOException { + public DatabaseRouteDistance(Connection conn, boolean isIncremental, String weekdayField) throws SQLException,IOException { this.conn = conn; + + String newExt = ""; + if (isIncremental == false) { + newExt = "_ny"; + } + + this.weekdayField = weekdayField; - 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`) "+ + String sql = "INSERT IGNORE INTO fulddaekning.afstand_anden_rute" + newExt + " (orgId,orgPostnr, orgAdresse,orgGadeid,orgHusnr,orgHusnrBogstav,orgRute,id,postnr,adresse,gadeid,husnr,husnrbogstav,rute,afstand,`timestamp`) "+ "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, now() )"; saveStmt = conn.prepareStatement(sql); + this.isIncremental = isIncremental; } public void resetResultTable() throws SQLException { + if (isIncremental == true) { + return; + } + try (Statement stmt = conn.createStatement()) { logger.info("Dropping old result table (if exists)"); String sql = "DROP TABLE IF EXISTS fulddaekning.afstand_anden_rute_ny"; @@ -72,11 +88,16 @@ } } + @SuppressFBWarnings("SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE") public void renameResultTables() throws SQLException { if (AfstandAndenRuteTask.test_mode == true) { throw new RuntimeException("Can not rename tables in test mode"); } + if (isIncremental) { + return; + } + Constants consts = Constants.getInstance(); try (Statement stmt = conn.createStatement()) { @@ -99,7 +120,7 @@ public BoundingBox getBoundingbox(short postnr) { BoundingBox bb = bbCache.get(postnr); - return bb.clone();//never return the original / cached object + return new BoundingBox(bb); //never return the original / cached object } @@ -109,20 +130,36 @@ public Queue
hentAlleIkkedaekkedeAdresser(int minPostnr, int maxPostnr) throws SQLException { + String placeHolder1 = "%INCREMENTAL1%"; + String placeHolder2 = "%INCREMENTAL2%"; + + Constants consts = Constants.getInstance(); logger.info("Henter alle IKKE-daekkede Addressr"); - String sql = "SELECT id,a.postnr,vejnavn,gadeid,husnr,husnrbogstav,latitude,longitude,ruteMa,p.distributor as ho " + - "FROM fulddaekning.Addresstabel a " + + String sql = "SELECT a.id,a.postnr,a.vejnavn,a.gadeid,a.husnr,a.husnrbogstav,latitude,longitude,ruteMa,p.distributor as ho " + + "FROM fulddaekning.adressetabel a " + "LEFT JOIN bogleveringer.postnummerdistributor p on (a.postnr=p.postnr) " + - "WHERE ruteMa IS NULL " + //Ingen dækning + placeHolder1 + + "WHERE " + weekdayField + " IS NULL " + //Ingen dækning "AND a.postnr BETWEEN ? AND ? " + "AND latitude IS NOT NULL " + "AND longitude IS NOT NULL " + - "AND gadeid IS NOT NULL " + - "AND (a.distributor IS NULL OR a.distributor<>'LUKKET') " + "AND a.gadeid IS NOT NULL " + + "AND (a.distributor IS NULL OR a.distributor<>'LUKKET') " + + placeHolder2 + + "ORDER BY gadeid " ; + + if (isIncremental) { + sql = sql.replace(placeHolder1, "LEFT JOIN fulddaekning.afstand_anden_rute" + consts.getTableExtension() +" afstand ON (a.id = afstand.orgId) " ); + sql = sql.replace(placeHolder2, "AND afstand.id IS NULL " ); + } else { + sql = sql.replace(placeHolder1, ""); + sql = sql.replace(placeHolder2, ""); + } + if (AfstandAndenRuteTask.test_mode == true) { sql = sql + " LIMIT 100 "; } @@ -176,9 +213,9 @@ if ( alleAddressr == null ) { String sql = "SELECT id,a.postnr,vejnavn,gadeid,husnr,husnrbogstav,latitude,longitude,ruteMa,p.distributor as ho " + - "FROM fulddaekning.Addresstabel a " + + "FROM fulddaekning.adressetabel a " + "LEFT JOIN bogleveringer.postnummerdistributor p on (a.postnr=p.postnr) " + - "WHERE ruteMa IS NOT NULL " + + "WHERE " + weekdayField + " IS NOT NULL " + "AND latitude IS NOT NULL " + "AND longitude IS NOT NULL " + "AND a.distributor = ? "; @@ -190,7 +227,7 @@ // Forward only + concur_read_only + fetchsize tvinger driver til at hente en række af gangen (bedre performance ved store result sets) // Se http://dev.mysql.com/doc/connector-j/en/connector-j-reference-implementation-notes.html - try (PreparedStatement stmt = conn.prepareStatement(sql, java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY)) { + try (PreparedStatement stmt = conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)) { stmt.setFetchSize(Integer.MIN_VALUE); stmt.setString(1, distributor); @@ -258,6 +295,39 @@ //saveStmt.close(); } + + @SuppressFBWarnings("SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE") + public void prepareIncrementalSearch() throws SQLException { + if (isIncremental == false) { + return; + } + + logger.info("prepareIncrementalSearch() "); + + Constants consts = Constants.getInstance(); + + String sql1 = "UPDATE fulddaekning.afstand_anden_rute" + consts.getTableExtension() + " afstand " + + "JOIN fulddaekning.adressetabel addr ON (afstand.id = addr.id) " + + "SET afstand.id = 0 " + + "WHERE ruteMa is null " + ; + + String sql2 = "DELETE FROM fulddaekning.afstand_anden_rute" + consts.getTableExtension() + " " + + "WHERE id=0 " + ; + + + try (Statement stmt = conn.createStatement()) { + + int rows = stmt.executeUpdate(sql1); + logger.info(sql1 + "\n updated rows: " + rows); + + rows = stmt.executeUpdate(sql2); + logger.info(sql2 + "\n deleted rows: " + rows); + + } + } + public synchronized void saveBatch() throws SQLException{ saveStmt.executeBatch(); batchCount = 0; @@ -276,6 +346,7 @@ while (res.next()) { + double latitude = res.getDouble(7); double longitude = res.getDouble(8); @@ -293,12 +364,16 @@ adr.ruteMandag = ruteCache.getInstance( res.getString(9) ); adr.ho = res.getShort(10); + + if (consts.validatePostnr(adr.postnr) == false) {//delegate to Constants implementations to validate whether we should look at this address + continue; + } + list.add(adr); if (consts.doCheckHO() == true && adr.ho == 0) { - System.out.println( "Mangler HO" ); - System.out.println( adr ); - System.exit(0); + logger.info( "Mangler HO: " + adr ); + throw new RuntimeException("Mangler HO: "+ adr); } //logger.info( "Adress:" + adr);