Skip to content

Commit 45f22cf

Browse files
authored
Merge pull request #894 from lonvia/port-to-javalin
Replace Spark web framework with Javalin Spark hasn't been updated for a while and it is keeping us at an old version of jetty. This replaces Spark with Javalin, which seems to be the most light-weight of alternatives and is currently still actively maintained. I did consider using jetty directly but that requires quite a bit of manual setup code, which Javalin wraps quite nicely. The PR contains some heavy refactoring of request handling to prepare for the switch. Request classes are now organised in a inheritance hierarchy, so that shared parameters are only implemented once. The request factories follow the same hierarchy, again meaning that shared parameter can share the parsing code. The handlers for the search endpoints were also essentially duplicates of each other. They have been merged into a generic handler that handles a certain request type. The tests for the requests factories have been replaced with API integration tests. This made it easier to check that the API behaviour is the same with the new framework. It also means that we can finally get rid of mockito. There are some minor behaviour changes with Javalin: * Cors handling is now done by Jetty and following the spec more strictly. * We are using Javalin's parameter check mechanism, which comes with some error reporting that is not the most user friendly and uses a different format than what Photon usually reports. As it is unlikely that there are many users out there that parse 400 responses, we'll leave those as is for now. * Boolean parameters now consistently take 'yes', '1' and 'true' for truthy values and everything else as falsy. * NaN values for doubles will now consistently throw an error.
2 parents 0ae3bf9 + be03017 commit 45f22cf

File tree

61 files changed

+1430
-1907
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+1430
-1907
lines changed

app/es_embedded/src/main/java/de/komoot/photon/Server.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package de.komoot.photon;
22

3-
import de.komoot.photon.searcher.StructuredSearchHandler;
4-
import de.komoot.photon.searcher.ReverseHandler;
5-
import de.komoot.photon.searcher.SearchHandler;
6-
import de.komoot.photon.ConfigExtraTags;
73
import de.komoot.photon.elasticsearch.*;
4+
import de.komoot.photon.query.ReverseRequest;
5+
import de.komoot.photon.query.SimpleSearchRequest;
6+
import de.komoot.photon.query.StructuredSearchRequest;
7+
import de.komoot.photon.searcher.SearchHandler;
88
import org.elasticsearch.action.get.GetResponse;
99
import org.elasticsearch.client.Client;
1010
import org.elasticsearch.client.transport.TransportClient;
@@ -290,15 +290,15 @@ public Updater createUpdater(DatabaseProperties dbProperties) {
290290
return new de.komoot.photon.elasticsearch.Updater(esClient, dbProperties);
291291
}
292292

293-
public SearchHandler createSearchHandler(String[] languages, int queryTimeoutSec) {
293+
public SearchHandler<SimpleSearchRequest> createSearchHandler(String[] languages, int queryTimeoutSec) {
294294
return new ElasticsearchSearchHandler(esClient, languages, queryTimeoutSec);
295295
}
296296

297-
public StructuredSearchHandler createStructuredSearchHandler(String[] languages, int queryTimeoutSec) {
297+
public SearchHandler<StructuredSearchRequest> createStructuredSearchHandler(String[] languages, int queryTimeoutSec) {
298298
throw new UnsupportedOperationException("Structured queries are not supported for elasticsearch-based Photon. Consider to use OpenSearch.");
299299
}
300300

301-
public ReverseHandler createReverseHandler(int queryTimeoutSec) {
301+
public SearchHandler<ReverseRequest> createReverseHandler(int queryTimeoutSec) {
302302
return new ElasticsearchReverseHandler(esClient, queryTimeoutSec);
303303
}
304304
}

app/es_embedded/src/main/java/de/komoot/photon/elasticsearch/ElasticsearchReverseHandler.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package de.komoot.photon.elasticsearch;
22

3+
import de.komoot.photon.searcher.SearchHandler;
34
import org.locationtech.jts.geom.Point;
45
import de.komoot.photon.query.ReverseRequest;
56
import de.komoot.photon.searcher.PhotonResult;
6-
import de.komoot.photon.searcher.ReverseHandler;
77
import org.elasticsearch.action.search.SearchRequestBuilder;
88
import org.elasticsearch.action.search.SearchResponse;
99
import org.elasticsearch.action.search.SearchType;
@@ -21,7 +21,7 @@
2121
/**
2222
* Execute a reverse lookup on a Elasticsearch database.
2323
*/
24-
public class ElasticsearchReverseHandler implements ReverseHandler {
24+
public class ElasticsearchReverseHandler implements SearchHandler<ReverseRequest> {
2525
private Client client;
2626
private TimeValue queryTimeout;
2727

@@ -31,7 +31,7 @@ public ElasticsearchReverseHandler(Client client, int queryTimeoutSec) {
3131
}
3232

3333
@Override
34-
public List<PhotonResult> reverse(ReverseRequest photonRequest) {
34+
public List<PhotonResult> search(ReverseRequest photonRequest) {
3535
ReverseQueryBuilder queryBuilder = buildQuery(photonRequest);
3636
SearchResponse results = search(queryBuilder.buildQuery(), photonRequest.getLimit(), photonRequest.getLocation(),
3737
photonRequest.getLocationDistanceSort());

app/es_embedded/src/main/java/de/komoot/photon/elasticsearch/ElasticsearchSearchHandler.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package de.komoot.photon.elasticsearch;
22

3-
import de.komoot.photon.query.PhotonRequest;
3+
import de.komoot.photon.query.SimpleSearchRequest;
44
import de.komoot.photon.searcher.PhotonResult;
55
import de.komoot.photon.searcher.SearchHandler;
66
import org.elasticsearch.action.search.SearchResponse;
@@ -16,7 +16,7 @@
1616
/**
1717
* Execute a forward lookup on a Elasticsearch database.
1818
*/
19-
public class ElasticsearchSearchHandler implements SearchHandler {
19+
public class ElasticsearchSearchHandler implements SearchHandler<SimpleSearchRequest> {
2020
private final Client client;
2121
private final String[] supportedLanguages;
2222
private boolean lastLenient = false;
@@ -29,7 +29,7 @@ public ElasticsearchSearchHandler(Client client, String[] languages, int queryTi
2929
}
3030

3131
@Override
32-
public List<PhotonResult> search(PhotonRequest photonRequest) {
32+
public List<PhotonResult> search(SimpleSearchRequest photonRequest) {
3333
PhotonQueryBuilder queryBuilder = buildQuery(photonRequest, false);
3434

3535
// for the case of deduplication we need a bit more results, #300
@@ -50,11 +50,11 @@ public List<PhotonResult> search(PhotonRequest photonRequest) {
5050
return ret;
5151
}
5252

53-
public String dumpQuery(PhotonRequest photonRequest) {
53+
public String dumpQuery(SimpleSearchRequest photonRequest) {
5454
return buildQuery(photonRequest, lastLenient).buildQuery().toString();
5555
}
5656

57-
public PhotonQueryBuilder buildQuery(PhotonRequest photonRequest, boolean lenient) {
57+
public PhotonQueryBuilder buildQuery(SimpleSearchRequest photonRequest, boolean lenient) {
5858
lastLenient = lenient;
5959
return PhotonQueryBuilder.
6060
builder(photonRequest.getQuery(), photonRequest.getLanguage(), supportedLanguages, lenient).

app/es_embedded/src/test/java/de/komoot/photon/elasticsearch/ElasticResultTest.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@
44
import de.komoot.photon.Importer;
55
import org.locationtech.jts.geom.Coordinate;
66
import org.locationtech.jts.geom.Point;
7-
import de.komoot.photon.query.PhotonRequest;
7+
import de.komoot.photon.query.SimpleSearchRequest;
88
import de.komoot.photon.searcher.PhotonResult;
9-
import de.komoot.photon.searcher.SearchHandler;
109
import org.junit.jupiter.api.AfterAll;
1110
import org.junit.jupiter.api.BeforeAll;
1211
import org.junit.jupiter.api.Test;
@@ -68,14 +67,16 @@ void setUp(@TempDir Path dataDirectory) throws Exception {
6867

6968
@AfterAll
7069
@Override
71-
public void tearDown() throws IOException {
72-
super.tearDown();
70+
public void tearDown() {
71+
shutdownES();
7372
}
7473

7574
private PhotonResult search(String query) {
76-
SearchHandler handler = getServer().createSearchHandler(new String[]{"en", "de", "it"}, 1);
75+
var handler = getServer().createSearchHandler(new String[]{"en", "de", "it"}, 1);
76+
final var request = new SimpleSearchRequest();
77+
request.setQuery(query);
7778

78-
return handler.search(new PhotonRequest(query, "default")).get(0);
79+
return handler.search(request).get(0);
7980
}
8081

8182

app/opensearch/src/main/java/de/komoot/photon/Server.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@
33
import com.fasterxml.jackson.core.Version;
44
import com.fasterxml.jackson.databind.module.SimpleModule;
55
import de.komoot.photon.opensearch.*;
6-
import de.komoot.photon.searcher.ReverseHandler;
6+
import de.komoot.photon.query.ReverseRequest;
7+
import de.komoot.photon.query.SimpleSearchRequest;
8+
import de.komoot.photon.query.StructuredSearchRequest;
79
import de.komoot.photon.searcher.SearchHandler;
8-
import de.komoot.photon.searcher.StructuredSearchHandler;
910
import org.apache.hc.core5.http.HttpHost;
1011
import org.codelibs.opensearch.runner.OpenSearchRunner;
1112
import org.opensearch.client.json.jackson.JacksonJsonpMapper;
@@ -184,15 +185,15 @@ public Updater createUpdater(DatabaseProperties dbProperties) {
184185
return new de.komoot.photon.opensearch.Updater(client);
185186
}
186187

187-
public SearchHandler createSearchHandler(String[] languages, int queryTimeoutSec) {
188+
public SearchHandler<SimpleSearchRequest> createSearchHandler(String[] languages, int queryTimeoutSec) {
188189
return new OpenSearchSearchHandler(client, languages, queryTimeoutSec);
189190
}
190191

191-
public StructuredSearchHandler createStructuredSearchHandler(String[] languages, int queryTimeoutSec) {
192+
public SearchHandler<StructuredSearchRequest> createStructuredSearchHandler(String[] languages, int queryTimeoutSec) {
192193
return new OpenSearchStructuredSearchHandler(client, languages, queryTimeoutSec);
193194
}
194195

195-
public ReverseHandler createReverseHandler(int queryTimeoutSec) {
196+
public SearchHandler<ReverseRequest> createReverseHandler(int queryTimeoutSec) {
196197
return new OpenSearchReverseHandler(client, queryTimeoutSec);
197198
}
198199

app/opensearch/src/main/java/de/komoot/photon/opensearch/OpenSearchReverseHandler.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import de.komoot.photon.query.ReverseRequest;
44
import de.komoot.photon.searcher.PhotonResult;
5-
import de.komoot.photon.searcher.ReverseHandler;
5+
import de.komoot.photon.searcher.SearchHandler;
66
import org.locationtech.jts.geom.Point;
77
import org.opensearch.client.opensearch.OpenSearchClient;
88
import org.opensearch.client.opensearch._types.SearchType;
@@ -14,7 +14,7 @@
1414
import java.util.ArrayList;
1515
import java.util.List;
1616

17-
public class OpenSearchReverseHandler implements ReverseHandler {
17+
public class OpenSearchReverseHandler implements SearchHandler<ReverseRequest> {
1818
private final OpenSearchClient client;
1919
private final String queryTimeout;
2020

@@ -24,7 +24,7 @@ public OpenSearchReverseHandler(OpenSearchClient client, int queryTimeoutSec) {
2424
}
2525

2626
@Override
27-
public List<PhotonResult> reverse(ReverseRequest request) {
27+
public List<PhotonResult> search(ReverseRequest request) {
2828
final var queryBuilder = new ReverseQueryBuilder(request.getLocation(), request.getRadius(), request.getQueryStringFilter(), request.getLayerFilters())
2929
.withOsmTagFilters(request.getOsmTagFilters());
3030

app/opensearch/src/main/java/de/komoot/photon/opensearch/OpenSearchSearchHandler.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package de.komoot.photon.opensearch;
22

3-
import de.komoot.photon.query.PhotonRequest;
3+
import de.komoot.photon.query.SimpleSearchRequest;
44
import de.komoot.photon.searcher.PhotonResult;
55
import de.komoot.photon.searcher.SearchHandler;
66
import org.opensearch.client.opensearch.OpenSearchClient;
@@ -12,7 +12,7 @@
1212
import java.util.ArrayList;
1313
import java.util.List;
1414

15-
public class OpenSearchSearchHandler implements SearchHandler {
15+
public class OpenSearchSearchHandler implements SearchHandler<SimpleSearchRequest> {
1616
private final OpenSearchClient client;
1717
private final String[] supportedLanguages;
1818
private final String queryTimeout;
@@ -24,7 +24,7 @@ public OpenSearchSearchHandler(OpenSearchClient client, String[] supportedLangua
2424
}
2525

2626
@Override
27-
public List<PhotonResult> search(PhotonRequest request) {
27+
public List<PhotonResult> search(SimpleSearchRequest request) {
2828
final int limit = request.getLimit();
2929
final int extLimit = limit > 1 ? (int) Math.round(limit * 1.5) : 1;
3030

@@ -43,11 +43,11 @@ public List<PhotonResult> search(PhotonRequest request) {
4343
}
4444

4545
@Override
46-
public String dumpQuery(PhotonRequest photonRequest) {
47-
return null;
46+
public String dumpQuery(SimpleSearchRequest simpleSearchRequest) {
47+
return "{}";
4848
}
4949

50-
private SearchQueryBuilder buildQuery(PhotonRequest request, boolean lenient) {
50+
private SearchQueryBuilder buildQuery(SimpleSearchRequest request, boolean lenient) {
5151
return new SearchQueryBuilder(request.getQuery(), request.getLanguage(), supportedLanguages, lenient).
5252
withOsmTagFilters(request.getOsmTagFilters()).
5353
withLayerFilters(request.getLayerFilters()).

app/opensearch/src/main/java/de/komoot/photon/opensearch/OpenSearchStructuredSearchHandler.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package de.komoot.photon.opensearch;
22

3-
import de.komoot.photon.searcher.StructuredSearchHandler;
43
import de.komoot.photon.searcher.PhotonResult;
5-
import de.komoot.photon.query.StructuredPhotonRequest;
4+
import de.komoot.photon.query.StructuredSearchRequest;
5+
import de.komoot.photon.searcher.SearchHandler;
66
import org.opensearch.client.opensearch.OpenSearchClient;
77
import org.opensearch.client.opensearch._types.SearchType;
88
import org.opensearch.client.opensearch._types.query_dsl.Query;
@@ -15,7 +15,7 @@
1515
/**
1616
* Execute a structured forward lookup on an Elasticsearch database.
1717
*/
18-
public class OpenSearchStructuredSearchHandler implements StructuredSearchHandler {
18+
public class OpenSearchStructuredSearchHandler implements SearchHandler<StructuredSearchRequest> {
1919
private final OpenSearchClient client;
2020
private final String[] supportedLanguages;
2121
private final String queryTimeout;
@@ -27,7 +27,7 @@ public OpenSearchStructuredSearchHandler(OpenSearchClient client, String[] langu
2727
}
2828

2929
@Override
30-
public List<PhotonResult> search(StructuredPhotonRequest photonRequest) {
30+
public List<PhotonResult> search(StructuredSearchRequest photonRequest) {
3131
var queryBuilder = buildQuery(photonRequest, false);
3232

3333
// for the case of deduplication we need a bit more results, #300
@@ -58,7 +58,12 @@ public List<PhotonResult> search(StructuredPhotonRequest photonRequest) {
5858
return ret;
5959
}
6060

61-
public SearchQueryBuilder buildQuery(StructuredPhotonRequest photonRequest, boolean lenient) {
61+
@Override
62+
public String dumpQuery(StructuredSearchRequest searchRequest) {
63+
return "{}";
64+
}
65+
66+
public SearchQueryBuilder buildQuery(StructuredSearchRequest photonRequest, boolean lenient) {
6267
return new SearchQueryBuilder(photonRequest, photonRequest.getLanguage(), supportedLanguages, lenient).
6368
withOsmTagFilters(photonRequest.getOsmTagFilters()).
6469
withLayerFilters(photonRequest.getLayerFilters()).

app/opensearch/src/main/java/de/komoot/photon/opensearch/SearchQueryBuilder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package de.komoot.photon.opensearch;
22

33
import de.komoot.photon.searcher.TagFilter;
4-
import de.komoot.photon.query.StructuredPhotonRequest;
4+
import de.komoot.photon.query.StructuredSearchRequest;
55
import de.komoot.photon.Constants;
66
import org.locationtech.jts.geom.Envelope;
77
import org.locationtech.jts.geom.Point;
@@ -142,7 +142,7 @@ public SearchQueryBuilder(String query, String language, String[] languages, boo
142142
.field(String.format("name.%s.raw", language))));
143143
}
144144

145-
public SearchQueryBuilder(StructuredPhotonRequest request, String language, String[] languages, boolean lenient)
145+
public SearchQueryBuilder(StructuredSearchRequest request, String language, String[] languages, boolean lenient)
146146
{
147147
var hasSubStateField = request.hasCounty() || request.hasCityOrPostCode() || request.hasDistrict() || request.hasStreet();
148148
var query4QueryBuilder = new AddressQueryBuilder(lenient, language, languages)

0 commit comments

Comments
 (0)