--- dao/DaoAdresseService/src/dk/daoas/daoadresseservice/AdressSearch.java 2015/02/13 11:48:23 2274
+++ dao/DaoAdresseService/src/dk/daoas/daoadresseservice/AdressSearch.java 2015/02/13 16:15:49 2286
@@ -7,7 +7,11 @@
import java.util.concurrent.ConcurrentHashMap;
import dk.daoas.daoadresseservice.AddressUtils.SplitResult;
-import dk.daoas.daoadresseservice.SearchResult.Status;
+import dk.daoas.daoadresseservice.beans.Address;
+import dk.daoas.daoadresseservice.beans.ExtendedBean;
+import dk.daoas.daoadresseservice.beans.HundredePctBean;
+import dk.daoas.daoadresseservice.beans.SearchResult;
+import dk.daoas.daoadresseservice.beans.SearchResult.Status;
import dk.daoas.daoadresseservice.db.DatabaseLayer;
public class AdressSearch {
@@ -17,8 +21,8 @@
List
alleAdresser;
- /* Mapper mellem db Row ID og adresse noden */
- Map idAddressMap;
+
+ Map hundredePct;
public SearchResult search(String postnrStr, String adresse) {
@@ -56,6 +60,14 @@
if (addr == null) {
return new SearchResult(Status.ERROR_UNKNOWN_ADDRESSPOINT);
}
+
+ if (addr.daekningsType == DaekningsType.DAEKNING_IKKEDAEKKET) {
+ return new SearchResult(Status.STATUS_NOT_COVERED);
+ }
+
+ if (addr.distributor.equals("LUKKET")) {
+ return new SearchResult(Status.STATUS_NOT_COVERED); //Skal vi have en special status til Lukkede adresser ?
+ }
return new SearchResult(addr);
@@ -65,9 +77,15 @@
public void buildSearchStructures() throws SQLException{
searchPostnrVejnavnGadeid = new HashMap>();
searchGadeidentAdresser = new HashMap>();
- idAddressMap = new HashMap();
+
+ System.out.println("Build -- stage 1");
alleAdresser = DatabaseLayer.getAllAdresses();
+
+
+ /* Mapper mellem db Row ID og adresse noden */
+ Map idAddressMap = new HashMap( alleAdresser.size() );
+
for (Address a : alleAdresser) {
idAddressMap.put(a.id, a);
@@ -78,9 +96,10 @@
searchPostnrVejnavnGadeid.put(a.postnr, postnrVeje);
}
- Long gadeident = postnrVeje.get(a.vasketVejnavn);
+ String vasketVejnavn = AddressUtils.vaskVejnavn(a.vejnavn);
+ Long gadeident = postnrVeje.get(vasketVejnavn);
if (gadeident == null) {
- postnrVeje.put(a.vasketVejnavn, a.gadeid);
+ postnrVeje.put(vasketVejnavn, a.gadeid);
}
Map gade = searchGadeidentAdresser.get(a.gadeid);
@@ -89,11 +108,178 @@
searchGadeidentAdresser.put(a.gadeid, gade);
}
String husnrSearch = "" + a.husnr + a.husnrbogstav;
- gade.put(husnrSearch, a);
-
+ gade.put(husnrSearch, a);
+ }
+
+
+ ////////////////////////////////////////////////////////////////////////////////////////
+ System.out.println("Build -- stage 2 udvidet dækning");
+
+ List extDao = DatabaseLayer.getExtendedAdresslist();
+ for (ExtendedBean eb : extDao) {
+
+ Address orgAddress = idAddressMap.get(eb.orgId);
+ if (orgAddress == null)
+ continue;
+
+ Address targetAddress = idAddressMap.get(eb.targetId);
+ if (targetAddress == null)
+ continue;
+
+ if (orgAddress.distributor != null && orgAddress.distributor.equals("LUKKET")) {
+ continue;
+ }
+
+ if (targetAddress.distributor.equals("LUKKET")) {
+ continue;
+ }
+
+ orgAddress.extTarget = targetAddress;
+ orgAddress.extAfstand = eb.afstand;
+
+ boolean covered = false;
+ if (targetAddress.distributor.equals("DAO")) {
+ orgAddress.rute = calculateExtendedDaoRoute(eb,orgAddress,targetAddress);
+ if (orgAddress.rute != null) {
+ orgAddress.koreliste = targetAddress.koreliste;
+ covered = true;
+ }
+ }
+
+ if (targetAddress.distributor.equals("BK")) {
+ orgAddress.koreliste = calculateExtendedBkKoreliste(eb,orgAddress,targetAddress);
+ if (orgAddress.koreliste != null) {
+ orgAddress.rute = targetAddress.rute;
+ covered = true;
+ }
+ }
+
+ if (covered) { //Kopier resten af felterne
+ orgAddress.daekningsType = DaekningsType.DAEKNING_UDVIDET;
+ orgAddress.dbkBane = targetAddress.dbkBane;
+
+ /* Sådan gør den gamle service */
+ orgAddress.kommunekode = targetAddress.kommunekode;
+ orgAddress.vejkode = targetAddress.vejkode;
+
+ orgAddress.distributor = targetAddress.distributor;
+ }
+ }
+
+ // nu skal vi ikke bruge idAddressMap længere
+ idAddressMap = null;
+
+ //////////////////////////////////////////////////////////////////////////////////////
+ System.out.println("Build -- stage 3 - 100pct");
+
+ hundredePct = DatabaseLayer.get100PctList();
+ for (Address addr : alleAdresser) {
+ if (addr.daekningsType != DaekningsType.DAEKNING_IKKEDAEKKET) {
+ continue;
+ }
+
+ if (addr.distributor != null && addr.distributor.equals("LUKKET")) {
+ continue;
+ }
+
+ HundredePctBean bean = hundredePct.get(addr.postnr);
+ if (bean == null) {
+ continue;
+ }
+
+ addr.daekningsType = DaekningsType.DAEKNING_100PCT;
+ addr.rute = bean.rute;
+ addr.koreliste = bean.koreliste;
+ addr.dbkBane = bean.dbkBane;
+ addr.distributor = bean.distributor;
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////////
+ System.out.println("Build -- Gathering statistics");
+
+ int direkteCount = 0;
+ int extendedCount = 0;
+ int hundredePctCount = 0;
+ int ikkeDaekketCount = 0;
+
+ for (Address addr : alleAdresser) {
+ switch (addr.daekningsType) {
+ case DAEKNING_DIREKTE:
+ direkteCount++;
+ break;
+ case DAEKNING_UDVIDET:
+ extendedCount++;
+ break;
+ case DAEKNING_100PCT:
+ hundredePctCount++;
+ break;
+ default:
+ ikkeDaekketCount++;
+ }
}
+ System.out.println("Build: direkteCount: " + direkteCount);
+ System.out.println("Build: extendedCount: " + extendedCount);
+ System.out.println("Build: hundredePctCount: " + hundredePctCount);
+ System.out.println("Build: ikkeDaekketCount: " + ikkeDaekketCount);
+
+ System.out.println("Build Completed");
+
}
+
+ private String calculateExtendedDaoRoute(ExtendedBean eb, Address orgAddress, Address targetAddress) {
+
+ // ///////////////////////////////////////////////////////////////////
+ switch( eb.transport) {
+ case "cykel":
+ if (eb.afstand < 0.151) {
+ return "." + targetAddress.rute;
+ } else if (eb.afstand < 0.501) {
+ return ".." + targetAddress.rute;
+ } else if (eb.afstand < 0.701) {
+ return "..." + targetAddress.rute;
+ } else if (eb.afstand < 0.501) {
+ return "...." + targetAddress.rute;
+ }
+ break;
+ case "scooter":
+ if (eb.afstand < 0.151) {
+ return "." + targetAddress.rute;
+ } else if (eb.afstand < 0.801) {
+ return ".." + targetAddress.rute;
+ } else if (eb.afstand < 1.201) {
+ return "..." + targetAddress.rute;
+ } else if (eb.afstand < 2.101) {
+ return "...." + targetAddress.rute;
+ }
+ break;
+ case "bil":
+ if (eb.afstand < 0.151) {
+ return "." + targetAddress.rute;
+ } else if (eb.afstand < 1.001) {
+ return ".." + targetAddress.rute;
+ } else if (eb.afstand < 1.601) {
+ return "..." + targetAddress.rute;
+ } else if (eb.afstand < 2.601) {
+ return "...." + targetAddress.rute;
+ }
+ break;
+ }
+ return null;
+ }
+
+ ///////////////////////////////////////////////////////////
+ private String calculateExtendedBkKoreliste(ExtendedBean eb, Address orgAddress, Address targetAddress) {
+ String inject;
+ if (eb.afstand <= 0.500) {
+ inject = ".";
+ } else {
+ inject = "..";
+ }
+ return AddressUtils.injectIntoBk(targetAddress.koreliste, inject);
+ }
+
+
}