2
2
3
3
import com .beust .jcommander .JCommander ;
4
4
import com .beust .jcommander .ParameterException ;
5
- import de .komoot .photon .nominatim .NominatimConnector ;
5
+ import de .komoot .photon .nominatim .ImportThread ;
6
+ import de .komoot .photon .nominatim .NominatimImporter ;
6
7
import de .komoot .photon .nominatim .NominatimUpdater ;
7
8
import de .komoot .photon .searcher .ReverseHandler ;
8
9
import de .komoot .photon .searcher .SearchHandler ;
14
15
15
16
import java .io .FileNotFoundException ;
16
17
import java .io .IOException ;
17
- import java .util .Date ;
18
+ import java .util .*;
19
+ import java .util .concurrent .ConcurrentLinkedQueue ;
18
20
19
21
import static spark .Spark .*;
20
22
@@ -107,9 +109,8 @@ private static void startJsonDump(CommandLineArgs args) {
107
109
try {
108
110
final String filename = args .getJsonDump ();
109
111
final JsonDumper jsonDumper = new JsonDumper (filename , args .getLanguages (), args .getExtraTags ());
110
- NominatimConnector nominatimConnector = new NominatimConnector (args .getHost (), args .getPort (), args .getDatabase (), args .getUser (), args .getPassword ());
111
- nominatimConnector .setImporter (jsonDumper );
112
- nominatimConnector .readEntireDatabase (args .getCountryCodes ());
112
+
113
+ importFromDatabase (args , jsonDumper );
113
114
LOGGER .info ("Json dump was created: {}" , filename );
114
115
} catch (FileNotFoundException e ) {
115
116
throw new UsageException ("Cannot create dump: " + e .getMessage ());
@@ -121,22 +122,95 @@ private static void startJsonDump(CommandLineArgs args) {
121
122
* Read all data from a Nominatim database and import it into a Photon database.
122
123
*/
123
124
private static void startNominatimImport (CommandLineArgs args , Server esServer ) {
124
- DatabaseProperties dbProperties ;
125
- NominatimConnector nominatimConnector = new NominatimConnector (args .getHost (), args .getPort (), args .getDatabase (), args .getUser (), args .getPassword ());
126
- Date importDate = nominatimConnector .getLastImportDate ();
125
+ final var languages = initDatabase (args , esServer );
126
+
127
+ LOGGER .info ("Starting import from nominatim to photon with languages: {}" , String .join ("," , languages ));
128
+ importFromDatabase (args , esServer .createImporter (languages , args .getExtraTags ()));
129
+
130
+ LOGGER .info ("Imported data from nominatim to photon with languages: {}" , String .join ("," , languages ));
131
+ }
132
+
133
+ private static String [] initDatabase (CommandLineArgs args , Server esServer ) {
134
+ final var nominatimConnector = new NominatimImporter (args .getHost (), args .getPort (), args .getDatabase (), args .getUser (), args .getPassword ());
135
+ final Date importDate = nominatimConnector .getLastImportDate ();
136
+
127
137
try {
128
- dbProperties = esServer .recreateIndex (args .getLanguages (), importDate , args .getSupportStructuredQueries ()); // clear out previous data
138
+ // Clear out previous data.
139
+ var dbProperties = esServer .recreateIndex (args .getLanguages (), importDate , args .getSupportStructuredQueries ());
140
+ return dbProperties .getLanguages ();
129
141
} catch (IOException e ) {
130
142
throw new UsageException ("Cannot setup index, elastic search config files not readable" );
131
143
}
144
+ }
145
+
146
+ private static void importFromDatabase (CommandLineArgs args , Importer importer ) {
147
+ final var connector = new NominatimImporter (args .getHost (), args .getPort (), args .getDatabase (), args .getUser (), args .getPassword ());
148
+ connector .prepareDatabase ();
149
+ connector .loadCountryNames ();
132
150
133
- LOGGER .info ("Starting import from nominatim to photon with languages: {}" , String .join ("," , dbProperties .getLanguages ()));
134
- nominatimConnector .setImporter (esServer .createImporter (dbProperties .getLanguages (), args .getExtraTags ()));
135
- nominatimConnector .readEntireDatabase (args .getCountryCodes ());
151
+ String [] countries = args .getCountryCodes ();
152
+
153
+ if (countries == null || countries .length == 0 ) {
154
+ countries = connector .getCountriesFromDatabase ();
155
+ } else {
156
+ countries = Arrays .stream (countries ).map (String ::trim ).filter (s -> !s .isBlank ()).toArray (String []::new );
157
+ }
158
+
159
+ final int numThreads = args .getThreads ();
160
+ ImportThread importThread = new ImportThread (importer );
161
+
162
+ try {
163
+
164
+ if (numThreads == 1 ) {
165
+ for (var country : countries ) {
166
+ connector .readCountry (country , importThread );
167
+ }
168
+ } else {
169
+ final Queue <String > todolist = new ConcurrentLinkedQueue <>(List .of (countries ));
170
+
171
+ final List <Thread > readerThreads = new ArrayList <>(numThreads );
172
+
173
+ for (int i = 0 ; i < numThreads ; ++i ) {
174
+ final NominatimImporter threadConnector ;
175
+ if (i > 0 ) {
176
+ threadConnector = new NominatimImporter (args .getHost (), args .getPort (), args .getDatabase (), args .getUser (), args .getPassword ());
177
+ threadConnector .loadCountryNames ();
178
+ } else {
179
+ threadConnector = connector ;
180
+ }
181
+ final int threadno = i ;
182
+ Runnable runner = () -> {
183
+ String nextCc = todolist .poll ();
184
+ while (nextCc != null ) {
185
+ LOGGER .info ("Thread {}: reading country '{}'" , threadno , nextCc );
186
+ threadConnector .readCountry (nextCc , importThread );
187
+ nextCc = todolist .poll ();
188
+ }
189
+ };
190
+ Thread thread = new Thread (runner );
191
+ thread .start ();
192
+ readerThreads .add (thread );
193
+ }
194
+ readerThreads .forEach (t -> {
195
+ while (true ) {
196
+ try {
197
+ t .join ();
198
+ break ;
199
+ } catch (InterruptedException e ) {
200
+ LOGGER .warn ("Thread interrupted:" , e );
201
+ // Restore interrupted state.
202
+ Thread .currentThread ().interrupt ();
203
+ }
204
+ }
205
+ });
206
+ }
207
+ } finally {
208
+ importThread .finish ();
209
+ }
136
210
137
- LOGGER .info ("Imported data from nominatim to photon with languages: {}" , String .join ("," , dbProperties .getLanguages ()));
138
211
}
139
212
213
+
140
214
private static void startNominatimUpdateInit (CommandLineArgs args ) {
141
215
NominatimUpdater nominatimUpdater = new NominatimUpdater (args .getHost (), args .getPort (), args .getDatabase (), args .getUser (), args .getPassword ());
142
216
nominatimUpdater .initUpdates (args .getNominatimUpdateInit ());
0 commit comments