/[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 2776 by torben, Thu Nov 19 15:30:36 2015 UTC revision 2788 by torben, Tue Dec 1 11:08:56 2015 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                  for (Address a : alleAdresser) {                  for (Address a : alleAdresser) {
328                          idAddressMap.put(a.id, a);                          idAddressMap.put(a.id, a);
329                                                    
330                          Map<String,Integer> postnrVeje = searchPostnrVejnavnGadeid.get(a.postnr);                                        Short postnr = shortHelper.getInstance(a.postnr);
331                            
332                            Map<String,Integer> postnrVeje = searchPostnrVejnavnGadeid.get(postnr);        
333                                                    
334                          if (postnrVeje == null) {                          if (postnrVeje == null) {
335                                  postnrVeje = new ConcurrentHashMap<String,Integer>();                                  postnrVeje = new ConcurrentHashMap<String,Integer>();
336                                  searchPostnrVejnavnGadeid.put(a.postnr, postnrVeje);                                  searchPostnrVejnavnGadeid.put(postnr, postnrVeje);
337                          }                          }
338                                                                    
339                                                    
# Line 293  public class AddressSearch { Line 342  public class AddressSearch {
342                          if (gadeident == null) {                                                          if (gadeident == null) {                                
343                                  //postnrVeje.put(vasketVejnavn, a.gadeid);                                  //postnrVeje.put(vasketVejnavn, a.gadeid);
344                                                                    
345                                  gadeident = a.gadeid;                                  gadeident = intHelper.getInstance( a.gadeid );
346                                                                    
347                                  Set<String> aliaser = findVejAliaser(a.vejnavn);                                  Set<String> aliaser = findVejAliaser(a.vejnavn);
348                                  for(String alias : aliaser) {                                  for(String alias : aliaser) {
# Line 304  public class AddressSearch { Line 353  public class AddressSearch {
353                                  }                                                                }                              
354                          }                          }
355                                                    
356                          Map<String, Address> gade =  searchGadeidentAdresser.get(gadeident);                          Map<Short, Map<String,Address>> gade =  searchGadeidentAdresser.get(gadeident);
357                          if (gade == null) {                          if (gade == null) {
358                                  gade = new HashMap<String, Address>();                                  gade = new TreeMap<Short, Map<String,Address>>();
359                                  searchGadeidentAdresser.put(gadeident, gade);                                  searchGadeidentAdresser.put(gadeident, gade);
360                          }                          }
361                          String husnrSearch = "" + a.husnr + a.husnrbogstav;                          
362                          husnrSearch = husnrHelper.getInstance(husnrSearch);                          Map<String,Address> litraList = gade.get(a.husnr);
363                          gade.put(husnrSearch, a);                                                if (litraList == null) {
364                                    litraList = new HashMap<String,Address>();
365                                    gade.put(a.husnr, litraList);
366                            }
367                            
368                            litraList.put(a.husnrbogstav, a);                      
369                  }                  }
370                                    
371                  ////////////////////////////////////////////////////////////////////////////////////////                  ////////////////////////////////////////////////////////////////////////////////////////
# Line 675  public class AddressSearch { Line 729  public class AddressSearch {
729                  aliasSet.add(vejnavn.replace("mylius", "myl") );                  aliasSet.add(vejnavn.replace("mylius", "myl") );
730                  aliasSet.add(vejnavn.replace("myl", "mylius") );                  aliasSet.add(vejnavn.replace("myl", "mylius") );
731                                    
732                    aliasSet.add(vejnavn.replace("ludvig", "ludv") );
733                    aliasSet.add(vejnavn.replace("ludv", "ludvig") );
734                    
735                                    
736                  // alternative stavninger                  // alternative stavninger
737                  aliasSet.add(vejnavn.replace("peder", "peter") );                  aliasSet.add(vejnavn.replace("peder", "peter") );
# Line 798  public class AddressSearch { Line 855  public class AddressSearch {
855                    
856          public Set<String> getHusnumre(int gadeid) {          public Set<String> getHusnumre(int gadeid) {
857                                                                    
858                  Map<String, Address> gade = searchGadeidentAdresser.get(gadeid);                  Map<Short,Map<String, Address>> gade = searchGadeidentAdresser.get(gadeid);
859                                    
860                  Set<String> set = new TreeSet<String>( new NaturalOrderComparator<String>() );                  Set<String> set = new TreeSet<String>( new NaturalOrderComparator<String>() );
861                  set.addAll( gade.keySet() );                  for(Map<String,Address> litraList : gade.values()) {
862                            for (Address a: litraList.values()) {
863                                    set.add( a.husnr + a.husnrbogstav );                            
864                            }
865                    }
866                                    
867                  return set;                  return set;
868          }          }
869                    
870          public Address getAdresse(int gadeid, String husnr) {          public Address getAdresse(int gadeid, String husnrStr) {
871                                    short husnr = Short.parseShort( husnrStr.replaceAll("[^\\d]","") );
872                  Map<String, Address> gade = searchGadeidentAdresser.get(gadeid);                  String litra =  husnrStr.replaceAll("\\d", "");        
873                  return gade.get(husnr);                  
874                    Map<Short,Map<String, Address>> gade = searchGadeidentAdresser.get(gadeid);
875                    Map<String, Address> litraList = gade.get(husnr);
876                    return litraList.get(litra);
877                                    
878          }          }
879                                    

Legend:
Removed from v.2776  
changed lines
  Added in v.2788

  ViewVC Help
Powered by ViewVC 1.1.20