Skip to content

Commit c0d462e

Browse files
authored
Merge pull request #920 from lonvia/fix-reading-extratags-from-dump
Use constants for fixed field names in json dump
2 parents df01eda + 4b19cfb commit c0d462e

File tree

6 files changed

+87
-59
lines changed

6 files changed

+87
-59
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package de.komoot.photon.json;
2+
3+
public class DumpFields {
4+
5+
private DumpFields() {}
6+
7+
public static final String HEADER_VERSION = "version";
8+
public static final String HEADER_GENERATOR = "generator";
9+
public static final String HEADER_DB_VERSION = "database_version";
10+
public static final String HEADER_DB_TIME = "data_timestamp";
11+
public static final String HEADER_FEATURES = "features";
12+
13+
public static final String DOCUMENT_TYPE = "type";
14+
public static final String DOCUMENT_CONTENT = "content";
15+
16+
public static final String PLACE_ID = "place_id";
17+
public static final String PLACE_OBJECT_TYPE = "object_type";
18+
public static final String PLACE_OBJECT_ID = "object_id";
19+
public static final String PLACE_CATEGORIES = "categories";
20+
public static final String PLACE_RANK_ADDRESS = "rank_address";
21+
public static final String PLACE_ADMIN_LEVEL = "admin_level";
22+
public static final String PLACE_IMPORTANCE = "importance";
23+
public static final String PLACE_PARENT_PLACE_ID = "parent_place_id";
24+
public static final String PLACE_NAMES = "name";
25+
public static final String PLACE_HOUSENUMBER = "housenumber";
26+
public static final String PLACE_ADDRESS = "address";
27+
public static final String PLACE_EXTRA_TAGS = "extra";
28+
public static final String PLACE_POSTCODE = "postcode";
29+
public static final String PLACE_COUNTRY_CODE = "country_code";
30+
public static final String PLACE_CENTROID = "centroid";
31+
public static final String PLACE_BBOX = "bbox";
32+
public static final String PLACE_GEOMETRY = "geometry";
33+
public static final String PLACE_ADDRESSLINES = "addresslines";
34+
}

src/main/java/de/komoot/photon/json/JsonDumper.java

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,11 @@ public void writeHeader(Map<String, NameMap> countryNames) throws IOException {
7676
writeStartDocument(NominatimDumpHeader.DOCUMENT_TYPE);
7777

7878
writer.writeStartObject();
79-
writer.writeStringField("version", NominatimDumpHeader.EXPECTED_VERSION);
80-
writer.writeStringField("generator", "photon");
81-
writer.writeStringField("database_version", Server.DATABASE_VERSION);
82-
writer.writeObjectField("data_timestamp", dbProperties.getImportDate());
83-
writer.writeObjectField("features", new NominatimDumpFileFeatures());
79+
writer.writeStringField(DumpFields.HEADER_VERSION, NominatimDumpHeader.EXPECTED_VERSION);
80+
writer.writeStringField(DumpFields.HEADER_GENERATOR, "photon");
81+
writer.writeStringField(DumpFields.HEADER_DB_VERSION, Server.DATABASE_VERSION);
82+
writer.writeObjectField(DumpFields.HEADER_DB_TIME, dbProperties.getImportDate());
83+
writer.writeObjectField(DumpFields.HEADER_FEATURES, new NominatimDumpFileFeatures());
8484
writer.writeEndObject();
8585
writeEndDocument();
8686

@@ -108,28 +108,28 @@ public void writeHeader(Map<String, NameMap> countryNames) throws IOException {
108108

109109
public void writeNominatimDocument(PhotonDoc doc) throws IOException {
110110
writer.writeStartObject();
111-
writer.writeNumberField("place_id", doc.getPlaceId());
112-
writer.writeStringField("object_type", doc.getOsmType());
113-
writer.writeNumberField("object_id", doc.getOsmId());
111+
writer.writeNumberField(DumpFields.PLACE_ID, doc.getPlaceId());
112+
writer.writeStringField(DumpFields.PLACE_OBJECT_TYPE, doc.getOsmType());
113+
writer.writeNumberField(DumpFields.PLACE_OBJECT_ID, doc.getOsmId());
114114

115-
writer.writeArrayFieldStart("categories");
115+
writer.writeArrayFieldStart(DumpFields.PLACE_CATEGORIES);
116116
writer.writeString(String.format("osm.%s.%s", doc.getTagKey(), doc.getTagValue()));
117117
writer.writeEndArray();
118118

119-
writer.writeNumberField("rank_address", doc.getRankAddress());
119+
writer.writeNumberField(DumpFields.PLACE_RANK_ADDRESS, doc.getRankAddress());
120120

121121
if (doc.getAdminLevel() != null) {
122-
writer.writeNumberField("admin_level", doc.getAdminLevel());
122+
writer.writeNumberField(DumpFields.PLACE_ADMIN_LEVEL, doc.getAdminLevel());
123123
}
124124

125-
writer.writeNumberField("importance", doc.getImportance());
125+
writer.writeNumberField(DumpFields.PLACE_IMPORTANCE, doc.getImportance());
126126

127127
if (doc.getRankAddress() > 28) {
128-
writer.writeNumberField("parent_place_id", doc.getParentPlaceId());
128+
writer.writeNumberField(DumpFields.PLACE_PARENT_PLACE_ID, doc.getParentPlaceId());
129129
}
130130

131131
if (!doc.getName().isEmpty()) {
132-
writer.writeObjectFieldStart("name");
132+
writer.writeObjectFieldStart(DumpFields.PLACE_NAMES);
133133
for (var entry : doc.getName().entrySet()) {
134134
writer.writeStringField(
135135
convertNameKey(entry.getKey(), "name"),
@@ -139,7 +139,7 @@ public void writeNominatimDocument(PhotonDoc doc) throws IOException {
139139
}
140140

141141
if (doc.getHouseNumber() != null) {
142-
writer.writeStringField("housenumber", doc.getHouseNumber());
142+
writer.writeStringField(DumpFields.PLACE_HOUSENUMBER, doc.getHouseNumber());
143143
}
144144

145145
final Map<String, String> addressNames = new HashMap<>();
@@ -177,28 +177,28 @@ public void writeNominatimDocument(PhotonDoc doc) throws IOException {
177177
}
178178

179179
if (!addressNames.isEmpty()) {
180-
writer.writeObjectField("address", addressNames);
180+
writer.writeObjectField(DumpFields.PLACE_ADDRESS, addressNames);
181181
}
182182

183-
dbProperties.configExtraTags().writeFilteredExtraTags(writer, "extra", doc.getExtratags());
183+
dbProperties.configExtraTags().writeFilteredExtraTags(writer, DumpFields.PLACE_EXTRA_TAGS, doc.getExtratags());
184184

185185
if (doc.getPostcode() != null) {
186-
writer.writeStringField("postcode", doc.getPostcode());
186+
writer.writeStringField(DumpFields.PLACE_POSTCODE, doc.getPostcode());
187187
}
188188

189189
if (doc.getCountryCode() != null) {
190-
writer.writeStringField("country_code", doc.getCountryCode().toLowerCase());
190+
writer.writeStringField(DumpFields.PLACE_COUNTRY_CODE, doc.getCountryCode().toLowerCase());
191191
}
192192

193193
final var coords = doc.getCentroid().getCoordinate();
194-
writer.writeArrayFieldStart("centroid");
194+
writer.writeArrayFieldStart(DumpFields.PLACE_CENTROID);
195195
writer.writeNumber(coords.x);
196196
writer.writeNumber(coords.y);
197197
writer.writeEndArray();
198198

199199
final var bbox = doc.getBbox();
200200
if (bbox != null) {
201-
writer.writeArrayFieldStart("bbox");
201+
writer.writeArrayFieldStart(DumpFields.PLACE_BBOX);
202202
writer.writeNumber(bbox.getMinX());
203203
writer.writeNumber(bbox.getMaxY());
204204
writer.writeNumber(bbox.getMaxX());
@@ -208,7 +208,7 @@ public void writeNominatimDocument(PhotonDoc doc) throws IOException {
208208

209209
final var geom = doc.getGeometry();
210210
if (geom != null) {
211-
writer.writeFieldName("geometry");
211+
writer.writeFieldName(DumpFields.PLACE_GEOMETRY);
212212
writer.writeRawValue(geojsonWriter.write(geom));
213213
}
214214

@@ -217,8 +217,8 @@ public void writeNominatimDocument(PhotonDoc doc) throws IOException {
217217

218218
private void writeStartDocument(String type) throws IOException {
219219
writer.writeStartObject();
220-
writer.writeStringField("type", type);
221-
writer.writeFieldName("content");
220+
writer.writeStringField(DumpFields.DOCUMENT_TYPE, type);
221+
writer.writeFieldName(DumpFields.DOCUMENT_CONTENT);
222222
}
223223

224224
private void writeEndDocument() throws IOException {

src/main/java/de/komoot/photon/json/JsonReader.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -192,15 +192,16 @@ private String readStartDocument() throws IOException {
192192
}
193193

194194
final String fieldName = parser.nextFieldName();
195-
if (!"type".equals(fieldName)) {
196-
LOGGER.error("Unexpected field '{}' instead of 'type' at {}", fieldName, parser.currentLocation());
195+
if (!DumpFields.DOCUMENT_TYPE.equals(fieldName)) {
196+
LOGGER.error("Unexpected field '{}' instead of '{}' at {}",
197+
fieldName, DumpFields.DOCUMENT_TYPE, parser.currentLocation());
197198
throw new UsageException("Invalid dump file.");
198199
}
199200

200201
final String documentType = parser.nextTextValue();
201202

202203
while (parser.nextToken() != JsonToken.END_OBJECT) {
203-
if ("content".equals(parser.currentName())) {
204+
if (DumpFields.DOCUMENT_CONTENT.equals(parser.currentName())) {
204205
parser.nextToken();
205206
return documentType;
206207
} else {
@@ -210,7 +211,8 @@ private String readStartDocument() throws IOException {
210211
}
211212
}
212213

213-
LOGGER.error("Missing 'content' field at {}", parser.currentLocation());
214+
LOGGER.error("Missing '{}' field at {}",
215+
DumpFields.DOCUMENT_CONTENT, parser.currentLocation());
214216
throw new UsageException("Invalid dump file.");
215217
}
216218

src/main/java/de/komoot/photon/json/NominatimDumpHeader.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public class NominatimDumpHeader {
2121
private NominatimDumpFileFeatures features;
2222
private Map<String, String> extraProperties = new HashMap<>();
2323

24+
@JsonProperty(DumpFields.HEADER_VERSION)
2425
void setVersion(String version) {
2526
if (!EXPECTED_VERSION.equals(version)) {
2627
LOGGER.error("Dump file header has version '{}'. Expect version '{}'",
@@ -29,16 +30,17 @@ void setVersion(String version) {
2930
}
3031
}
3132

33+
@JsonProperty(DumpFields.HEADER_GENERATOR)
3234
void setGenerator(String generator) {
3335
this.generator = generator;
3436
}
3537

36-
@JsonProperty("data_timestamp")
38+
@JsonProperty(DumpFields.HEADER_DB_TIME)
3739
void setDataTimestamp(Date timestamp) {
3840
dataTimestamp = timestamp;
3941
}
4042

41-
@JsonProperty("features")
43+
@JsonProperty(DumpFields.HEADER_FEATURES)
4244
void setFeatures(NominatimDumpFileFeatures features) { this.features = features; }
4345

4446
public Date getDataTimestamp() {

src/main/java/de/komoot/photon/json/NominatimPlaceDocument.java

Lines changed: 18 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -71,22 +71,22 @@ String getCountryCode() {
7171
return doc.getCountryCode();
7272
}
7373

74-
@JsonProperty("place_id")
74+
@JsonProperty(DumpFields.PLACE_ID)
7575
void setPlaceId(long placeId) {
7676
doc.placeId(placeId);
7777
}
7878

79-
@JsonProperty("object_type")
79+
@JsonProperty(DumpFields.PLACE_OBJECT_TYPE)
8080
void setOsmType(String osmType) {
8181
doc.osmType(osmType);
8282
}
8383

84-
@JsonProperty("object_id")
84+
@JsonProperty(DumpFields.PLACE_OBJECT_ID)
8585
void setOsmId(long osmId) {
8686
doc.osmId(osmId);
8787
}
8888

89-
@JsonProperty("categories")
89+
@JsonProperty(DumpFields.PLACE_CATEGORIES)
9090
void setCategories(String[] categories) {
9191
for (var cat : categories) {
9292
if (cat.startsWith("osm.")) {
@@ -100,73 +100,63 @@ void setCategories(String[] categories) {
100100
doc.tagValue("yes");
101101
}
102102

103-
@JsonProperty("tag_key")
104-
void setTagKey(String tagKey) {
105-
doc.tagKey(tagKey);
106-
}
107-
108-
@JsonProperty("tag_value")
109-
void setTagValue(String tagValue) {
110-
doc.tagValue(tagValue);
111-
}
112-
113-
@JsonProperty("rank_address")
103+
@JsonProperty(DumpFields.PLACE_RANK_ADDRESS)
114104
void setRankAddress(int rankAddress) {
115105
doc.rankAddress(rankAddress);
116106
}
117107

118-
@JsonProperty("admin_level")
108+
@JsonProperty(DumpFields.PLACE_ADMIN_LEVEL)
119109
void setAdminLevel(int adminLevel) { doc.adminLevel(adminLevel); }
120110

121-
@JsonProperty("importance")
111+
@JsonProperty(DumpFields.PLACE_IMPORTANCE)
122112
void setImportance(double importance) {
123113
doc.importance(importance);
124114
}
125115

126-
@JsonProperty("parent_place_id")
116+
@JsonProperty(DumpFields.PLACE_PARENT_PLACE_ID)
127117
void setParentPlaceId(long parentPlaceId) {
128118
doc.parentPlaceId(parentPlaceId);
129119
}
130120

131-
@JsonProperty("name")
121+
@JsonProperty(DumpFields.PLACE_NAMES)
132122
void setNames(Map<String, String> names) {
133123
this.names = names;
134124
}
135125

136-
@JsonProperty("housenumber")
126+
@JsonProperty(DumpFields.PLACE_HOUSENUMBER)
137127
void setHousenumber(String housenumber) {
138128
doc.houseNumber(housenumber);
139129
}
140130

141-
@JsonProperty("address")
131+
@JsonProperty(DumpFields.PLACE_ADDRESS)
142132
void setAddress(Map<String, String> address) {
143133
this.address = address;
144134
}
145135

146-
@JsonProperty("extratags")
136+
@JsonProperty(DumpFields.PLACE_EXTRA_TAGS)
147137
void setExtratags(Map<String, String> extratags) {
148138
doc.extraTags(extratags);
149139
}
150140

151-
@JsonProperty("postcode")
141+
@JsonProperty(DumpFields.PLACE_POSTCODE)
152142
void setPostcode(String postcode) {
153143
doc.postcode(postcode);
154144
}
155145

156-
@JsonProperty("country_code")
146+
@JsonProperty(DumpFields.PLACE_COUNTRY_CODE)
157147
void setCountryCode(String countryCode) {
158148
doc.countryCode(countryCode);
159149
}
160150

161-
@JsonProperty("centroid")
151+
@JsonProperty(DumpFields.PLACE_CENTROID)
162152
void setCentroid(double[] coordinates) throws IOException {
163153
if (coordinates.length != 2) {
164154
throw new IOException("Invalid centroid. Must be an array of two doubles.");
165155
}
166156
doc.centroid(factory.createPoint(new Coordinate(coordinates[0], coordinates[1])));
167157
}
168158

169-
@JsonProperty("bbox")
159+
@JsonProperty(DumpFields.PLACE_BBOX)
170160
void setBbox(double[] coordinates) throws IOException {
171161
if (coordinates.length != 4) {
172162
throw new IOException("Invalid bbox. Must be an array of four doubles.");
@@ -177,14 +167,14 @@ void setBbox(double[] coordinates) throws IOException {
177167
}));
178168
}
179169

180-
@JsonProperty("geometry")
170+
@JsonProperty(DumpFields.PLACE_GEOMETRY)
181171
void setGeometry(JsonNode geojson) throws ParseException {
182172
final var geometry = jsonReader.read(geojson.toString());
183173
doc.geometry(geometry);
184174
doc.bbox(geometry.getEnvelope());
185175
}
186176

187-
@JsonProperty("addresslines")
177+
@JsonProperty(DumpFields.PLACE_ADDRESSLINES)
188178
void setAddressLines(AddressLine[] addressLines) {
189179
this.addressLines = addressLines;
190180
}

src/test/java/de/komoot/photon/json/JsonReaderTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class JsonReaderTest {
3030
private boolean configGeometryColumn = false;
3131

3232
private static final String TEST_SIMPLE_CONTENT =
33-
"{\"place_id\":100818,\"object_type\":\"W\",\"object_id\":223306798,\"categories\" : [\"osm.waterway.stream\"], \"rank_address\" : 0, \"rank_search\" : 22, \"importance\" : 0.10667666666666664,\"name\":{\"name\": \"Spiersbach\", \"name:de\": \"Spiersbach\", \"alt_name\": \"Spirsbach\"},\"extratags\":{\"boat\": \"no\"},\"country_code\":\"at\",\"centroid\":[9.53713454,47.27052526],\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[9.5461636,47.2415541],[9.5558108,47.2955234],[9.556083,47.2962812],[9.554958,47.2966235]]}}";
33+
"{\"place_id\":100818,\"object_type\":\"W\",\"object_id\":223306798,\"categories\" : [\"osm.waterway.stream\"], \"rank_address\" : 0, \"rank_search\" : 22, \"importance\" : 0.10667666666666664,\"name\":{\"name\": \"Spiersbach\", \"name:de\": \"Spiersbach\", \"alt_name\": \"Spirsbach\"},\"extra\":{\"boat\": \"no\"},\"country_code\":\"at\",\"centroid\":[9.53713454,47.27052526],\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[9.5461636,47.2415541],[9.5558108,47.2955234],[9.556083,47.2962812],[9.554958,47.2966235]]}}";
3434
private static final String TEST_SIMPLE_STREAM =
3535
"{\"type\":\"Place\",\"content\":" + TEST_SIMPLE_CONTENT + "}";
3636

0 commit comments

Comments
 (0)