Geokodowanie
Ze względu na to, że wszystkie imprezy muszą być przypisane do miejscowości i lokalizacji, przed zapisaniem importowanych imprez należy je geokodować. Geokodowanie odbywa się za pośrednictwem SOLR'a.
W pierwszym korku geokodowania, na podstawie podanej nazwy miejscowości dopasowujemy miejscowość z naszej bazy. W kolejnym kroku próbujemy dopasować lokalizację.
Klasy
Podstawową klasą sterującą geokodowaniem jest klasa "GeocodingServiceImpl". Z tej klasy sterowanie jest przekazywane do klasy "LocalityGeocoderImpl" w celu geokodowania miejscowości oraz do klasy "VenueGeocoderImpl" w celu geokodowania lokalizacji. Do odpytywania SOLR'a używamy klas "SolrLocalityGeocoderImpl", "SolrVenueGeocoderImpl" a parametry geokodowania przesyłamy obiektami klasy "GeocoderAddress" a wynik zwracamy za pomocą obiektów klasy "GeocodingResult".
Wyszukiwanie lokalizacji w SOLR'ze
Do metody 'tryGeocodeBySorl' przekazywany jest obiekt 'GeocoderAddress'. W pierwszym kroku sprawdzamy czy taki adres był już wyszukiwany w tej sesji jeśli tak to zwracamy odnaleziony wcześniej wynik, jeśli nie to przekazujemy obiekt 'GeocoderAddress' do metody 'geocode' klasy 'SolrVenueGeocoderImpl'. W klasie tej przygotowujemy URL zapytania do SOLR'a, poprzez dodawanie argumentów zapytania do szablonu URL'a przechowywanego w ustawieniach systemowych. Ze znalezionych lokalizacji wybieramy tę która najlepiej pasuje do wyszukiwanej nazwy, określane jest to na podstawie dopasowania nazw metodą LCS oraz Olivier.
Geokodowanie Miejscowości
Na początku geokodowania miejscowości sprawdzamy czy do imprezy jest przypięta lokalizacja i jeśli jest to sprawdzamy czy posiada localityId. Jeżeli tak to pobieramy szczegóły lokalizacji z bazy. Jeśli jednak impreza nie posiada przypiętego obiektu LocalityData albo nie znamy localityId to próbujemy dopasować miejscowość po nazwie miejscowości (pole localityName obiektu Happening). Jak to się nie powiedzie to próbujemy kolejno dopasować po nazwie miejscowości przypiętej do lokalizacji po współrzędnych imprezy i po współrzędnych lokalizacji.
Geokodowanie lokalizacji
Po znalezieniu miejscowości próbujemy dopasować lokalizację na podstawię opisu lokalizacji (pole 'venueDescription'). Jak się to nie uda a impreza nie posiada danych lokalizacji próbujemy z opisu lokalizacji zbudować lokalizację i zapisujemy ją w bazie. Natomiast jeśli dane lokalizacji są wypełnione próbujemy dopasować lokalizację na podstawie podanej nazwy lokalizacji i w przypadku niepowodzenia zapisujemy lokalizację.
Geokodowanie lokalizacji na podstawie opisu
Do metody "geocodeByVenueDescription" przekazywany jest opis lokalizacji oraz obiekt reprezentujący miejscowość. Na podstawie tych argumentów tworzony jest obiekt klasy 'GeocoderAddress' w którym ustawiany jest podany opis lokalizacji i id miejscowości. Następnie próbujemy znaleźć lokalizację dla utworzonego adresy w SOLR'ze.
Pełne geokodowanie lokalizacji
Jeśli nie uda się znaleźć lokalizacji na podstawie opis a impreza nie posiada podpiętego obiektu lokalizacji, próbujemy zbudować taki obiekt na podstawie zawartości opisu lokalizacji. Metoda "tryToBuildVenue" próbuje z opisu wyodrębnić nazwę ulicy od nazwy lokalizacji, dopasować nazwę i ustawić te wartości w odpowiednich polach. Następnie podejmujemy próbę geokodowania lokalizacji (tej przypiętej do imprezy albo tej właśnie utworzonej). Na podstawie geokodanej lokalizacji jest budowany obiekt "GeocoderAddress" i próbujemy wyszukać lokalizację w SOLR'ze. Jeśli się to nie powiedzie to dana lokalizacja jest zapisywana w bazie danych.
Algorytm
Geokodowanie imprezy rozpoczyna się od uruchomienia metody "geocodeHappening" na obiekcie klasy "GeocodingServiceImpl". Na początku próbujemy dopasować miejscowość i przekazujemy imprezę do metody "geocode" obiektu klasy "LocalityGeocoderImpl"