--- dao/DaoAdresseService/src/main/java/dk/daoas/daoadresseservice/AddressSearch.java 2016/01/19 17:03:18 2831 +++ dao/DaoAdresseService/src/main/java/dk/daoas/daoadresseservice/AddressSearch.java 2016/03/07 20:40:40 2966 @@ -34,10 +34,10 @@ public class AddressSearch { private Map> searchPostnrVejnavnGadeid; - private Map>> searchGadeidentAdresser; // Gadeident -> husnrumre -> litra + private Map>> searchGadeidentAdresser; // Gadeident -> husnrumre -> litra - private List
ikkeDaekkedeAdresser = new ArrayList
(60000); - private List
hundredePctAdresser = new ArrayList
(120000); + private ArrayList
ikkeDaekkedeAdresser = new ArrayList
(60000); + private ArrayList
hundredePctAdresser = new ArrayList
(120000); private Map helperCache; @@ -58,7 +58,7 @@ this.db = db; this.config = config; - levenshteinHelper = new LevenshteinStreetnameHelper( this ); + levenshteinHelper = new LevenshteinStreetnameHelper(); metaphoneHelper = new DoubleMetaphoneStreetnameHelper(config); googleHelper = new GoogleStreetnameHelper( config ); osmHelper = new OSMStreetnameHelper( config ); @@ -66,15 +66,21 @@ public Address getAddressSafe(int gadeid, short husnr, String litra) throws Exception { - Map> gade = searchGadeidentAdresser.get(gadeid); + Map> gade = searchGadeidentAdresser.get(gadeid); if (gade == null) { throw new Exception("GadeID ikke fundet"); } - Map litraList = gade.get(husnr); + List
litraList = gade.get(husnr); - Address addr = litraList.get(litra); + Address addr = null; + for(Address a : litraList) { + if (a.husnrbogstav.equals(litra) ) { + addr = a; + break; + } + } if (addr == null) { throw new Exception("Adresse ikke ikke fundet"); @@ -181,25 +187,26 @@ result.gadeident = gadeident; - Map> gade = searchGadeidentAdresser.get(gadeident); + Map> gade = searchGadeidentAdresser.get(gadeident); if (gade == null) { //Denne søgning må ikke fejle result.status = Status.ERROR_INTERNAL; return result; } + //Kunne evt klares med Iterables.get fra Guava/Collections - Address firstAddress = gade.values().iterator().next().values().iterator().next(); //Første husnr -> første litra + Address firstAddress = gade.values().iterator().next().get(0); //Første husnr -> første litra result.vej = firstAddress.vejnavn; short husnrSearch = Short.parseShort(result.splitResult.husnr ); - Map litraList = gade.get(husnrSearch); + List
litraList = gade.get(husnrSearch); if (litraList == null) { //Husnr ikke fundet if (naermesteHusnr) { - TreeMap> gadeTreeMap = (TreeMap>) gade; + TreeMap> gadeTreeMap = (TreeMap>) gade; result.anvendtHusnr = NearestShortTreeMap.getNearestKey(husnrSearch, gadeTreeMap); result.nearestHusnr = true; @@ -212,12 +219,18 @@ } } - Address addr = litraList.get( result.splitResult.litra ); + Address addr = null; + for(Address a : litraList) { + if ( a.husnrbogstav.equals( result.splitResult.litra ) ) { + addr = a; + break; + } + } if (addr == null) { //litra ikke fundet if (config.nearestLitra == true || naermesteHusnr == true) { result.nearestLitra = true; - addr = litraList.values().iterator().next(); + addr = litraList.get(0); } else { //husnr fundet men litra blev ikke fundet result.status = Status.ERROR_UNKNOWN_ADDRESSPOINT; @@ -307,7 +320,7 @@ public void buildSearchStructures() throws SQLException{ searchPostnrVejnavnGadeid = new HashMap>(); - searchGadeidentAdresser = new HashMap>>(); + searchGadeidentAdresser = new HashMap>>(); helperCache = new ConcurrentHashMap(); // ////////////////////// @@ -328,6 +341,7 @@ AliasGenerator aliasGenerator = new AliasGenerator(); + ArrayList> litraListCache = new ArrayList>(); for (Address a : alleAdresser) { idAddressMap.put(a.id, a); @@ -357,28 +371,31 @@ } - Map> gade = searchGadeidentAdresser.get(gadeident); + Map> gade = searchGadeidentAdresser.get(gadeident); if (gade == null) { - gade = new TreeMap>(); + gade = new TreeMap >(); searchGadeidentAdresser.put(gadeident, gade); } - Map litraList = gade.get(a.husnr); + List
litraList = gade.get(a.husnr); if (litraList == null) { - litraList = new HashMap(); + litraList = new ArrayList
(); gade.put(a.husnr, litraList); + + litraListCache.add( (ArrayList
) litraList); } - - litraList.put(a.husnrbogstav, a); + litraList.add(a); + } + + for (ArrayList
list: litraListCache) { + list.trimToSize(); } - aliasGenerator.clear(); //frigiv hukommelse inden stage2 - aliasGenerator = null; + litraListCache.clear(); //frigiv hukommelse inden stage2 + aliasGenerator.clear(); shortHelper.clear(); - shortHelper = null; intHelper.clear(); - intHelper = null; //////////////////////////////////////////////////////////////////////////////////////// @@ -433,10 +450,10 @@ if (orgAddress == null) continue; - if (orgAddress.daekningsType != DaekningsType.DAEKNING_IKKEDAEKKET) { + /*if (orgAddress.daekningsType != DaekningsType.DAEKNING_IKKEDAEKKET) { //kan være at adressen er blevet markeret dækket og - find-nærmeste data ikke er opdateret i mellemtiden continue; - } + }*/ Address targetAddress = idAddressMap.get(eb.targetId); if (targetAddress == null) { @@ -459,21 +476,21 @@ boolean covered = false; if (targetAddress.distributor.equals("DAO")) { - orgAddress.ruteMandag = calculateExtendedDaoRoute(eb,orgAddress,targetAddress); - orgAddress.ruteMandag = ruteHelper.getInstance(orgAddress.ruteMandag); + orgAddress.routingMandag.rute = calculateExtendedDaoRoute(eb, targetAddress); + orgAddress.routingMandag.rute = ruteHelper.getInstance(orgAddress.routingMandag.rute); - if (orgAddress.ruteMandag != null) { - orgAddress.korelisteMandag = targetAddress.korelisteMandag; + if (orgAddress.routingMandag.rute != null) { + orgAddress.routingMandag.koreliste = targetAddress.routingMandag.koreliste; covered = true; } } if (targetAddress.distributor.equals("BK")) { - orgAddress.korelisteMandag = calculateExtendedBkKoreliste(eb,orgAddress,targetAddress); - orgAddress.korelisteMandag = korelisteHelper.getInstance(orgAddress.korelisteMandag); + orgAddress.routingMandag.koreliste = calculateExtendedBkKoreliste(eb, targetAddress); + orgAddress.routingMandag.koreliste = korelisteHelper.getInstance(orgAddress.routingMandag.koreliste); - if (orgAddress.korelisteMandag != null) { - orgAddress.ruteMandag = targetAddress.ruteMandag; + if (orgAddress.routingMandag.koreliste != null) { + orgAddress.routingMandag.rute = targetAddress.routingMandag.rute; covered = true; } } @@ -519,8 +536,8 @@ } addr.daekningsType = DaekningsType.DAEKNING_100PCT; - addr.ruteMandag = bean.rute; - addr.korelisteMandag = bean.koreliste; + addr.routingMandag.rute = bean.rute; + addr.routingMandag.koreliste = bean.koreliste; addr.dbkBane = bean.dbkBane; addr.distributor = bean.distributor; } @@ -549,8 +566,10 @@ } stats.totalCount = alleAdresser.size(); - ikkeDaekkedeAdresser.sort( null ); // ved Null comparator bruges Comparable interfacet - ikkeDaekkedeAdresser.sort( null ); + ikkeDaekkedeAdresser.trimToSize(); + hundredePctAdresser.trimToSize(); + Collections.sort( ikkeDaekkedeAdresser ); //Bruger Comparable interfacet + Collections.sort( hundredePctAdresser ); stats.elapsed = stop-start1; @@ -582,8 +601,8 @@ } - private String calculateExtendedDaoRoute(ExtendedBean eb, Address orgAddress, Address targetAddress) { - if (targetAddress.ruteMandag == null) { //hvis targetAdress.rute er null så er adressen ikke dækket alligevel + private String calculateExtendedDaoRoute(ExtendedBean eb, Address targetAddress) { + if (targetAddress.routingMandag.rute == null) { //hvis targetAdress.rute er null så er adressen ikke dækket alligevel return null; } @@ -591,35 +610,35 @@ switch( eb.transport) { case "cykel": if (eb.afstand < 0.151) { - return "." + targetAddress.ruteMandag; + return "." + targetAddress.routingMandag.rute; } else if (eb.afstand < 0.501) { - return ".." + targetAddress.ruteMandag; + return ".." + targetAddress.routingMandag.rute; } else if (eb.afstand < 0.701) { - return "..." + targetAddress.ruteMandag; + return "..." + targetAddress.routingMandag.rute; } else if (eb.afstand < 1.001) { - return "...." + targetAddress.ruteMandag; + return "...." + targetAddress.routingMandag.rute; } break; case "scooter": if (eb.afstand < 0.151) { - return "." + targetAddress.ruteMandag; + return "." + targetAddress.routingMandag.rute; } else if (eb.afstand < 0.801) { - return ".." + targetAddress.ruteMandag; + return ".." + targetAddress.routingMandag.rute; } else if (eb.afstand < 1.201) { - return "..." + targetAddress.ruteMandag; + return "..." + targetAddress.routingMandag.rute; } else if (eb.afstand < 2.101) { - return "...." + targetAddress.ruteMandag; + return "...." + targetAddress.routingMandag.rute; } break; case "bil": if (eb.afstand < 0.151) { - return "." + targetAddress.ruteMandag; + return "." + targetAddress.routingMandag.rute; } else if (eb.afstand < 1.001) { - return ".." + targetAddress.ruteMandag; + return ".." + targetAddress.routingMandag.rute; } else if (eb.afstand < 1.601) { - return "..." + targetAddress.ruteMandag; + return "..." + targetAddress.routingMandag.rute; } else if (eb.afstand < 2.601) { - return "...." + targetAddress.ruteMandag; + return "...." + targetAddress.routingMandag.rute; } break; default: @@ -637,14 +656,18 @@ } /////////////////////////////////////////////////////////// - private String calculateExtendedBkKoreliste(ExtendedBean eb, Address orgAddress, Address targetAddress) { + private String calculateExtendedBkKoreliste(ExtendedBean eb, Address targetAddress) { + if (targetAddress.routingMandag.rute == null) { //hvis targetAdress.rute er null så er adressen ikke dækket alligevel + return null; + } + String inject; if (eb.afstand <= 0.500) { inject = "."; } else { inject = ".."; } - return AddressUtils.injectIntoBk(targetAddress.korelisteMandag, inject); + return AddressUtils.injectIntoBk(targetAddress.routingMandag.koreliste, inject); } @@ -662,11 +685,11 @@ public Set getHusnumre(int gadeid) { - Map> gade = searchGadeidentAdresser.get(gadeid); + Map> gade = searchGadeidentAdresser.get(gadeid); Set set = new TreeSet( new NaturalOrderComparator() ); - for(Map litraList : gade.values()) { - for (Address a: litraList.values()) { + for(List
litraList : gade.values()) { + for (Address a: litraList) { set.add( a.husnr + a.husnrbogstav ); } } @@ -678,9 +701,16 @@ short husnr = Short.parseShort( husnrStr.replaceAll("[^\\d]","") ); String litra = husnrStr.replaceAll("\\d", ""); - Map> gade = searchGadeidentAdresser.get(gadeid); - Map litraList = gade.get(husnr); - return litraList.get(litra); + Map> gade = searchGadeidentAdresser.get(gadeid); + List
litraList = gade.get(husnr); + + for(Address addr : litraList) { + if (addr.husnrbogstav.equals(litra)) { + return addr; + } + } + + return null; }