--- dao/FuldDaekningWorker/src/dk/daoas/fulddaekning/Lookup.java 2014/04/30 13:34:24 2148 +++ dao/FuldDaekningWorker/src/dk/daoas/fulddaekning/Lookup.java 2014/12/09 20:39:45 2238 @@ -2,45 +2,118 @@ import java.io.File; import java.io.FileReader; +import java.util.List; import java.util.Map; -import java.util.Properties; +import java.util.Queue; import java.util.concurrent.ConcurrentHashMap; +import java.util.logging.FileHandler; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.logging.SimpleFormatter; import dk.daoas.fulddaekning.BoundingBox.BoundingBoxException; public class Lookup { + + static final String CONFIG_FILENAME = "fulddaekning.properties"; + static int max_workers; static boolean verbose; - static Properties conf; + static boolean rename_tables; + static String distributor; + + static SafeProperties conf; static Logger logger = Logger.getLogger( Lookup.class.toString() ); - + String postnr; Database db; - WorkSet workset; + + Adresse daekkedeAdresser[]; + Queue queue; Map workers = new ConcurrentHashMap(); + static Statistik flestDaekkede = new Statistik(); + static Statistik flestIkkeDaekkede = new Statistik(); + static Statistik mestBrugteTid = new Statistik(); + static Statistik stoersteDataset = new Statistik(); - public Lookup(WorkSet workset, Database db) { - this.db = db; - this.workset = workset; + static Adresse[] alleDaekkedeAdresser; + + + static class Statistik { + String postnr; + int antalDaekkede = 0; + int antalIkkeDaekkede = 0; + int totalDataset = 0; + long forbrugtTid = 0; + + + @Override + public String toString() { + return "postnr=" + postnr + " antalIkkeDaekkede=" + antalIkkeDaekkede + " antalDaekkede=" + antalDaekkede + " forbrugtTid=" + forbrugtTid + " totalDataset=" + totalDataset; + } } + public Lookup(String postnr, Database db) { + this.postnr = postnr; + this.db = db; + } + + public static void saveStatistics(Statistik stat) { + if (stat.antalDaekkede > flestDaekkede.antalDaekkede) { + flestDaekkede = stat; + } + if (stat.antalIkkeDaekkede > flestIkkeDaekkede.antalIkkeDaekkede) { + flestIkkeDaekkede = stat; + } + + if (stat.totalDataset > mestBrugteTid.totalDataset) { + stoersteDataset = stat; + } + + if (stat.forbrugtTid > mestBrugteTid.forbrugtTid) { + mestBrugteTid = stat; + } + } public void doLookup() throws BoundingBoxException { - logger.info("Starting for postnr=" + workset.postnr); + logger.info("Starting for postnr=" + postnr); + Statistik stat = new Statistik(); + long start1 = System.currentTimeMillis(); long start2 = 0; try { - - logger.info("Starter beregning for " + workset.postnr); + + logger.info("Henter _ikke_ daekkede adresser i " + postnr); + queue = db.hentIkkedaekkedeAdresser(postnr); + if (queue.size() == 0) { + logger.info("Fandt ikke nogen _ikke_ daekkede adresser i " + postnr); + return; + } + + BoundingBox bbox = db.getBoundingbox(postnr); + bbox.validateBbox(); + + logger.info("Bbox=" + bbox); + bbox.adjustToMargin(); + logger.info("Bbox Adjusted=" + bbox); + + logger.info("Henter daekkede adresser i " + postnr); + daekkedeAdresser = db.hentDaekkedeAdresser(bbox); + + stat.postnr = postnr; + stat.antalDaekkede = daekkedeAdresser.length; + stat.antalIkkeDaekkede = queue.size(); + stat.totalDataset = stat.antalDaekkede * stat.antalIkkeDaekkede; + + + logger.info("Starter beregning for " + postnr); start2 = System.currentTimeMillis(); for (int i =0; i getQueue() { + return queue; + } + + + + + ///////////////////////////// // Static functions @@ -98,70 +189,116 @@ public static void main(String[] args) throws Exception { - File confFile = new File("fulddaekning.properties"); + //Setup j.u.l Logger + Logger root = Logger.getLogger(""); + FileHandler fhandler = new FileHandler("fulddaekning.log"); // Ingen max størrelse, ingen rotation og ingen append + fhandler.setFormatter( new SimpleFormatter() ); + root.addHandler( fhandler ); + + + + + File confFile = new File( CONFIG_FILENAME ); if (! confFile.exists() ) { - logger.warning("Config file not found"); + logger.warning("Config file not found: " + CONFIG_FILENAME); System.exit(1); } - conf = new Properties(); + conf = new SafeProperties(); conf.load( new FileReader(confFile) ); - max_workers = Integer.parseInt( conf.getProperty("MAX_WORKERS") ); + max_workers = Integer.parseInt( conf.getSafeProperty("MAX_WORKERS") ); logger.info("Starting with MAX_WORKERS:" + max_workers); - verbose = Boolean.parseBoolean( conf.getProperty("VERBOSE") ); + verbose = Boolean.parseBoolean( conf.getSafeProperty("VERBOSE") ); logger.info("Starting with VERBOSE:" + verbose); + rename_tables = Boolean.parseBoolean( conf.getSafeProperty("RENAMETABLES") ); + logger.info("Starting with RENAMETABLES:" + rename_tables); + + distributor = conf.getSafeProperty("DISTRIBUTOR"); + distributor = distributor.toUpperCase(); + logger.info("Starting for DISTRIBUTOR:" + distributor); + + Constants.init(distributor); + Constants consts = Constants.getInstance(); + Database db = new Database(conf); - db.resetResultTable(); + + - InputWorker inputWorker = new InputWorker(db); - Thread inputThread = new Thread(inputWorker); - inputThread.start(); + boolean testRun= false; long start = System.currentTimeMillis(); - boolean doContinue = true; - while (inputWorker.queue.isEmpty() == true) { - Thread.sleep(3); //Vent indtil at første arbejds sæt er på plads - } + if (testRun == false) { - - while ( doContinue == true ) { - WorkSet set = inputWorker.queue.poll(); + logger.info("Finder postnumre"); + List postnumre = db.hentPostnumre(); + + // Først validerer vi BBox på alle postnummre, for at undgå fuldt stop midt i beregningen + for(String postnr : postnumre) { // + logger.info("Validerer BBox for " + postnr); + BoundingBox bbox = db.getBoundingbox(postnr); + bbox.validateBbox(); + } - if (set != null) { - Lookup lookup = new Lookup(set, db); - lookup.doLookup(); + if (consts.doExtendedLookup()) { + logger.info("Henter alle daekkede adresser"); + alleDaekkedeAdresser = db.hentAlleDaekkedeAdresser(); + logger.info( "AlleDaekkedeAdresser.length=" + alleDaekkedeAdresser.length); + } + + + //pre-check er ok - reset tmp tabel og start søgningen + db.resetResultTable(); + + for(String postnr : postnumre) { + Lookup lookup = new Lookup(postnr, db); + lookup.doLookup(); + } + + if (rename_tables) { + db.renameResultTables(); } else { - System.out.println("Buffer underrun"); - Thread.sleep(100); + logger.info( "Rename tables is disabled !!!" ); + } + + + + } else { + /// Test + db.resetResultTable(); + + if (consts.doExtendedLookup()) { + alleDaekkedeAdresser = db.hentAlleDaekkedeAdresser(); + logger.info( "AlleDaekkedeAdresser.length=" + alleDaekkedeAdresser.length); } - if ( inputWorker.isDone == true && inputWorker.queue.isEmpty() == true) - doContinue = false; + Lookup lookup = new Lookup("458x", db); + lookup.doLookup(); } - /*logger.info("Finder postnumre"); - List postnumre = db.hentPostnumre(); - - for(Integer postnr : postnumre) { - Lookup lookup = new Lookup(postnr, db); - lookup.doLookup(); - }*/ - long now = System.currentTimeMillis(); + long elapsed = now - start ; - logger.info("Fuld load done : " + (now-start) ); - - - //Lookup lookup = new Lookup(7400, db); - //lookup.doLookup(); + logger.info("Mest brugte tid: " + mestBrugteTid); + logger.info("Flest Ikke-dækkede, " + flestIkkeDaekkede); + logger.info("Flest Dækkede, " + flestDaekkede); + logger.info("Største Dataset, " + stoersteDataset); + logger.info("Fuld load done : " + formatMilliSeconds(elapsed) ); } - + static String formatMilliSeconds(long milliseconds) { + int mseconds = (int) milliseconds % 1000; + int seconds = (int) (milliseconds / 1000) % 60 ; + int minutes = (int) ((milliseconds / (1000*60)) % 60); + int hours = (int) ((milliseconds / (1000*60*60)) % 24); + + return String.format("%02d:%02d:%02d.%03d", hours, minutes, seconds, mseconds); + } + }