--- dao/DaoAdresseVedligehold/src/main/java/dk/daoas/adressevedligehold/AddressManager.java 2016/01/25 21:43:59 2844
+++ dao/DaoAdresseVedligehold/src/main/java/dk/daoas/adressevedligehold/AddressManager.java 2016/02/05 08:01:18 2924
@@ -2,6 +2,7 @@
import java.sql.SQLException;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -14,21 +15,33 @@
import dk.daoas.adressevedligehold.beans.Address;
import dk.daoas.adressevedligehold.beans.Address.AddressState;
import dk.daoas.adressevedligehold.db.DatabaseLayerImplementation;
+import dk.daoas.adressevedligehold.tasks.TaskLogger;
import dk.daoas.adressevedligehold.util.DeduplicateHelper;
+import dk.daoas.adressevedligehold.util.MiscUtils;
import dk.daoas.adressevedligehold.util.TimingHelper;
/*
* TODO: håndtering af entry dupletter ! (+ rapportering af dem)
+
+
+
*/
public class AddressManager {
+ private TaskLogger logger = TaskLogger.getInstance();
+
+ private int duplicateCount;
List
addressList;
Map> > searchStructure;
- ArrayList afvisteEntries = new ArrayList();
+ ArrayList rejectedEntries = new ArrayList();
+
+ Map unknownStreets = new TreeMap();
+
+ Map dbkBaneMap = new TreeMap();
public AddressManager() throws SQLException {
DatabaseLayerImplementation db = new DatabaseLayerImplementation();
@@ -49,6 +62,13 @@
Short husnr = shortHelper.getInstance( a.husnr );
TreeMap> gade = searchStructure.get( gadeid );
+ if (a.dbkBane > 0 && a.postnr<=4999) {
+ Short bane = dbkBaneMap.get(a.postnr);
+ if (bane == null) {
+ dbkBaneMap.put(a.postnr, a.dbkBane);
+ }
+ }
+
if (gade == null) {
gade = new TreeMap>();
searchStructure.put(gadeid, gade);
@@ -68,7 +88,7 @@
list.trimToSize();
}
- System.out.println("AddressManager ready, elapsed " + timer.getElapsed() + "ms");
+ logger.info("AddressManager ready, elapsed " + timer.getElapsed() + "ms");
}
@@ -157,24 +177,24 @@
if (addr.state == AddressState.NOT_CHANGED) {
continue;
}
- if (addr.stateMan == AddressState.NOT_CHANGED || addr.stateMan == AddressState.CREATED) {
+ /*if (addr.stateMan == AddressState.NOT_CHANGED || addr.stateMan == AddressState.CREATED) {
continue;
- }
+ }*/
if (addr.stateMan != AddressState.MODIFIED ) {
continue;
}
- System.out.println(addr.state + ": " + addr.toStringExtended() );
- System.out.println(addr.getRuteString() );
+ logger.info(addr.state + ": " + addr.toStringExtended() );
+ logger.info(addr.getRuteString() );
- if (count++ > 15)
+ if (count++ > 50)
return;
}
}
public void writeBackChanges() {
- System.out.println("Writing back changes");
+ logger.info("Writing back changes");
TimingHelper timer = new TimingHelper();
List updates = new ArrayList(1024*1024);
@@ -190,9 +210,13 @@
}
DatabaseLayerImplementation db = new DatabaseLayerImplementation();
+
db.updateAddresses(updates);
+ db.saveNewAddresses(inserts);
+
- System.out.println("Writeback done: elapsed " + timer.getElapsed() + "ms.");
+
+ logger.info("Writeback done: elapsed " + timer.getElapsed() + "ms.");
}
@@ -207,6 +231,10 @@
private void visitSingle(AddressSourceEntry entry) {
TreeMap> gade = searchStructure.get( entry.gadeid );
if (gade == null) {
+ if (! unknownStreets.containsKey(entry.gadeid)) {
+ unknownStreets.put(entry.gadeid, entry.vejnavn);
+ }
+
createFromEntry(entry); // if we get here there was no match - so we need to create it
return;
}
@@ -216,22 +244,28 @@
createFromEntry(entry); // if we get here there was no match - so we need to create it
return;
}
-
+ boolean found = false;
for (Address addr : litraList) {
if (addr.husnrbogstav.equals(entry.litra) ) {
updateAddress(addr, entry);
- return; //Done for now - no need to look at the rest of the list
+ found = true; // 1 visit should be enough but as long as there's duplicates on gadeid+husnr+litra we will visit them all
+ //when the issue with duplicates is resolved this should be reverted to a return or break
}
}
-
- createFromEntry(entry); // if we get here there was no match - so we need to create it
+ if (found == false) {
+ createFromEntry(entry); // if we get here there was no match - so we need to create it
+ }
}
private void visitRange(AddressSourceEntry entry) {
TreeMap> gade = searchStructure.get( entry.gadeid );
if (gade == null) {
- System.out.println("[Range] Ukendt gadeID " + entry);
+ if (! unknownStreets.containsKey(entry.gadeid)) {
+ unknownStreets.put(entry.gadeid, entry.vejnavn);
+ }
+
+ logger.info("[Range] Ukendt gadeID " + entry);
return;
}
@@ -270,148 +304,240 @@
private void updateAddress(Address addr, AddressSourceEntry entry) {
if ( addr.distributor != null && addr.distributor.equals(entry.distributor) == false) {
- afvisteEntries.add(entry);
- System.out.println("Afviser " + entry);
+ rejectedEntries.add(entry);
+ logger.info("Afviser " + entry);
return;
}
- addr.visited = true;
- if (addr.state == AddressState.NOT_CHANGED) {
- if (addr.distributor == null) {
- addr.state = AddressState.OPENED;
- addr.distributor = entry.distributor;
- } else {
- addr.state = AddressState.MODIFIED;
- }
- }
+
if (entry.ugedage.mandag) {
- addr.visitedMan = true;
- if (addr.ruteMandag == null) {
- addr.stateMan = AddressState.OPENED;
- addr.ruteMandag = entry.rute;
- addr.korelisteMandag = entry.koreliste;
- } else {
-
- if (StringUtils.equals(addr.ruteMandag, entry.rute) == false || StringUtils.equals(addr.korelisteMandag, entry.koreliste) == false) {
- addr.stateMan = AddressState.MODIFIED;
+ if (addr.visitedMan == false) {
+ addr.visitedMan = true;
+ if (addr.ruteMandag == null) {
+ addr.stateMan = AddressState.OPENED;
addr.ruteMandag = entry.rute;
- addr.korelisteMandag = entry.koreliste;
- }
+ addr.korelisteMandag = entry.koreliste;
+ } else {
+
+ if (StringUtils.equals(addr.ruteMandag, entry.rute) == false || StringUtils.equals(addr.korelisteMandag, entry.koreliste) == false) {
+ addr.stateMan = AddressState.MODIFIED;
+ addr.ruteMandag = entry.rute;
+ addr.korelisteMandag = entry.koreliste;
+ }
+ }
+ } else {
+ duplicateCount++;
+ logger.info( "Double visit monday " + addr);
+ return; // if the entry is duplicate on one day that it covers - then it will be as well on all the othters
}
+
}
if (entry.ugedage.tirsdag) {
- addr.visitedTir = true;
- if (addr.ruteTirsdag == null) {
- addr.stateTir = AddressState.OPENED;
- addr.ruteTirsdag = entry.rute;
- addr.korelisteTirsdag = entry.koreliste;
- } else {
-
- if (StringUtils.equals(addr.ruteTirsdag, entry.rute) == false || StringUtils.equals(addr.korelisteTirsdag, entry.koreliste) == false) {
- addr.stateTir = AddressState.MODIFIED;
+ if (addr.visitedTir == false) {
+ addr.visitedTir = true;
+ if (addr.ruteTirsdag == null) {
+ addr.stateTir = AddressState.OPENED;
addr.ruteTirsdag = entry.rute;
- addr.korelisteTirsdag = entry.koreliste;
+ addr.korelisteTirsdag = entry.koreliste;
+ } else {
+
+ if (StringUtils.equals(addr.ruteTirsdag, entry.rute) == false || StringUtils.equals(addr.korelisteTirsdag, entry.koreliste) == false) {
+ addr.stateTir = AddressState.MODIFIED;
+ addr.ruteTirsdag = entry.rute;
+ addr.korelisteTirsdag = entry.koreliste;
+ }
}
- }
+ } else {
+ duplicateCount++;
+ logger.info( "Double visit tuesday " + addr);
+ return; // if the entry is duplicate on one day that it covers - then it will be as well on all the othters
+ }
}
if (entry.ugedage.onsdag) {
- addr.visitedOns = true;
- if (addr.ruteOnsdag == null) {
- addr.stateOns = AddressState.OPENED;
- addr.ruteOnsdag = entry.rute;
- addr.korelisteOnsdag = entry.koreliste;
- } else {
-
- if (StringUtils.equals(addr.ruteOnsdag, entry.rute) == false || StringUtils.equals(addr.korelisteOnsdag, entry.koreliste) == false) {
- addr.stateOns = AddressState.MODIFIED;
+ if (addr.visitedOns == false) {
+ addr.visitedOns = true;
+ if (addr.ruteOnsdag == null) {
+ addr.stateOns = AddressState.OPENED;
addr.ruteOnsdag = entry.rute;
- addr.korelisteOnsdag = entry.koreliste;
+ addr.korelisteOnsdag = entry.koreliste;
+ } else {
+
+ if (StringUtils.equals(addr.ruteOnsdag, entry.rute) == false || StringUtils.equals(addr.korelisteOnsdag, entry.koreliste) == false) {
+ addr.stateOns = AddressState.MODIFIED;
+ addr.ruteOnsdag = entry.rute;
+ addr.korelisteOnsdag = entry.koreliste;
+ }
}
- }
+ } else {
+ duplicateCount++;
+ logger.info( "Double visit wednesday " + addr);
+ return; // if the entry is duplicate on one day that it covers - then it will be as well on all the othters
+ }
}
if (entry.ugedage.torsdag) {
- addr.visitedTor = true;
- if (addr.ruteTorsdag == null) {
- addr.stateTor = AddressState.OPENED;
- addr.ruteTorsdag = entry.rute;
- addr.korelisteTorsdag = entry.koreliste;
- } else {
-
-
- if (StringUtils.equals(addr.ruteTorsdag, entry.rute) == false || StringUtils.equals(addr.korelisteTorsdag, entry.koreliste) == false) {
- addr.stateTor = AddressState.MODIFIED;
+ if (addr.visitedTor == false) {
+ addr.visitedTor = true;
+ if (addr.ruteTorsdag == null) {
+ addr.stateTor = AddressState.OPENED;
addr.ruteTorsdag = entry.rute;
- addr.korelisteTorsdag = entry.koreliste;
+ addr.korelisteTorsdag = entry.koreliste;
+ } else {
+
+
+ if (StringUtils.equals(addr.ruteTorsdag, entry.rute) == false || StringUtils.equals(addr.korelisteTorsdag, entry.koreliste) == false) {
+ addr.stateTor = AddressState.MODIFIED;
+ addr.ruteTorsdag = entry.rute;
+ addr.korelisteTorsdag = entry.koreliste;
+ }
}
- }
+ } else {
+ duplicateCount++;
+ logger.info( "Double visit thursday " + addr);
+ return; // if the entry is duplicate on one day that it covers - then it will be as well on all the othters
+ }
}
if (entry.ugedage.fredag) {
- addr.visitedFre = true;
- if (addr.ruteFredag == null) {
- addr.stateFre = AddressState.OPENED;
- addr.ruteFredag = entry.rute;
- addr.korelisteFredag = entry.koreliste;
- } else {
-
- if (StringUtils.equals(addr.ruteFredag, entry.rute) == false || StringUtils.equals(addr.korelisteFredag, entry.koreliste) == false) {
- addr.stateFre = AddressState.MODIFIED;
+ if (addr.visitedFre == false) {
+ addr.visitedFre = true;
+ if (addr.ruteFredag == null) {
+ addr.stateFre = AddressState.OPENED;
addr.ruteFredag = entry.rute;
- addr.korelisteFredag = entry.koreliste;
+ addr.korelisteFredag = entry.koreliste;
+ } else {
+
+ if (StringUtils.equals(addr.ruteFredag, entry.rute) == false || StringUtils.equals(addr.korelisteFredag, entry.koreliste) == false) {
+ addr.stateFre = AddressState.MODIFIED;
+ addr.ruteFredag = entry.rute;
+ addr.korelisteFredag = entry.koreliste;
+ }
}
- }
+ } else {
+ duplicateCount++;
+ logger.info( "Double visit friday " + addr);
+ return; // if the entry is duplicate on one day that it covers - then it will be as well on all the othters
+ }
}
if (entry.ugedage.lordag) {
- addr.visitedLor = true;
- if (addr.ruteLordag == null) {
- addr.stateLor = AddressState.OPENED;
- addr.ruteLordag = entry.rute;
- addr.korelisteLordag = entry.koreliste;
- } else {
-
-
- if (StringUtils.equals(addr.ruteLordag, entry.rute) == false || StringUtils.equals(addr.korelisteLordag, entry.koreliste) == false) {
- addr.stateLor = AddressState.MODIFIED;
+ if (addr.visitedLor == false) {
+ addr.visitedLor = true;
+ if (addr.ruteLordag == null) {
+ addr.stateLor = AddressState.OPENED;
addr.ruteLordag = entry.rute;
- addr.korelisteLordag = entry.koreliste;
+ addr.korelisteLordag = entry.koreliste;
+ } else {
+
+
+ if (StringUtils.equals(addr.ruteLordag, entry.rute) == false || StringUtils.equals(addr.korelisteLordag, entry.koreliste) == false) {
+ addr.stateLor = AddressState.MODIFIED;
+ addr.ruteLordag = entry.rute;
+ addr.korelisteLordag = entry.koreliste;
+ }
}
- }
+ } else {
+ duplicateCount++;
+ logger.info( "Double visit saturday " + addr);
+ return; // if the entry is duplicate on one day that it covers - then it will be as well on all the othters
+ }
}
if (entry.ugedage.sondag) {
- addr.visitedSon = true;
- if (addr.ruteSondag == null) {
- addr.stateSon = AddressState.OPENED;
- addr.ruteSondag = entry.rute;
- addr.korelisteSondag = entry.koreliste;
- } else {
-
- if (StringUtils.equals(addr.ruteSondag, entry.rute) == false || StringUtils.equals(addr.korelisteSondag, entry.koreliste) == false) {
- addr.stateSon = AddressState.MODIFIED;
+ if (addr.visitedSon == false) {
+ addr.visitedSon = true;
+ if (addr.ruteSondag == null) {
+ addr.stateSon = AddressState.OPENED;
addr.ruteSondag = entry.rute;
- addr.korelisteSondag = entry.koreliste;
+ addr.korelisteSondag = entry.koreliste;
+ } else {
+
+ if (StringUtils.equals(addr.ruteSondag, entry.rute) == false || StringUtils.equals(addr.korelisteSondag, entry.koreliste) == false) {
+ addr.stateSon = AddressState.MODIFIED;
+ addr.ruteSondag = entry.rute;
+ addr.korelisteSondag = entry.koreliste;
+ }
}
- }
+ } else {
+ duplicateCount++;
+ logger.info( "Double visit sunday " + addr);
+ return; // if the entry is duplicate on one day that it covers - then it will be as well on all the othters
+ }
}
-
+
+ //addr.visited = true;
+ if (addr.state == AddressState.NOT_CHANGED) {
+ if (addr.distributor == null) {
+ addr.state = AddressState.OPENED;
+ addr.distributor = entry.distributor;
+ } else {
+ if (addr.stateMan != AddressState.NOT_CHANGED || addr.stateTir != AddressState.NOT_CHANGED
+ || addr.stateOns != AddressState.NOT_CHANGED || addr.stateTor != AddressState.NOT_CHANGED
+ || addr.stateFre != AddressState.NOT_CHANGED || addr.stateLor != AddressState.NOT_CHANGED || addr.stateSon != AddressState.NOT_CHANGED ){
+
+ addr.state = AddressState.MODIFIED;
+ }
+ }
+ }
+
+ updateDbkBane(addr);
+
}
private void createFromEntry(AddressSourceEntry entry) {
- System.out.println("Opretter adresse ud fra " + entry);
+ if (entry.husnr >= 1000) { //husnumre i DK må kun være på 3 cifre
+ return;
+ }
+
+ if (entry.husnr == 999) {
+ return;
+ }
+
+ if (entry.litra.length() > 1) { //litra må kun være på 1 tegn
+ return;
+ }
+ if (entry.litra.length() == 1) {
+ char litra = entry.litra.charAt(0);
+ if ( Character.isLetter(litra) == false ) {
+ return;
+ }
+
+ }
+
+ if (entry.kommunekode == 0 || entry.vejkode == 0) {
+ return;
+ }
+ if (entry.kommunekode < 100) {
+ return;
+ }
+
+ if (entry.gadeid == 0) {
+ return;
+ }
+
+ String gadeidStr = Integer.toString(entry.gadeid);
+ if (gadeidStr.length() != 9) {
+ return;
+ }
+ if (Short.parseShort(gadeidStr.substring(0, 4)) != entry.postnr) {
+ return; //gadeid / postnr mismatch
+ }
+
+
+
+ logger.info("Opretter adresse ud fra " + entry);
Address a = new Address();
a.state = AddressState.CREATED;
@@ -424,7 +550,7 @@
a.husnr = entry.husnr;
a.husnrbogstav = entry.litra;
a.postnr = entry.postnr;
- a.visited = true;
+ //a.visited = true;
if (entry.ugedage.mandag) {
a.ruteMandag = entry.rute;
@@ -455,6 +581,8 @@
a.korelisteLordag = entry.koreliste;
}
+ updateDbkBane(a);
+
// Nu er det nye adresse object oprettet - nu skal det gemmes i søge strukturen og totallisten
@@ -476,12 +604,82 @@
}
+
+
+ /*
+ DAO:
+ UPDATE fulddaekning.adressetabel
+ SET dbkbane = case
+ when substr(korelisteMa,1,2) IN ('07','10','11','12','14','15','16','18','19','20') then 205 #DAO-BRA
+ when substr(korelisteMa,1,2) BETWEEN 24 and 30 then 201 #DAO-Ovrige
+ else 202 #dao syd (52-99=
+ END
+ WHERE distributor='DAO'
+ AND ruteMa is not null;
+
+ FD: Altid 200
+ NS: Altid 204
+ BK: 195,196,197,198
+ */
+
+ private void updateDbkBane(Address a) {
+ List daoBane205 = Arrays.asList( new Short[] {7,10,11,12,12,14,15,16,18,19,20} );
+
+
+ Short bane = null;
+
+ switch (a.distributor) {
+ case "BK":
+ bane = dbkBaneMap.get(a.postnr);
+ break;
+ case "DAO":
+ String koreliste = MiscUtils.firstNonNull(a.korelisteMandag,a.korelisteLordag, a.korelisteSondag); //DAO har kun 3 dækningstyper
+ short first2 = Short.parseShort( koreliste.substring(0,2) );
+ if ( daoBane205.contains(first2) ) {
+ bane = 205;
+ } else if (first2 >= 24 && first2<=30) {
+ bane = 201;
+ } else {
+ bane = 202;
+ }
+
+ break;
+ case "FD":
+ bane = 200;
+ break;
+ case "NS":
+ bane = 204;
+ break;
+ default:
+ throw new RuntimeException("Ukendt distributor: " + a.distributor); //Silence findBugs
+ }
+
+ if (bane == null) {
+ throw new RuntimeException("Ukendt bane for postnr: " + a.postnr);
+ }
+
+ if (a.dbkBane != bane) {
+ a.dbkBane = bane;
+ if (a.state ==AddressState.NOT_CHANGED) {
+ a.state = AddressState.MODIFIED;
+ }
+ }
+ }
+
public List getAddressList() {
return Collections.unmodifiableList(addressList);
}
- public int getAfvistAntal() {
- return afvisteEntries.size();
+ public Map getUnknownStreets() {
+ return Collections.unmodifiableMap( unknownStreets );
+ }
+
+ public int getDuplicateCount() {
+ return duplicateCount;
+ }
+
+ public int getRejectedCount() {
+ return rejectedEntries.size();
}
}