/[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 2775 by torben, Thu Nov 19 15:29:36 2015 UTC revision 2801 by torben, Wed Jan 13 10:42:47 2016 UTC
# Line 17  import java.util.concurrent.ConcurrentHa Line 17  import java.util.concurrent.ConcurrentHa
17    
18  import org.apache.commons.lang3.StringUtils;  import org.apache.commons.lang3.StringUtils;
19    
 import com.jcabi.log.Logger;  
   
20  import dk.daoas.daoadresseservice.admin.ServiceConfig;  import dk.daoas.daoadresseservice.admin.ServiceConfig;
21  import dk.daoas.daoadresseservice.beans.Address;  import dk.daoas.daoadresseservice.beans.Address;
22  import dk.daoas.daoadresseservice.beans.AliasBean;  import dk.daoas.daoadresseservice.beans.AliasBean;
# Line 32  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 45  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 55  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 78  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 171  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 179  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 228  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 265  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 277  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 295  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 303  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 677  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 800  public class AddressSearch { Line 858  public class AddressSearch {
858                    
859          public Set<String> getHusnumre(int gadeid) {          public Set<String> getHusnumre(int gadeid) {
860                                                                    
861                  Map<String, Address> gade = searchGadeidentAdresser.get(gadeid);                  Map<Short,Map<String, Address>> gade = searchGadeidentAdresser.get(gadeid);
862                                    
863                  Set<String> set = new TreeSet<String>( new NaturalOrderComparator<String>() );                  Set<String> set = new TreeSet<String>( new NaturalOrderComparator<String>() );
864                  set.addAll( gade.keySet() );                  for(Map<String,Address> litraList : gade.values()) {
865                            for (Address a: litraList.values()) {
866                                    set.add( a.husnr + a.husnrbogstav );                            
867                            }
868                    }
869                                    
870                  return set;                  return set;
871          }          }
872                    
873          public Address getAdresse(int gadeid, String husnr) {          public Address getAdresse(int gadeid, String husnrStr) {
874                                    short husnr = Short.parseShort( husnrStr.replaceAll("[^\\d]","") );
875                  Map<String, Address> gade = searchGadeidentAdresser.get(gadeid);                  String litra =  husnrStr.replaceAll("\\d", "");        
876                  return gade.get(husnr);                  
877                    Map<Short,Map<String, Address>> gade = searchGadeidentAdresser.get(gadeid);
878                    Map<String, Address> litraList = gade.get(husnr);
879                    return litraList.get(litra);
880                                    
881          }          }
882                                    

Legend:
Removed from v.2775  
changed lines
  Added in v.2801

  ViewVC Help
Powered by ViewVC 1.1.20