Skip to content

Commit a5433e3

Browse files
authored
[7.17] Support for Byte and Short as vector tiles value tag (#97619) (#97673)
* Port lucene fix github-12352 to Elasticsearch 7.17 * Update docs/changelog/96721.yaml * Support for Byte and Short as vector tiles value tag (#97619) Byte and short data types are not supported by the vector tiles specification. If a user tries to add one of those, it actually gets ignored. This add s support to those values by casting them as integers. In addition it will throw an exception if the value added is a type it cannot understand so it is not silently ignored. # Conflicts: # x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/vector-tile/10_basic.yml
1 parent d4069ef commit a5433e3

File tree

4 files changed

+81
-1
lines changed

4 files changed

+81
-1
lines changed

docs/changelog/96721.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 96721
2+
summary: Port lucene tessellator fix github-12352 to Elasticsearch 7.17
3+
area: Geo
4+
type: bug
5+
issues: []

docs/changelog/97619.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pr: 97619
2+
summary: Support for Byte and Short as vector tiles features
3+
area: Geo
4+
type: bug
5+
issues:
6+
- 97612

x-pack/plugin/vector-tile/src/main/java/org/elasticsearch/xpack/vectortile/rest/VectorTileUtils.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,16 @@ public static void addPropertyToFeature(VectorTile.Tile.Feature.Builder feature,
6464
// guard for null values
6565
return;
6666
}
67+
if (value instanceof Byte || value instanceof Short) {
68+
// mvt does not support byte and short data types
69+
value = ((Number) value).intValue();
70+
}
6771
feature.addTags(layerProps.addKey(key));
68-
feature.addTags(layerProps.addValue(value));
72+
int valIndex = layerProps.addValue(value);
73+
if (valIndex < 0) {
74+
throw new IllegalArgumentException("Unsupported vector tile type for field [" + key + "] : " + value.getClass().getName());
75+
}
76+
feature.addTags(valIndex);
6977
}
7078

7179
/**
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License
4+
* 2.0; you may not use this file except in compliance with the Elastic License
5+
* 2.0.
6+
*/
7+
8+
package org.elasticsearch.xpack.vectortile.rest;
9+
10+
import com.wdtinc.mapbox_vector_tile.VectorTile;
11+
import com.wdtinc.mapbox_vector_tile.build.MvtLayerProps;
12+
13+
import org.elasticsearch.test.ESTestCase;
14+
15+
import java.util.stream.StreamSupport;
16+
17+
import static org.hamcrest.Matchers.containsString;
18+
19+
public class VectorTileUtilTests extends ESTestCase {
20+
21+
public void testAddPropertyToFeature() {
22+
final MvtLayerProps layerProps = new MvtLayerProps();
23+
final VectorTile.Tile.Feature.Builder featureBuilder = VectorTile.Tile.Feature.newBuilder();
24+
// boolean
25+
VectorTileUtils.addPropertyToFeature(featureBuilder, layerProps, "bool", true);
26+
assertPropertyToFeature(layerProps, featureBuilder, 1);
27+
// byte
28+
VectorTileUtils.addPropertyToFeature(featureBuilder, layerProps, "byte", (byte) 1);
29+
assertPropertyToFeature(layerProps, featureBuilder, 2);
30+
// short
31+
VectorTileUtils.addPropertyToFeature(featureBuilder, layerProps, "short", (short) 2);
32+
assertPropertyToFeature(layerProps, featureBuilder, 3);
33+
// integer
34+
VectorTileUtils.addPropertyToFeature(featureBuilder, layerProps, "integer", 3);
35+
assertPropertyToFeature(layerProps, featureBuilder, 4);
36+
// long
37+
VectorTileUtils.addPropertyToFeature(featureBuilder, layerProps, "long", 4L);
38+
assertPropertyToFeature(layerProps, featureBuilder, 5);
39+
// float
40+
VectorTileUtils.addPropertyToFeature(featureBuilder, layerProps, "float", 5f);
41+
assertPropertyToFeature(layerProps, featureBuilder, 6);
42+
// double
43+
VectorTileUtils.addPropertyToFeature(featureBuilder, layerProps, "double", 6d);
44+
assertPropertyToFeature(layerProps, featureBuilder, 7);
45+
// string
46+
VectorTileUtils.addPropertyToFeature(featureBuilder, layerProps, "string", "7");
47+
assertPropertyToFeature(layerProps, featureBuilder, 8);
48+
// invalid
49+
IllegalArgumentException ex = expectThrows(
50+
IllegalArgumentException.class,
51+
() -> VectorTileUtils.addPropertyToFeature(featureBuilder, layerProps, "invalid", new Object())
52+
);
53+
assertThat(ex.getMessage(), containsString("Unsupported vector tile type for field [invalid]"));
54+
}
55+
56+
private void assertPropertyToFeature(MvtLayerProps layerProps, VectorTile.Tile.Feature.Builder featureBuilder, int numProps) {
57+
assertEquals(numProps, StreamSupport.stream(layerProps.getKeys().spliterator(), false).count());
58+
assertEquals(numProps, StreamSupport.stream(layerProps.getVals().spliterator(), false).count());
59+
assertEquals(2 * numProps, featureBuilder.getTagsCount());
60+
}
61+
}

0 commit comments

Comments
 (0)