package dk.daoas.daoadresseservice; import java.sql.SQLException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import dk.daoas.daoadresseservice.AddressUtils.SplitResult; import dk.daoas.daoadresseservice.SearchResult.Status; import dk.daoas.daoadresseservice.db.DatabaseLayer; public class AdressSearch { Map> searchPostnrVejnavnGadeid; Map> searchGadeidentAdresser; List
alleAdresser; /* Mapper mellem db Row ID og adresse noden */ Map idAddressMap; Map hundredePct; public SearchResult search(String postnrStr, String adresse) { int postnr=0; try { postnr = Integer.parseInt(postnrStr); } catch (Exception E) { return new SearchResult(Status.ERROR_UNKNOWN_POSTAL); } Map postnrVeje = searchPostnrVejnavnGadeid.get(postnr); if (postnrVeje == null) { return new SearchResult(Status.ERROR_UNKNOWN_POSTAL); } SplitResult split = AddressUtils.splitAdresse(adresse); String vasketVejnavn = AddressUtils.vaskVejnavn( split.vej ); if (split.husnr.length() == 0) { return new SearchResult(Status.ERROR_MISSING_HOUSENUMBER); } Long gadeident = postnrVeje.get(vasketVejnavn); if (gadeident == null) { return new SearchResult(Status.ERROR_UNKNOWN_STREETNAME); } Map gade = searchGadeidentAdresser.get(gadeident); //Denne søgning må ikke fejle String husnrSearch = "" + split.husnr + split.litra; Address addr = gade.get(husnrSearch); 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); } public void buildSearchStructures() throws SQLException{ searchPostnrVejnavnGadeid = new HashMap>(); searchGadeidentAdresser = new HashMap>(); idAddressMap = new HashMap(); System.out.println("Build -- stage 1"); alleAdresser = DatabaseLayer.getAllAdresses(); for (Address a : alleAdresser) { idAddressMap.put(a.id, a); Map postnrVeje = searchPostnrVejnavnGadeid.get(a.postnr); if (postnrVeje == null) { postnrVeje = new ConcurrentHashMap(); searchPostnrVejnavnGadeid.put(a.postnr, postnrVeje); } Long gadeident = postnrVeje.get(a.vasketVejnavn); if (gadeident == null) { postnrVeje.put(a.vasketVejnavn, a.gadeid); } Map gade = searchGadeidentAdresser.get(a.gadeid); if (gade == null) { gade = new HashMap(); searchGadeidentAdresser.put(a.gadeid, gade); } String husnrSearch = "" + a.husnr + a.husnrbogstav; 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; orgAddress.rute = calculateExtendedRoute(eb,orgAddress,targetAddress); if (orgAddress.rute != null) { orgAddress.daekningsType = DaekningsType.DAEKNING_UDVIDET; orgAddress.koreliste = targetAddress.koreliste; orgAddress.dbkBane = targetAddress.dbkBane; /* Sådan gør den gamle service */ orgAddress.kommunekode = targetAddress.kommunekode; orgAddress.vejkode = targetAddress.vejkode; orgAddress.distributor = targetAddress.distributor; } } ////////////////////////////////////////////////////////////////////////////////////// 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; } } private String calculateExtendedRoute(ExtendedBean eb, Address orgAddress, Address targetAddress) { switch (targetAddress.distributor) { case "DAO": // /////////////////////////////////////////////////////////////////// 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; } break; /////////////////////////////////////////////////////////// case "BK": String inject; if (eb.afstand <= 0.500) { inject = "."; } else { inject = ".."; } return AddressUtils.injectIntoBk(targetAddress.rute, inject); } return null; } }