diff --git a/src/main/java/org/elasticsearch/index/mapper/geo/GeoShapeFieldMapper.java b/src/main/java/org/elasticsearch/index/mapper/geo/GeoShapeFieldMapper.java index 40129245cb0..a7f1eaab447 100644 --- a/src/main/java/org/elasticsearch/index/mapper/geo/GeoShapeFieldMapper.java +++ b/src/main/java/org/elasticsearch/index/mapper/geo/GeoShapeFieldMapper.java @@ -292,6 +292,10 @@ public class GeoShapeFieldMapper extends AbstractFieldMapper { if (includeDefaults || defaultStrategy.getDistErrPct() != Defaults.DISTANCE_ERROR_PCT) { builder.field(Names.DISTANCE_ERROR_PCT, defaultStrategy.getDistErrPct()); } + + if (includeDefaults || orientation() != Defaults.ORIENTATION) { + builder.field(Names.ORIENTATION, orientation()); + } } @Override diff --git a/src/test/java/org/elasticsearch/index/mapper/geo/GeoShapeFieldMapperTests.java b/src/test/java/org/elasticsearch/index/mapper/geo/GeoShapeFieldMapperTests.java index a6f1d74c423..933767e7c99 100644 --- a/src/test/java/org/elasticsearch/index/mapper/geo/GeoShapeFieldMapperTests.java +++ b/src/test/java/org/elasticsearch/index/mapper/geo/GeoShapeFieldMapperTests.java @@ -22,6 +22,7 @@ import org.apache.lucene.spatial.prefix.PrefixTreeStrategy; import org.apache.lucene.spatial.prefix.tree.GeohashPrefixTree; import org.apache.lucene.spatial.prefix.tree.QuadPrefixTree; import org.elasticsearch.common.geo.GeoUtils; +import org.elasticsearch.common.geo.builders.ShapeBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.index.mapper.DocumentMapper; import org.elasticsearch.index.mapper.DocumentMapperParser; @@ -54,6 +55,46 @@ public class GeoShapeFieldMapperTests extends ElasticsearchSingleNodeTest { assertThat(strategy.getDistErrPct(), equalTo(GeoShapeFieldMapper.Defaults.DISTANCE_ERROR_PCT)); assertThat(strategy.getGrid(), instanceOf(GeohashPrefixTree.class)); assertThat(strategy.getGrid().getMaxLevels(), equalTo(GeoShapeFieldMapper.Defaults.GEOHASH_LEVELS)); + assertThat(geoShapeFieldMapper.orientation(), equalTo(GeoShapeFieldMapper.Defaults.ORIENTATION)); + } + + /** + * Test that orientation parameter correctly parses + * @throws IOException + */ + public void testOrientationParsing() throws IOException { + String mapping = XContentFactory.jsonBuilder().startObject().startObject("type1") + .startObject("properties").startObject("location") + .field("type", "geo_shape") + .field("orientation", "left") + .endObject().endObject() + .endObject().endObject().string(); + + DocumentMapper defaultMapper = createIndex("test").mapperService().documentMapperParser().parse(mapping); + FieldMapper fieldMapper = defaultMapper.mappers().name("location").mapper(); + assertThat(fieldMapper, instanceOf(GeoShapeFieldMapper.class)); + + ShapeBuilder.Orientation orientation = ((GeoShapeFieldMapper)fieldMapper).orientation(); + assertThat(orientation, equalTo(ShapeBuilder.Orientation.CLOCKWISE)); + assertThat(orientation, equalTo(ShapeBuilder.Orientation.LEFT)); + assertThat(orientation, equalTo(ShapeBuilder.Orientation.CW)); + + // explicit right orientation test + mapping = XContentFactory.jsonBuilder().startObject().startObject("type1") + .startObject("properties").startObject("location") + .field("type", "geo_shape") + .field("orientation", "right") + .endObject().endObject() + .endObject().endObject().string(); + + defaultMapper = createIndex("test2").mapperService().documentMapperParser().parse(mapping); + fieldMapper = defaultMapper.mappers().name("location").mapper(); + assertThat(fieldMapper, instanceOf(GeoShapeFieldMapper.class)); + + orientation = ((GeoShapeFieldMapper)fieldMapper).orientation(); + assertThat(orientation, equalTo(ShapeBuilder.Orientation.COUNTER_CLOCKWISE)); + assertThat(orientation, equalTo(ShapeBuilder.Orientation.RIGHT)); + assertThat(orientation, equalTo(ShapeBuilder.Orientation.CCW)); } @Test diff --git a/src/test/java/org/elasticsearch/search/geo/GeoShapeIntegrationTests.java b/src/test/java/org/elasticsearch/search/geo/GeoShapeIntegrationTests.java index ca035253b74..f6e7f15d0cc 100644 --- a/src/test/java/org/elasticsearch/search/geo/GeoShapeIntegrationTests.java +++ b/src/test/java/org/elasticsearch/search/geo/GeoShapeIntegrationTests.java @@ -22,6 +22,10 @@ package org.elasticsearch.search.geo; import org.apache.lucene.util.LuceneTestCase; import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.index.IndexService; +import org.elasticsearch.index.mapper.FieldMapper; +import org.elasticsearch.index.mapper.geo.GeoShapeFieldMapper; +import org.elasticsearch.indices.IndicesService; import org.elasticsearch.test.geo.RandomShapeGenerator; import org.elasticsearch.common.geo.ShapeRelation; import org.elasticsearch.common.geo.builders.GeometryCollectionBuilder; @@ -456,4 +460,59 @@ public class GeoShapeIntegrationTests extends ElasticsearchIntegrationTest { assertSearchResponse(result); assertHitCount(result, 1); } + + /** + * Test that orientation parameter correctly persists across cluster restart + * @throws IOException + */ + public void testOrientationPersistence() throws Exception { + String idxName = "orientation"; + String mapping = XContentFactory.jsonBuilder().startObject().startObject("shape") + .startObject("properties").startObject("location") + .field("type", "geo_shape") + .field("orientation", "left") + .endObject().endObject() + .endObject().endObject().string(); + + // create index + assertAcked(prepareCreate(idxName).addMapping("shape", mapping)); + + mapping = XContentFactory.jsonBuilder().startObject().startObject("shape") + .startObject("properties").startObject("location") + .field("type", "geo_shape") + .field("orientation", "right") + .endObject().endObject() + .endObject().endObject().string(); + + assertAcked(prepareCreate(idxName+"2").addMapping("shape", mapping)); + ensureGreen(); + + // test mapper persistence through restart + internalCluster().fullRestart(); + ensureGreen(); + + // left orientation test + IndicesService indicesService = internalCluster().getInstance(IndicesService.class); + IndexService indexService = indicesService.indexService(idxName); + FieldMapper fieldMapper = indexService.mapperService().smartNameFieldMapper("location"); + assertThat(fieldMapper, instanceOf(GeoShapeFieldMapper.class)); + + GeoShapeFieldMapper gsfm = (GeoShapeFieldMapper)fieldMapper; + ShapeBuilder.Orientation orientation = gsfm.orientation(); + assertThat(orientation, equalTo(ShapeBuilder.Orientation.CLOCKWISE)); + assertThat(orientation, equalTo(ShapeBuilder.Orientation.LEFT)); + assertThat(orientation, equalTo(ShapeBuilder.Orientation.CW)); + + // right orientation test + indicesService = internalCluster().getInstance(IndicesService.class); + indexService = indicesService.indexService(idxName+"2"); + fieldMapper = indexService.mapperService().smartNameFieldMapper("location"); + assertThat(fieldMapper, instanceOf(GeoShapeFieldMapper.class)); + + gsfm = (GeoShapeFieldMapper)fieldMapper; + orientation = gsfm.orientation(); + assertThat(orientation, equalTo(ShapeBuilder.Orientation.COUNTER_CLOCKWISE)); + assertThat(orientation, equalTo(ShapeBuilder.Orientation.RIGHT)); + assertThat(orientation, equalTo(ShapeBuilder.Orientation.CCW)); + } }