/[projects]/dao/DaoAdresseService/src/main/java/dk/daoas/daoadresseservice/AddressSearch.java
ViewVC logotype

Diff of /dao/DaoAdresseService/src/main/java/dk/daoas/daoadresseservice/AddressSearch.java

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2759 by torben, Tue Oct 27 14:44:03 2015 UTC revision 2803 by torben, Wed Jan 13 10:51:39 2016 UTC
# Line 30  import dk.daoas.daoadresseservice.db.Dat Line 30  import dk.daoas.daoadresseservice.db.Dat
30  import dk.daoas.daoadresseservice.util.DaoUtils;  import dk.daoas.daoadresseservice.util.DaoUtils;
31  import dk.daoas.daoadresseservice.util.DeduplicateHelper;  import dk.daoas.daoadresseservice.util.DeduplicateHelper;
32  import dk.daoas.daoadresseservice.util.NaturalOrderComparator;  import dk.daoas.daoadresseservice.util.NaturalOrderComparator;
33    import dk.daoas.daoadresseservice.util.NearestShortTreeMap;
34    
35  public class AddressSearch {  public class AddressSearch {
36    
37          private Map<Short, Map<String,Integer>> searchPostnrVejnavnGadeid;                private Map<Short, Map<String,Integer>> searchPostnrVejnavnGadeid;      
38          private Map<Integer,  Map<String,Address>> searchGadeidentAdresser;          private Map<Integer,  Map<Short, Map<String,Address>>> searchGadeidentAdresser; // Gadeident -> husnrumre -> litra
39            
40    
41          private List<Address> alleAdresser;          private List<Address> alleAdresser;
42                    
# Line 43  public class AddressSearch { Line 45  public class AddressSearch {
45          private DataStatisticsBean stats = new DataStatisticsBean();          private DataStatisticsBean stats = new DataStatisticsBean();
46                    
47          private DatabaseLayer db;          private DatabaseLayer db;
48            private ServiceConfig config;
49                    
50                    
51          StreetnameHelper levenshteinHelper;          StreetnameHelper levenshteinHelper;
52            StreetnameHelper metaphoneHelper;
53          StreetnameHelper googleHelper;          StreetnameHelper googleHelper;
54          StreetnameHelper osmHelper;          StreetnameHelper osmHelper;
55                    
# Line 53  public class AddressSearch { Line 57  public class AddressSearch {
57          public AddressSearch(DatabaseLayer db, ServiceConfig config) {          public AddressSearch(DatabaseLayer db, ServiceConfig config) {
58                                    
59                  this.db = db;                  this.db = db;
60                    this.config = config;
61                                    
62                  levenshteinHelper = new LevenshteinStreetnameHelper( this );                  levenshteinHelper = new LevenshteinStreetnameHelper( this );
63                    metaphoneHelper = new DoubleMetaphoneStreetnameHelper(config);
64                  googleHelper = new GoogleStreetnameHelper( config );                  googleHelper = new GoogleStreetnameHelper( config );
65                  osmHelper = new OSMStreetnameHelper( config );                  osmHelper = new OSMStreetnameHelper( config );
66          }          }
67                    
68          public Address getAddressSafe(int gadeid, String husnr)  throws Exception {          public Address getAddressSafe(int gadeid, short husnr, String litra)  throws Exception {
69                                    
70                  Map<String,Address> gade = searchGadeidentAdresser.get(gadeid);                  Map<Short, Map<String,Address>> gade = searchGadeidentAdresser.get(gadeid);
71                                    
72                  if (gade == null) {                  if (gade == null) {
73                          throw new Exception("GadeID ikke fundet");                          throw new Exception("GadeID ikke fundet");
74                  }                  }
75                                    
76                  Address addr = gade.get("husnr");                  Map<String,Address> litraList = gade.get(husnr);
77                    
78                    Address addr = litraList.get(litra);
79                                    
80                  if (addr == null) {                  if (addr == null) {
81                          throw new Exception("Adresse ikke ikke fundet");                          throw new Exception("Adresse ikke ikke fundet");
# Line 76  public class AddressSearch { Line 84  public class AddressSearch {
84                  return addr;                  return addr;
85          }          }
86                    
87            
88          public SearchResult search(String postnrStr, String adresse)  {          public SearchResult search(String postnrStr, String adresse)  {
89                    return search(postnrStr, adresse, false);
90            }
91            
92            
93            public SearchResult search(String postnrStr, String adresse, boolean naermesteHusnr)  {
94                                    
95                  postnrStr = postnrStr.trim();                  postnrStr = postnrStr.trim();
96                  adresse = adresse.trim();                  adresse = adresse.trim();
# Line 169  public class AddressSearch { Line 182  public class AddressSearch {
182                  result.gadeident = gadeident;                  result.gadeident = gadeident;
183                                    
184                                    
185                  Map<String, Address> gade = searchGadeidentAdresser.get(gadeident);                  Map<Short, Map<String,Address>> gade = searchGadeidentAdresser.get(gadeident);
186                  if (gade == null) { //Denne søgning må ikke fejle                  if (gade == null) { //Denne søgning må ikke fejle
187                          result.status = Status.ERROR_INTERNAL;                          result.status = Status.ERROR_INTERNAL;
188                          return result;                                            return result;                  
# Line 177  public class AddressSearch { Line 190  public class AddressSearch {
190                                    
191                                    
192                  //Kunne evt klares med Iterables.get fra Guava/Collections                  //Kunne evt klares med Iterables.get fra Guava/Collections
193                  Address firstAddress = gade.values().iterator().next();                  Address firstAddress = gade.values().iterator().next().values().iterator().next(); //Første husnr -> første litra
194                  result.vej = firstAddress.vejnavn;                  result.vej = firstAddress.vejnavn;
195                                    
196                  String husnrSearch = "" + result.splitResult.husnr + result.splitResult.litra;                  short husnrSearch = Short.parseShort(result.splitResult.husnr );                
197                  Address addr = gade.get(husnrSearch);                  Map<String,Address> litraList = gade.get(husnrSearch);
198                    
199    
200                  if (addr == null) {                  if (litraList == null) { //Husnr ikke fundet
201                          result.status = Status.ERROR_UNKNOWN_ADDRESSPOINT;                          
202                          return result;                          if (naermesteHusnr) {
203                                    TreeMap<Short, Map<String,Address>> gadeTreeMap = (TreeMap<Short, Map<String,Address>>) gade;
204                                    result.anvendtHusnr = NearestShortTreeMap.getNearestKey(husnrSearch, gadeTreeMap);
205                                    
206                                    result.nearestHusnr = true;
207                                    litraList = gade.get(result.anvendtHusnr);
208                                    
209                                    
210                            } else {
211                                    result.status = Status.ERROR_UNKNOWN_ADDRESSPOINT;
212                                    return result;  
213                            }
214                    }
215                    
216                    Address addr = litraList.get( result.splitResult.litra );
217                    
218                    if (addr == null) { //litra ikke fundet
219                            if (config.nearestLitra == true) {
220                                    result.nearestLitra = true;
221                                    addr = litraList.values().iterator().next();                            
222                            } else {
223                                    //husnr fundet men litra blev ikke fundet
224                                    result.status = Status.ERROR_UNKNOWN_ADDRESSPOINT;
225                                    return result;  
226                            }                      
227                  }                  }
228                                    
229                  result.address = addr;                  result.address = addr;
# Line 226  public class AddressSearch { Line 264  public class AddressSearch {
264                          }                          }
265                  }                  }
266                                    
267                    if (gadeident == null) {
268                            String vej = metaphoneHelper.proposeStreetName(request, result);
269                            if (vej != null) {
270                                    gadeident =  request.streetNames.get(vej);
271                            }
272                    }
273                    
274                                    
275                  // Brug OpenStreetMap før vi prøver google                  // Brug OpenStreetMap før vi prøver google
276                  // For google har en request limit, det har OSM ikke!                  // For google har en request limit, det har OSM ikke!
# Line 263  public class AddressSearch { Line 308  public class AddressSearch {
308                    
309          public void buildSearchStructures() throws SQLException{          public void buildSearchStructures() throws SQLException{
310                  searchPostnrVejnavnGadeid = new HashMap<Short, Map<String,Integer>>();                  searchPostnrVejnavnGadeid = new HashMap<Short, Map<String,Integer>>();
311                  searchGadeidentAdresser = new HashMap<Integer,  Map<String,Address>>();                  searchGadeidentAdresser = new HashMap<Integer,  Map<Short, Map<String,Address>>>();
312                  helperCache = new ConcurrentHashMap<String,Integer>();                  helperCache = new ConcurrentHashMap<String,Integer>();
313                                    
314                  long start1 = System.currentTimeMillis();                  long start1 = System.currentTimeMillis();
# Line 275  public class AddressSearch { Line 320  public class AddressSearch {
320                  /* Mapper mellem db Row ID og adresse noden */                  /* Mapper mellem db Row ID og adresse noden */
321                  Map<Integer,Address> idAddressMap = new HashMap<Integer,Address>( alleAdresser.size() );                  Map<Integer,Address> idAddressMap = new HashMap<Integer,Address>( alleAdresser.size() );
322                  DeduplicateHelper<String> aliasHelper = new DeduplicateHelper<String>();                  DeduplicateHelper<String> aliasHelper = new DeduplicateHelper<String>();
323                  DeduplicateHelper<String> husnrHelper = new DeduplicateHelper<String>();                  
324                    DeduplicateHelper<Short> shortHelper = new DeduplicateHelper<Short>();
325                    DeduplicateHelper<Integer> intHelper = new DeduplicateHelper<Integer>();
326                    
327                                    
328                  for (Address a : alleAdresser) {                  for (Address a : alleAdresser) {
329                          idAddressMap.put(a.id, a);                          idAddressMap.put(a.id, a);
330                                                    
331                          Map<String,Integer> postnrVeje = searchPostnrVejnavnGadeid.get(a.postnr);                                        Short postnr = shortHelper.getInstance(a.postnr);
332                            
333                            Map<String,Integer> postnrVeje = searchPostnrVejnavnGadeid.get(postnr);        
334                                                    
335                          if (postnrVeje == null) {                          if (postnrVeje == null) {
336                                  postnrVeje = new ConcurrentHashMap<String,Integer>();                                  postnrVeje = new HashMap<String,Integer>(10240); //lige nu indeholder den største 9500 entries
337                                  searchPostnrVejnavnGadeid.put(a.postnr, postnrVeje);                                  searchPostnrVejnavnGadeid.put(postnr, postnrVeje);
338                          }                          }
339                                                                    
340                                                    
# Line 293  public class AddressSearch { Line 343  public class AddressSearch {
343                          if (gadeident == null) {                                                          if (gadeident == null) {                                
344                                  //postnrVeje.put(vasketVejnavn, a.gadeid);                                  //postnrVeje.put(vasketVejnavn, a.gadeid);
345                                                                    
346                                  gadeident = a.gadeid;                                  gadeident = intHelper.getInstance( a.gadeid );
347                                                                    
348                                  Set<String> aliaser = findVejAliaser(a.vejnavn);                                  Set<String> aliaser = findVejAliaser(a.vejnavn);
349                                  for(String alias : aliaser) {                                  for(String alias : aliaser) {
# Line 301  public class AddressSearch { Line 351  public class AddressSearch {
351                                          vasketAlias = aliasHelper.getInstance(vasketAlias);                                          vasketAlias = aliasHelper.getInstance(vasketAlias);
352                                                                                    
353                                          postnrVeje.put(vasketAlias, gadeident);                                          postnrVeje.put(vasketAlias, gadeident);
354                                  }                                                                }
355                                    
356                          }                          }
357                                                    
358                          Map<String, Address> gade =  searchGadeidentAdresser.get(gadeident);                          
359                            Map<Short, Map<String,Address>> gade =  searchGadeidentAdresser.get(gadeident);
360                          if (gade == null) {                          if (gade == null) {
361                                  gade = new HashMap<String, Address>();                                  gade = new TreeMap<Short, Map<String,Address>>();
362                                  searchGadeidentAdresser.put(gadeident, gade);                                  searchGadeidentAdresser.put(gadeident, gade);
363                          }                          }
364                          String husnrSearch = "" + a.husnr + a.husnrbogstav;                          
365                          husnrSearch = husnrHelper.getInstance(husnrSearch);                          Map<String,Address> litraList = gade.get(a.husnr);
366                          gade.put(husnrSearch, a);                                                if (litraList == null) {
367                                    litraList = new HashMap<String,Address>();
368                                    gade.put(a.husnr, litraList);
369                            }
370                            
371                            litraList.put(a.husnrbogstav, a);                      
372                  }                  }
373                    
374                  ////////////////////////////////////////////////////////////////////////////////////////                  ////////////////////////////////////////////////////////////////////////////////////////
375                  long start2 = System.currentTimeMillis();                  long start2 = System.currentTimeMillis();
376                  System.out.println("Build, stage1 elapsed: " + (start2-start1) );                  System.out.println("Build, stage1 elapsed: " + (start2-start1) );
# Line 456  public class AddressSearch { Line 513  public class AddressSearch {
513                                    
514                  ////////////////////////////////////////////////////////////////////////////////////                  ////////////////////////////////////////////////////////////////////////////////////
515                  long stop = System.currentTimeMillis();                  long stop = System.currentTimeMillis();
516                  System.out.println("Build, stage3 elapsed: " + (stop-start4) );                  System.out.println("Build, stage4 elapsed: " + (stop-start4) );
517                  System.out.println("Build -- Gathering statistics");                  System.out.println("Build -- Gathering statistics");
518                                                                    
519                  for (Address addr : alleAdresser) {                  for (Address addr : alleAdresser) {
# Line 521  public class AddressSearch { Line 578  public class AddressSearch {
578                                  return ".." + targetAddress.rute;                                  return ".." + targetAddress.rute;
579                          } else if (eb.afstand < 0.701) {                          } else if (eb.afstand < 0.701) {
580                                  return "..." + targetAddress.rute;                                  return "..." + targetAddress.rute;
581                          } else if (eb.afstand < 0.501) {                          } else if (eb.afstand < 1.001) {
582                                  return "...." + targetAddress.rute;                                  return "...." + targetAddress.rute;
583                          }                          }
584                          break;                                            break;                  
# Line 547  public class AddressSearch { Line 604  public class AddressSearch {
604                                  return "...." + targetAddress.rute;                                  return "...." + targetAddress.rute;
605                          }                          }
606                          break;                          break;
607                    default:
608                            System.out.println("Ukendt transport type: " + eb );
609                  }                                }              
610                  return null;                  return null;
611          }          }
# Line 611  public class AddressSearch { Line 670  public class AddressSearch {
670                  aliasSet.add(vejnavn.replace("gl", "gammel") );                  aliasSet.add(vejnavn.replace("gl", "gammel") );
671                  aliasSet.add(vejnavn.replace("gammel", "gl") );                  aliasSet.add(vejnavn.replace("gammel", "gl") );
672                                    
673                    aliasSet.add(vejnavn.replace("gl", "gamle") );
674                    aliasSet.add(vejnavn.replace("gamle", "gl") );
675                    
676                  aliasSet.add(vejnavn.replace("lille", "ll") );                  aliasSet.add(vejnavn.replace("lille", "ll") );
677                  aliasSet.add(vejnavn.replace("ll ", "lille") );                  aliasSet.add(vejnavn.replace("ll ", "lille") );
678                  aliasSet.add(vejnavn.replace("ll.", "lille") );                  aliasSet.add(vejnavn.replace("ll.", "lille") );
# Line 670  public class AddressSearch { Line 732  public class AddressSearch {
732                  aliasSet.add(vejnavn.replace("mylius", "myl") );                  aliasSet.add(vejnavn.replace("mylius", "myl") );
733                  aliasSet.add(vejnavn.replace("myl", "mylius") );                  aliasSet.add(vejnavn.replace("myl", "mylius") );
734                                    
735                    aliasSet.add(vejnavn.replace("ludvig", "ludv") );
736                    aliasSet.add(vejnavn.replace("ludv", "ludvig") );
737                    
738                                    
739                  // alternative stavninger                  // alternative stavninger
740                  aliasSet.add(vejnavn.replace("peder", "peter") );                  aliasSet.add(vejnavn.replace("peder", "peter") );
# Line 740  public class AddressSearch { Line 805  public class AddressSearch {
805                                    
806                  // Opbyg æøå varianter over alle fundne aliaser                  // Opbyg æøå varianter over alle fundne aliaser
807                                    
808                  @SuppressWarnings("unchecked")                  HashSet<String> variants = new HashSet<String>( aliasSet );
                 HashSet<String> variants = (HashSet<String>) aliasSet.clone();  
809                                    
810                  for (String vVejnavn : variants) {                                                        for (String vVejnavn : variants) {                                      
811                          // danske tegn 1                          // danske tegn 1
# Line 761  public class AddressSearch { Line 825  public class AddressSearch {
825                          aliasSet.add( vVejnavn.replace("oe", "ø").replace("aa", "å") );                          aliasSet.add( vVejnavn.replace("oe", "ø").replace("aa", "å") );
826                                                    
827                          //danske tegn 3                          //danske tegn 3
828                          aliasSet.add( vejnavn.replace("æ", "ae").replace("ø", "oe").replace("å", "aa") );                          aliasSet.add( vVejnavn.replace("æ", "ae").replace("ø", "oe").replace("å", "aa") );
829                          aliasSet.add( vejnavn.replace("ae", "æ").replace("oe", "ø").replace("aa", "å") );                          aliasSet.add( vVejnavn.replace("ae", "æ").replace("oe", "ø").replace("aa", "å") );
830                                                    
831                                                    
832                          //udenlandsketegn                          //udenlandsketegn
833                          aliasSet.add(vejnavn.replace("u", "ü") );                          aliasSet.add( vVejnavn.replace("u", "ü") );
834                          aliasSet.add(vejnavn.replace("ü", "u") );                          aliasSet.add( vVejnavn.replace("ü", "u") );
835                                                    
836                          aliasSet.add(vejnavn.replace("ä", "æ") );                          aliasSet.add( vVejnavn.replace("ä", "æ") );
837                          aliasSet.add(vejnavn.replace("æ", "ä") );                          aliasSet.add( vVejnavn.replace("æ", "ä") );
838                                                    
839                          aliasSet.add(vejnavn.replace("ö", "ø") );                          aliasSet.add( vVejnavn.replace("ö", "ø") );
840                          aliasSet.add(vejnavn.replace("ø", "ö") );                          aliasSet.add( vVejnavn.replace("ø", "ö") );
841                  }                  }
842                                    
843                  return aliasSet;                  return aliasSet;
# Line 793  public class AddressSearch { Line 857  public class AddressSearch {
857                    
858          public Set<String> getHusnumre(int gadeid) {          public Set<String> getHusnumre(int gadeid) {
859                                                                    
860                  Map<String, Address> gade = searchGadeidentAdresser.get(gadeid);                  Map<Short,Map<String, Address>> gade = searchGadeidentAdresser.get(gadeid);
861                                    
862                  Set<String> set = new TreeSet<String>( new NaturalOrderComparator<String>() );                  Set<String> set = new TreeSet<String>( new NaturalOrderComparator<String>() );
863                  set.addAll( gade.keySet() );                  for(Map<String,Address> litraList : gade.values()) {
864                            for (Address a: litraList.values()) {
865                                    set.add( a.husnr + a.husnrbogstav );                            
866                            }
867                    }
868                                    
869                  return set;                  return set;
870          }          }
871                    
872          public Address getAdresse(int gadeid, String husnr) {          public Address getAdresse(int gadeid, String husnrStr) {
873                                    short husnr = Short.parseShort( husnrStr.replaceAll("[^\\d]","") );
874                  Map<String, Address> gade = searchGadeidentAdresser.get(gadeid);                  String litra =  husnrStr.replaceAll("\\d", "");        
875                  return gade.get(husnr);                  
876                    Map<Short,Map<String, Address>> gade = searchGadeidentAdresser.get(gadeid);
877                    Map<String, Address> litraList = gade.get(husnr);
878                    return litraList.get(litra);
879                                    
880          }          }
881                                    

Legend:
Removed from v.2759  
changed lines
  Added in v.2803

  ViewVC Help
Powered by ViewVC 1.1.20