diff --git a/src/main/java/org/springframework/data/elasticsearch/core/DefaultEntityMapper.java b/src/main/java/org/springframework/data/elasticsearch/core/DefaultEntityMapper.java index e5ef3d13e..f96c37c9f 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/DefaultEntityMapper.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/DefaultEntityMapper.java @@ -16,9 +16,27 @@ package org.springframework.data.elasticsearch.core; import java.io.IOException; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.core.*; +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.module.SimpleModule; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.core.geo.CustomGeoModule; +import org.springframework.data.geo.*; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.core.Version; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.module.SimpleModule; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; /** * DocumentMapper using jackson @@ -34,6 +52,7 @@ public class DefaultEntityMapper implements EntityMapper { objectMapper = new ObjectMapper(); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true); + objectMapper.registerModule(new CustomGeoModule()); } @Override diff --git a/src/main/java/org/springframework/data/elasticsearch/core/MappingBuilder.java b/src/main/java/org/springframework/data/elasticsearch/core/MappingBuilder.java index 760049eae..d58f9db77 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/MappingBuilder.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/MappingBuilder.java @@ -33,6 +33,7 @@ import org.springframework.data.annotation.Transient; import org.springframework.data.elasticsearch.annotations.*; import org.springframework.data.elasticsearch.core.completion.Completion; import org.springframework.data.elasticsearch.core.geo.GeoPoint; +import org.springframework.data.geo.*; import org.springframework.data.mapping.model.SimpleTypeHolder; import org.springframework.data.util.ClassTypeInformation; import org.springframework.data.util.TypeInformation; @@ -111,11 +112,11 @@ class MappingBuilder { continue; } - boolean isGeoField = isGeoField(field); + boolean isGeoPointField = isGeoPointField(field); boolean isCompletionField = isCompletionField(field); Field singleField = field.getAnnotation(Field.class); - if (!isGeoField && !isCompletionField && isEntity(field) && isAnnotated(field)) { + if (!isGeoPointField && !isCompletionField && isEntity(field) && isAnnotated(field)) { if (singleField == null) { continue; } @@ -128,7 +129,7 @@ class MappingBuilder { MultiField multiField = field.getAnnotation(MultiField.class); - if (isGeoField) { + if (isGeoPointField) { applyGeoPointFieldMapping(xContentBuilder, field); } @@ -167,7 +168,10 @@ class MappingBuilder { } private static boolean isAnnotated(java.lang.reflect.Field field) { - return field.getAnnotation(Field.class) != null || field.getAnnotation(MultiField.class) != null || field.getAnnotation(GeoPointField.class) != null || field.getAnnotation(CompletionField.class) != null; + return field.getAnnotation(Field.class) != null || + field.getAnnotation(MultiField.class) != null || + field.getAnnotation(GeoPointField.class) != null || + field.getAnnotation(CompletionField.class) != null; } private static void applyGeoPointFieldMapping(XContentBuilder xContentBuilder, java.lang.reflect.Field field) throws IOException { @@ -333,7 +337,7 @@ class MappingBuilder { return fieldAnnotation != null && (FieldType.Nested == fieldAnnotation.type() || FieldType.Object == fieldAnnotation.type()); } - private static boolean isGeoField(java.lang.reflect.Field field) { + private static boolean isGeoPointField(java.lang.reflect.Field field) { return field.getType() == GeoPoint.class || field.getAnnotation(GeoPointField.class) != null; } diff --git a/src/main/java/org/springframework/data/elasticsearch/core/geo/CustomGeoModule.java b/src/main/java/org/springframework/data/elasticsearch/core/geo/CustomGeoModule.java new file mode 100644 index 000000000..fcc93d5f3 --- /dev/null +++ b/src/main/java/org/springframework/data/elasticsearch/core/geo/CustomGeoModule.java @@ -0,0 +1,70 @@ +package org.springframework.data.elasticsearch.core.geo; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.Version; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.module.SimpleModule; +import org.springframework.data.geo.Point; + +/** + * @author Artur Konaczak + */ +public class CustomGeoModule extends SimpleModule { + + private static final long serialVersionUID = 1L; + + /** + * Creates a new {@link org.springframework.data.elasticsearch.core.geo.CustomGeoModule} registering serializers and deserializers for spring data commons geo-spatial types. + */ + public CustomGeoModule() { + + super("Spring Data Elasticsearch Geo", new Version(1, 0, 0, null, "org.springframework.data.elasticsearch", "spring-data-elasticsearch-geo")); + addSerializer(Point.class, new PointSerializer()); + addDeserializer(Point.class, new PointDeserializer()); + } +} + +class PointSerializer extends JsonSerializer { + + @Override + public void serialize(Point value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException { + gen.writeObject(GeoPoint.fromPoint(value)); +// gen.writeStartObject(); +// gen.writeNumberField("lat", value.getY()); +// gen.writeNumberField("lon", value.getX()); +// gen.writeEndObject(); + } +} + +class PointDeserializer extends JsonDeserializer { + + @Override + public Point deserialize(JsonParser p, DeserializationContext context) throws IOException, JsonProcessingException { + + GeoPoint point = p.readValueAs(GeoPoint.class); +// Double lat = null; +// Double lon = null; +// //skipp field name +// p.nextFieldName(); +// if ("lat".equals(p.getCurrentName())) { +// //get value +// p.nextFieldName(); +// lat = p.getDoubleValue(); +// p.nextFieldName(); +// } +// if ("lon".equals(p.getCurrentName())) { +// //get value +// p.nextFieldName(); +// lon = p.getDoubleValue(); +// } +// return new Point(lon, lat); + return GeoPoint.toPoint(point); + } +} diff --git a/src/main/java/org/springframework/data/elasticsearch/core/geo/GeoPoint.java b/src/main/java/org/springframework/data/elasticsearch/core/geo/GeoPoint.java index e5ff88a51..057813f63 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/geo/GeoPoint.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/geo/GeoPoint.java @@ -53,6 +53,10 @@ public class GeoPoint { public static GeoPoint fromPoint(Point point) { return new GeoPoint(point.getY(), point.getX()); } + + public static Point toPoint(GeoPoint point) { + return new Point(point.getLat(), point.getLon()); + } } diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/Criteria.java b/src/main/java/org/springframework/data/elasticsearch/core/query/Criteria.java index 4915220a5..f3e665a82 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/Criteria.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/Criteria.java @@ -21,6 +21,7 @@ import org.apache.commons.lang.StringUtils; import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.data.elasticsearch.core.geo.GeoBox; import org.springframework.data.elasticsearch.core.geo.GeoPoint; +import org.springframework.data.geo.Box; import org.springframework.data.geo.Distance; import org.springframework.data.geo.Point; import org.springframework.util.Assert; @@ -453,6 +454,17 @@ public class Criteria { return this; } + /** + * Creates new CriteriaEntry for {@code location Box bounding box} + * + * @param boundingBox {@link org.springframework.data.elasticsearch.core.geo.GeoBox} bounding box(left top corner + right bottom corner) + * @return Criteria the chaind criteria with the new 'boundingBox' criteria included. + */ + public Criteria boundedBy(Box boundingBox) { + Assert.notNull(boundingBox, "boundingBox value for boundedBy criteria must not be null"); + filterCriteria.add(new CriteriaEntry(OperationKey.BBOX, new Object[]{boundingBox.getFirst(), boundingBox.getSecond()})); + return this; + } /** * Creates new CriteriaEntry for bounding box created from points @@ -482,6 +494,13 @@ public class Criteria { return this; } + public Criteria boundedBy(Point topLeftPoint, Point bottomRightPoint) { + Assert.notNull(topLeftPoint, "topLeftPoint must not be null"); + Assert.notNull(bottomRightPoint, "bottomRightPoint must not be null"); + filterCriteria.add(new CriteriaEntry(OperationKey.BBOX, new Object[]{GeoPoint.fromPoint(topLeftPoint), GeoPoint.fromPoint(bottomRightPoint)})); + return this; + } + private void assertNoBlankInWildcardedQuery(String searchString, boolean leadingWildcard, boolean trailingWildcard) { if (StringUtils.contains(searchString, CRITERIA_VALUE_SEPERATOR)) { throw new InvalidDataAccessApiUsageException("Cannot constructQuery '" + (leadingWildcard ? "*" : "") + "\"" diff --git a/src/test/java/org/springframework/data/elasticsearch/NestedObjectTests.java b/src/test/java/org/springframework/data/elasticsearch/NestedObjectTests.java index 41ac7204b..b697edc7a 100644 --- a/src/test/java/org/springframework/data/elasticsearch/NestedObjectTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/NestedObjectTests.java @@ -48,6 +48,7 @@ import org.springframework.data.elasticsearch.entities.Car; import org.springframework.data.elasticsearch.entities.GirlFriend; import org.springframework.data.elasticsearch.entities.Person; import org.springframework.data.elasticsearch.entities.PersonMultipleLevelNested; +import org.springframework.data.geo.Point; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; diff --git a/src/test/java/org/springframework/data/elasticsearch/builder/CarBuilder.java b/src/test/java/org/springframework/data/elasticsearch/builder/CarBuilder.java deleted file mode 100644 index fe528577a..000000000 --- a/src/test/java/org/springframework/data/elasticsearch/builder/CarBuilder.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2013 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.data.elasticsearch.builder; - -import org.springframework.data.elasticsearch.entities.Car; - -/** - * @author Artur Konczak - */ -public class CarBuilder { - - private Car car = new Car(); - - public CarBuilder name(String name) { - car.setName(name); - return this; - } - - public CarBuilder model(String model) { - car.setModel(model); - return this; - } - - public Car build() { - return car; - } -} diff --git a/src/test/java/org/springframework/data/elasticsearch/builder/SampleEntityBuilder.java b/src/test/java/org/springframework/data/elasticsearch/builder/SampleEntityBuilder.java deleted file mode 100644 index ad9488a56..000000000 --- a/src/test/java/org/springframework/data/elasticsearch/builder/SampleEntityBuilder.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 2013-2014 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.data.elasticsearch.builder; - -import org.springframework.data.elasticsearch.core.query.IndexQuery; -import org.springframework.data.elasticsearch.entities.SampleEntity; - -/** - * @author Rizwan Idrees - * @author Mohsin Husen - * @author Artur Konczak - */ -public class SampleEntityBuilder { - - private SampleEntity result; - - public SampleEntityBuilder(String id) { - result = new SampleEntity(); - result.setId(id); - } - - public SampleEntityBuilder type(String type) { - result.setType(type); - return this; - } - - public SampleEntityBuilder message(String message) { - result.setMessage(message); - return this; - } - - public SampleEntityBuilder rate(int rate) { - result.setRate(rate); - return this; - } - - public SampleEntityBuilder available(boolean available) { - result.setAvailable(available); - return this; - } - - public SampleEntityBuilder highlightedMessage(String highlightedMessage) { - result.setHighlightedMessage(highlightedMessage); - return this; - } - - public SampleEntityBuilder version(Long version) { - result.setVersion(version); - return this; - } - - public SampleEntity build() { - return result; - } - - public IndexQuery buildIndex() { - IndexQuery indexQuery = new IndexQuery(); - indexQuery.setId(result.getId()); - indexQuery.setObject(result); - return indexQuery; - } -} diff --git a/src/test/java/org/springframework/data/elasticsearch/builder/StockPriceBuilder.java b/src/test/java/org/springframework/data/elasticsearch/builder/StockPriceBuilder.java deleted file mode 100644 index f113ca3fa..000000000 --- a/src/test/java/org/springframework/data/elasticsearch/builder/StockPriceBuilder.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2013-2014 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.data.elasticsearch.builder; - -import java.math.BigDecimal; - -import org.springframework.data.elasticsearch.core.query.IndexQuery; -import org.springframework.data.elasticsearch.entities.StockPrice; - -/** - * @author Artur Konczak - * @author Mohsin Husen - */ -public class StockPriceBuilder { - - private StockPrice result; - - public StockPriceBuilder(String id) { - result = new StockPrice(id); - } - - public StockPriceBuilder symbol(String symbol) { - result.setSymbol(symbol); - return this; - } - - public StockPriceBuilder price(BigDecimal price) { - result.setPrice(price); - return this; - } - - public StockPriceBuilder price(double price) { - result.setPrice(new BigDecimal(price)); - return this; - } - - public StockPrice build() { - return result; - } - - public IndexQuery buildIndex() { - IndexQuery indexQuery = new IndexQuery(); - indexQuery.setId(result.getId()); - indexQuery.setObject(result); - return indexQuery; - } -} diff --git a/src/test/java/org/springframework/data/elasticsearch/core/AliasTests.java b/src/test/java/org/springframework/data/elasticsearch/core/AliasTests.java index 5b0d1d5cc..acc7b1ad5 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/AliasTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/AliasTests.java @@ -28,7 +28,6 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.elasticsearch.builder.SampleEntityBuilder; import org.springframework.data.elasticsearch.core.query.*; import org.springframework.data.elasticsearch.entities.SampleEntity; import org.springframework.test.context.ContextConfiguration; @@ -113,7 +112,7 @@ public class AliasTests { elasticsearchTemplate.addAlias(aliasQuery); String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntityBuilder(documentId) + SampleEntity sampleEntity = SampleEntity.builder().id(documentId) .message("some message") .version(System.currentTimeMillis()).build(); @@ -168,7 +167,7 @@ public class AliasTests { elasticsearchTemplate.addAlias(aliasQuery2); String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntityBuilder(documentId) + SampleEntity sampleEntity = SampleEntity.builder().id(documentId) .message("some message") .version(System.currentTimeMillis()).build(); diff --git a/src/test/java/org/springframework/data/elasticsearch/core/DefaultEntityMapperTests.java b/src/test/java/org/springframework/data/elasticsearch/core/DefaultEntityMapperTests.java index 584e9a6ca..876628a78 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/DefaultEntityMapperTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/DefaultEntityMapperTests.java @@ -22,8 +22,10 @@ import java.io.IOException; import org.junit.Before; import org.junit.Test; -import org.springframework.data.elasticsearch.builder.CarBuilder; +import org.springframework.data.elasticsearch.core.geo.GeoPoint; import org.springframework.data.elasticsearch.entities.Car; +import org.springframework.data.elasticsearch.entities.GeoEntity; +import org.springframework.data.geo.Point; /** * @author Artur Konczak @@ -46,7 +48,7 @@ public class DefaultEntityMapperTests { //Given //When - String jsonResult = entityMapper.mapToString(new CarBuilder().model(CAR_MODEL).name(CAR_NAME).build()); + String jsonResult = entityMapper.mapToString(Car.builder().model(CAR_MODEL).name(CAR_NAME).build()); //Then assertThat(jsonResult, is(JSON_STRING)); @@ -63,4 +65,28 @@ public class DefaultEntityMapperTests { assertThat(result.getName(), is(CAR_NAME)); assertThat(result.getModel(), is(CAR_MODEL)); } + + @Test + public void shouldMapGeoPointElasticsearchNames() throws IOException { + //given + final Point point = new Point(10, 20); + final int radius = 10; + final String pointAsString = point.getX() + "," + point.getY(); + final double[] pointAsArray = {point.getX(), point.getY()}; + final GeoEntity geoEntity = GeoEntity.builder() + .pointA(point).pointB(GeoPoint.fromPoint(point)).pointC(pointAsString).pointD(pointAsArray) + .build(); + //when + String jsonResult = entityMapper.mapToString(geoEntity); + + //then + assertThat(jsonResult, containsString(pointTemplate("pointA", point))); + assertThat(jsonResult, containsString(pointTemplate("pointB", point))); + assertThat(jsonResult, containsString(String.format("\"%s\":\"%s\"", "pointC", pointAsString))); + assertThat(jsonResult, containsString(String.format("\"%s\":[%.1f,%.1f]", "pointD", pointAsArray[0], pointAsArray[1]))); + } + + private String pointTemplate(String name, Point point) { + return String.format("\"%s\":{\"lat\":%.1f,\"lon\":%.1f}", name, point.getY(), point.getX()); + } } diff --git a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java index 16ea4b0ff..44478df3e 100755 --- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java @@ -15,6 +15,15 @@ */ package org.springframework.data.elasticsearch.core; +import static org.apache.commons.lang.RandomStringUtils.*; +import static org.elasticsearch.index.query.FilterBuilders.*; +import static org.elasticsearch.index.query.QueryBuilders.*; +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; +import static org.springframework.data.elasticsearch.utils.IndexBuilder.*; + +import java.util.*; + import org.apache.commons.lang.StringUtils; import org.elasticsearch.action.get.MultiGetItemResponse; import org.elasticsearch.action.get.MultiGetResponse; @@ -36,7 +45,6 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.elasticsearch.ElasticsearchException; import org.springframework.data.elasticsearch.annotations.Document; -import org.springframework.data.elasticsearch.builder.SampleEntityBuilder; import org.springframework.data.elasticsearch.core.query.*; import org.springframework.data.elasticsearch.entities.HetroEntity1; import org.springframework.data.elasticsearch.entities.HetroEntity2; @@ -46,15 +54,6 @@ import org.springframework.data.util.CloseableIterator; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import java.util.*; - -import static org.apache.commons.lang.RandomStringUtils.randomNumeric; -import static org.elasticsearch.index.query.FilterBuilders.boolFilter; -import static org.elasticsearch.index.query.FilterBuilders.termFilter; -import static org.elasticsearch.index.query.QueryBuilders.*; -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; - /** * @author Rizwan Idrees * @author Mohsin Husen @@ -90,7 +89,7 @@ public class ElasticsearchTemplateTests { public void shouldReturnCountForGivenCriteriaQuery() { // given String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntityBuilder(documentId).message("some message") + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); @@ -107,7 +106,7 @@ public class ElasticsearchTemplateTests { public void shouldReturnCountForGivenSearchQuery() { // given String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntityBuilder(documentId).message("some message") + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); @@ -124,7 +123,7 @@ public class ElasticsearchTemplateTests { public void shouldReturnObjectForGivenId() { // given String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntityBuilder(documentId).message("some message") + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); elasticsearchTemplate.index(indexQuery); @@ -143,12 +142,12 @@ public class ElasticsearchTemplateTests { List indexQueries = new ArrayList(); // first document String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntityBuilder(documentId).message("some message") + SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId).message("some message") .version(System.currentTimeMillis()).build(); // second document String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntityBuilder(documentId2).message("some message") + SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("some message") .version(System.currentTimeMillis()).build(); indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2)); @@ -171,14 +170,14 @@ public class ElasticsearchTemplateTests { List indexQueries = new ArrayList(); // first document String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntityBuilder(documentId) + SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId) .message("some message") .type("type1") .version(System.currentTimeMillis()).build(); // second document String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntityBuilder(documentId2) + SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2) .message("some message") .type("type2") .version(System.currentTimeMillis()).build(); @@ -215,7 +214,7 @@ public class ElasticsearchTemplateTests { public void shouldReturnPageForGivenSearchQuery() { // given String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntityBuilder(documentId).message("some message") + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); @@ -237,12 +236,12 @@ public class ElasticsearchTemplateTests { List indexQueries = new ArrayList(); // first document String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntityBuilder(documentId).message("some message") + SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId).message("some message") .version(System.currentTimeMillis()).build(); // second document String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntityBuilder(documentId2).message("some message") + SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("some message") .version(System.currentTimeMillis()).build(); indexQueries = getIndexQueries(Arrays.asList(sampleEntity1, sampleEntity2)); @@ -264,7 +263,7 @@ public class ElasticsearchTemplateTests { String messageBeforeUpdate = "some test message"; String messageAfterUpdate = "test message"; - SampleEntity sampleEntity = new SampleEntityBuilder(documentId) + SampleEntity sampleEntity = SampleEntity.builder().id(documentId) .message(messageBeforeUpdate) .version(System.currentTimeMillis()).build(); @@ -278,7 +277,6 @@ public class ElasticsearchTemplateTests { UpdateQuery updateQuery = new UpdateQueryBuilder().withId(documentId) .withClass(SampleEntity.class).withIndexRequest(indexRequest).build(); - List queries = new ArrayList(); queries.add(updateQuery); @@ -295,7 +293,7 @@ public class ElasticsearchTemplateTests { public void shouldDeleteDocumentForGivenId() { // given String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntityBuilder(documentId).message("some message") + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); @@ -314,7 +312,7 @@ public class ElasticsearchTemplateTests { public void shouldDeleteEntityForGivenId() { // given String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntityBuilder(documentId).message("some message") + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); @@ -333,7 +331,7 @@ public class ElasticsearchTemplateTests { public void shouldDeleteDocumentForGivenQuery() { // given String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntityBuilder(documentId).message("some message") + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); @@ -353,7 +351,7 @@ public class ElasticsearchTemplateTests { public void shouldFilterSearchResultsForGivenFilter() { // given String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntityBuilder(documentId).message("some message") + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); @@ -374,21 +372,21 @@ public class ElasticsearchTemplateTests { List indexQueries = new ArrayList(); // first document String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntityBuilder(documentId) + SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId) .message("abc") .rate(10) .version(System.currentTimeMillis()).build(); // second document String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntityBuilder(documentId2) + SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2) .message("xyz") .rate(5) .version(System.currentTimeMillis()).build(); // third document String documentId3 = randomNumeric(5); - SampleEntity sampleEntity3 = new SampleEntityBuilder(documentId3) + SampleEntity sampleEntity3 = SampleEntity.builder().id(documentId3) .message("xyz") .rate(15) .version(System.currentTimeMillis()).build(); @@ -413,21 +411,21 @@ public class ElasticsearchTemplateTests { List indexQueries = new ArrayList(); // first document String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntityBuilder(documentId) + SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId) .message("abc") .rate(10) .version(System.currentTimeMillis()).build(); // second document String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntityBuilder(documentId2) + SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2) .message("xyz") .rate(5) .version(System.currentTimeMillis()).build(); // third document String documentId3 = randomNumeric(5); - SampleEntity sampleEntity3 = new SampleEntityBuilder(documentId3) + SampleEntity sampleEntity3 = SampleEntity.builder().id(documentId3) .message("xyz") .rate(15) .version(System.currentTimeMillis()).build(); @@ -452,7 +450,7 @@ public class ElasticsearchTemplateTests { public void shouldExecuteStringQuery() { // given String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntityBuilder(documentId).message("some message") + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); @@ -471,7 +469,7 @@ public class ElasticsearchTemplateTests { public void shouldReturnPageableResultsGivenStringQuery() { // given String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntityBuilder(documentId).message("some message") + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); @@ -517,7 +515,7 @@ public class ElasticsearchTemplateTests { public void shouldReturnObjectMatchingGivenStringQuery() { // given String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntityBuilder(documentId).message("some message") + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); @@ -545,7 +543,7 @@ public class ElasticsearchTemplateTests { public void shouldExecuteGivenCriteriaQuery() { // given String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntityBuilder(documentId).message("test message") + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("test message") .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); @@ -564,7 +562,7 @@ public class ElasticsearchTemplateTests { public void shouldDeleteGivenCriteriaQuery() { // given String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntityBuilder(documentId).message("test message") + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("test message") .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); @@ -587,7 +585,7 @@ public class ElasticsearchTemplateTests { // given String documentId = randomNumeric(5); String message = "some test message"; - SampleEntity sampleEntity = new SampleEntityBuilder(documentId).message(message) + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message(message) .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); @@ -623,7 +621,7 @@ public class ElasticsearchTemplateTests { + "we want real-time search, we want simple multi-tenancy, and we want a solution that is built for the cloud."; String documentId1 = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntityBuilder(documentId1).message(sampleMessage) + SampleEntity sampleEntity = SampleEntity.builder().id(documentId1).message(sampleMessage) .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); @@ -632,7 +630,7 @@ public class ElasticsearchTemplateTests { String documentId2 = randomNumeric(5); - elasticsearchTemplate.index(getIndexQuery(new SampleEntityBuilder(documentId2).message(sampleMessage) + elasticsearchTemplate.index(getIndexQuery(SampleEntity.builder().id(documentId2).message(sampleMessage) .version(System.currentTimeMillis()).build())); elasticsearchTemplate.refresh(SampleEntity.class, true); @@ -946,20 +944,20 @@ public class ElasticsearchTemplateTests { List indexQueries = new ArrayList(); // first document String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntityBuilder(documentId) + SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId) .message("test message") .version(System.currentTimeMillis()).build(); // second document String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntityBuilder(documentId2) + SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2) .message("test test") .rate(5) .version(System.currentTimeMillis()).build(); // third document String documentId3 = randomNumeric(5); - SampleEntity sampleEntity3 = new SampleEntityBuilder(documentId3) + SampleEntity sampleEntity3 = SampleEntity.builder().id(documentId3) .message("some message") .rate(15) .version(System.currentTimeMillis()).build(); @@ -987,20 +985,20 @@ public class ElasticsearchTemplateTests { // given // first document String documentId = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntityBuilder(documentId) + SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId) .message("test message") .version(System.currentTimeMillis()).build(); // second document String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntityBuilder(documentId2) + SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2) .message("test test") .rate(5) .version(System.currentTimeMillis()).build(); // third document String documentId3 = randomNumeric(5); - SampleEntity sampleEntity3 = new SampleEntityBuilder(documentId3) + SampleEntity sampleEntity3 = SampleEntity.builder().id(documentId3) .message("some message") .rate(15) .version(System.currentTimeMillis()).build(); @@ -1043,7 +1041,7 @@ public class ElasticsearchTemplateTests { String messageBeforeUpdate = "some test message"; String messageAfterUpdate = "test message"; - SampleEntity sampleEntity = new SampleEntityBuilder(documentId) + SampleEntity sampleEntity = SampleEntity.builder().id(documentId) .message(messageBeforeUpdate) .version(System.currentTimeMillis()).build(); @@ -1101,7 +1099,7 @@ public class ElasticsearchTemplateTests { String actualMessage = "some test message"; String highlightedMessage = "some test message"; - SampleEntity sampleEntity = new SampleEntityBuilder(documentId) + SampleEntity sampleEntity = SampleEntity.builder().id(documentId) .message(actualMessage) .version(System.currentTimeMillis()).build(); @@ -1143,7 +1141,7 @@ public class ElasticsearchTemplateTests { public void shouldDeleteSpecifiedTypeFromAnIndex() { // given String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntityBuilder(documentId) + SampleEntity sampleEntity = SampleEntity.builder().id(documentId) .message("some message") .version(System.currentTimeMillis()).build(); @@ -1164,7 +1162,7 @@ public class ElasticsearchTemplateTests { public void shouldDeleteDocumentBySpecifiedTypeUsingDeleteQuery() { // given String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntityBuilder(documentId) + SampleEntity sampleEntity = SampleEntity.builder().id(documentId) .message("some message") .version(System.currentTimeMillis()).build(); @@ -1256,9 +1254,9 @@ public class ElasticsearchTemplateTests { // given List indexQueries = new ArrayList(); - indexQueries.add(new SampleEntityBuilder("1").message("ab").buildIndex()); - indexQueries.add(new SampleEntityBuilder("2").message("bc").buildIndex()); - indexQueries.add(new SampleEntityBuilder("3").message("ac").buildIndex()); + indexQueries.add(buildIndex(SampleEntity.builder().id("1").message("ab").build())); + indexQueries.add(buildIndex(SampleEntity.builder().id("2").message("bc").build())); + indexQueries.add(buildIndex(SampleEntity.builder().id("3").message("ac").build())); elasticsearchTemplate.bulkIndex(indexQueries); elasticsearchTemplate.refresh(SampleEntity.class, true); @@ -1403,7 +1401,7 @@ public class ElasticsearchTemplateTests { public void shouldIndexSampleEntityWithIndexAndTypeAtRuntime() { // given String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntityBuilder(documentId) + SampleEntity sampleEntity = SampleEntity.builder().id(documentId) .message("some message") .version(System.currentTimeMillis()).build(); @@ -1430,7 +1428,7 @@ public class ElasticsearchTemplateTests { public void shouldReturnCountForGivenCriteriaQueryWithGivenIndexUsingCriteriaQuery() { // given String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntityBuilder(documentId).message("some message") + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); @@ -1451,7 +1449,7 @@ public class ElasticsearchTemplateTests { public void shouldReturnCountForGivenSearchQueryWithGivenIndexUsingSearchQuery() { // given String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntityBuilder(documentId).message("some message") + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); @@ -1474,7 +1472,7 @@ public class ElasticsearchTemplateTests { public void shouldReturnCountForGivenCriteriaQueryWithGivenIndexAndTypeUsingCriteriaQuery() { // given String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntityBuilder(documentId).message("some message") + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); @@ -1496,7 +1494,7 @@ public class ElasticsearchTemplateTests { public void shouldReturnCountForGivenSearchQueryWithGivenIndexAndTypeUsingSearchQuery() { // given String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntityBuilder(documentId).message("some message") + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); @@ -1521,7 +1519,7 @@ public class ElasticsearchTemplateTests { // given cleanUpIndices(); String documentId1 = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntityBuilder(documentId1).message("some message") + SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId1).message("some message") .version(System.currentTimeMillis()).build(); IndexQuery indexQuery1 = new IndexQueryBuilder().withId(sampleEntity1.getId()) @@ -1530,7 +1528,7 @@ public class ElasticsearchTemplateTests { .build(); String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntityBuilder(documentId2).message("some test message") + SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("some test message") .version(System.currentTimeMillis()).build(); IndexQuery indexQuery2 = new IndexQueryBuilder().withId(sampleEntity2.getId()) @@ -1558,7 +1556,7 @@ public class ElasticsearchTemplateTests { // given cleanUpIndices(); String documentId1 = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntityBuilder(documentId1).message("some message") + SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId1).message("some message") .version(System.currentTimeMillis()).build(); IndexQuery indexQuery1 = new IndexQueryBuilder().withId(sampleEntity1.getId()) @@ -1567,7 +1565,7 @@ public class ElasticsearchTemplateTests { .build(); String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntityBuilder(documentId2).message("some test message") + SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("some test message") .version(System.currentTimeMillis()).build(); IndexQuery indexQuery2 = new IndexQueryBuilder().withId(sampleEntity2.getId()) @@ -1634,7 +1632,7 @@ public class ElasticsearchTemplateTests { // given cleanUpIndices(); String documentId1 = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntityBuilder(documentId1).message("some message") + SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId1).message("some message") .version(System.currentTimeMillis()).build(); IndexQuery indexQuery1 = new IndexQueryBuilder().withId(sampleEntity1.getId()) @@ -1643,7 +1641,7 @@ public class ElasticsearchTemplateTests { .build(); String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntityBuilder(documentId2).message("some test message") + SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("some test message") .version(System.currentTimeMillis()).build(); IndexQuery indexQuery2 = new IndexQueryBuilder().withId(sampleEntity2.getId()) @@ -1671,7 +1669,7 @@ public class ElasticsearchTemplateTests { // given cleanUpIndices(); String documentId1 = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntityBuilder(documentId1).message("some message") + SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId1).message("some message") .version(System.currentTimeMillis()).build(); IndexQuery indexQuery1 = new IndexQueryBuilder().withId(sampleEntity1.getId()) @@ -1680,7 +1678,7 @@ public class ElasticsearchTemplateTests { .build(); String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntityBuilder(documentId2).message("some test message") + SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("some test message") .version(System.currentTimeMillis()).build(); IndexQuery indexQuery2 = new IndexQueryBuilder().withId(sampleEntity2.getId()) @@ -1706,7 +1704,7 @@ public class ElasticsearchTemplateTests { public void shouldThrowAnExceptionForGivenCriteriaQueryWhenNoIndexSpecifiedForCountQuery() { // given String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntityBuilder(documentId).message("some message") + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); @@ -1726,7 +1724,7 @@ public class ElasticsearchTemplateTests { public void shouldThrowAnExceptionForGivenSearchQueryWhenNoIndexSpecifiedForCountQuery() { // given String documentId = randomNumeric(5); - SampleEntity sampleEntity = new SampleEntityBuilder(documentId).message("some message") + SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message") .version(System.currentTimeMillis()).build(); IndexQuery indexQuery = getIndexQuery(sampleEntity); @@ -1833,7 +1831,7 @@ public class ElasticsearchTemplateTests { public void shouldTestResultsAcrossMultipleIndices() { // given String documentId1 = randomNumeric(5); - SampleEntity sampleEntity1 = new SampleEntityBuilder(documentId1).message("some message") + SampleEntity sampleEntity1 = SampleEntity.builder().id(documentId1).message("some message") .version(System.currentTimeMillis()).build(); IndexQuery indexQuery1 = new IndexQueryBuilder().withId(sampleEntity1.getId()) @@ -1842,7 +1840,7 @@ public class ElasticsearchTemplateTests { .build(); String documentId2 = randomNumeric(5); - SampleEntity sampleEntity2 = new SampleEntityBuilder(documentId2).message("some test message") + SampleEntity sampleEntity2 = SampleEntity.builder().id(documentId2).message("some test message") .version(System.currentTimeMillis()).build(); IndexQuery indexQuery2 = new IndexQueryBuilder().withId(sampleEntity2.getId()) diff --git a/src/test/java/org/springframework/data/elasticsearch/core/MappingBuilderTests.java b/src/test/java/org/springframework/data/elasticsearch/core/MappingBuilderTests.java index 6dfc845fc..1b8912d9e 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/MappingBuilderTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/MappingBuilderTests.java @@ -19,6 +19,7 @@ package org.springframework.data.elasticsearch.core; import static org.elasticsearch.index.query.QueryBuilders.*; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; +import static org.springframework.data.elasticsearch.utils.IndexBuilder.*; import java.io.IOException; import java.math.BigDecimal; @@ -30,10 +31,10 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.elasticsearch.builder.SampleInheritedEntityBuilder; -import org.springframework.data.elasticsearch.builder.StockPriceBuilder; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.data.elasticsearch.core.query.SearchQuery; import org.springframework.data.elasticsearch.entities.*; +import org.springframework.data.elasticsearch.entities.GeoEntity; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -89,7 +90,7 @@ public class MappingBuilderTests { String symbol = "AU"; double price = 2.34; String id = "abc"; - elasticsearchTemplate.index(new StockPriceBuilder(id).symbol(symbol).price(price).buildIndex()); + elasticsearchTemplate.index(buildIndex(StockPrice.builder().id(id).symbol(symbol).price(new BigDecimal(price)).build())); elasticsearchTemplate.refresh(StockPrice.class, true); SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); @@ -147,4 +148,20 @@ public class MappingBuilderTests { assertThat(entry.getCreatedDate(), is(createdDate)); assertThat(entry.getMessage(), is(message)); } + + @Test + public void shouldBuildMappingsForGeoPoint() throws IOException { + //given + + //when + XContentBuilder xContentBuilder = MappingBuilder.buildMapping(GeoEntity.class, "mapping", "id", null); + + //then + final String result = xContentBuilder.string(); + + assertThat(result, containsString("\"pointA\":{\"type\":\"geo_point\"")); + assertThat(result, containsString("\"pointB\":{\"type\":\"geo_point\"")); + assertThat(result, containsString("\"pointC\":{\"type\":\"geo_point\"")); + assertThat(result, containsString("\"pointD\":{\"type\":\"geo_point\"")); + } } diff --git a/src/test/java/org/springframework/data/elasticsearch/core/geo/ElasticsearchTemplateGeoTests.java b/src/test/java/org/springframework/data/elasticsearch/core/geo/ElasticsearchTemplateGeoTests.java index 2b78cb767..e2f7307ef 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/geo/ElasticsearchTemplateGeoTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/geo/ElasticsearchTemplateGeoTests.java @@ -24,7 +24,6 @@ import java.util.List; import org.elasticsearch.common.geo.GeoHashUtils; import org.elasticsearch.index.query.FilterBuilders; -import org.elasticsearch.search.aggregations.AggregationBuilders; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -33,6 +32,7 @@ import org.springframework.data.elasticsearch.core.query.Criteria; import org.springframework.data.elasticsearch.core.query.CriteriaQuery; import org.springframework.data.elasticsearch.core.query.IndexQuery; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; +import org.springframework.data.geo.Point; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -248,6 +248,23 @@ public class ElasticsearchTemplateGeoTests { assertThat(geoAuthorsForGeoCriteria3, containsInAnyOrder(hasProperty("name", equalTo("Mohsin Husen")), hasProperty("name", equalTo("Rizwan Idrees")))); } + @Test + public void shouldFindAuthorMarkersInBoxForGivenCriteriaQueryUsingPoints() { + //given + loadClassBaseEntities(); + CriteriaQuery geoLocationCriteriaQuery3 = new CriteriaQuery( + new Criteria("location").boundedBy( + new Point(0, 53.5171d), + new Point(0.2062d, 49.5171d)) + ); + //when + List geoAuthorsForGeoCriteria3 = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery3, AuthorMarkerEntity.class); + + //then + assertThat(geoAuthorsForGeoCriteria3.size(), is(2)); + assertThat(geoAuthorsForGeoCriteria3, containsInAnyOrder(hasProperty("name", equalTo("Mohsin Husen")), hasProperty("name", equalTo("Rizwan Idrees")))); + } + @Test public void shouldFindLocationWithGeoHashPrefix() { diff --git a/src/test/java/org/springframework/data/elasticsearch/core/query/CriteriaQueryTests.java b/src/test/java/org/springframework/data/elasticsearch/core/query/CriteriaQueryTests.java index f725021fd..55ebbd11b 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/query/CriteriaQueryTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/query/CriteriaQueryTests.java @@ -18,6 +18,7 @@ package org.springframework.data.elasticsearch.core.query; import static org.apache.commons.lang.RandomStringUtils.*; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; +import static org.springframework.data.elasticsearch.utils.IndexBuilder.*; import java.util.ArrayList; import java.util.List; @@ -28,7 +29,6 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; -import org.springframework.data.elasticsearch.builder.SampleEntityBuilder; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; import org.springframework.data.elasticsearch.entities.SampleEntity; import org.springframework.test.context.ContextConfiguration; @@ -707,9 +707,9 @@ public class CriteriaQueryTests { // given List indexQueries = new ArrayList(); - indexQueries.add(new SampleEntityBuilder("1").message("ab").buildIndex()); - indexQueries.add(new SampleEntityBuilder("2").message("bc").buildIndex()); - indexQueries.add(new SampleEntityBuilder("3").message("ac").buildIndex()); + indexQueries.add(buildIndex(SampleEntity.builder().id("1").message("ab").build())); + indexQueries.add(buildIndex(SampleEntity.builder().id("2").message("bc").build())); + indexQueries.add(buildIndex(SampleEntity.builder().id("3").message("ac").build())); elasticsearchTemplate.bulkIndex(indexQueries); elasticsearchTemplate.refresh(SampleEntity.class, true); diff --git a/src/test/java/org/springframework/data/elasticsearch/entities/Book.java b/src/test/java/org/springframework/data/elasticsearch/entities/Book.java index cc433beee..0ee280f43 100644 --- a/src/test/java/org/springframework/data/elasticsearch/entities/Book.java +++ b/src/test/java/org/springframework/data/elasticsearch/entities/Book.java @@ -19,6 +19,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.Map; +import lombok.*; import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; @@ -28,6 +29,11 @@ import org.springframework.data.elasticsearch.annotations.FieldType; * @author Rizwan Idrees * @author Mohsin Husen */ +@Setter +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder @Document(indexName = "book", type = "book", indexStoreType = "memory", shards = 1, replicas = 0, refreshInterval = "-1") public class Book { @@ -38,36 +44,4 @@ public class Book { private Author author; @Field(type = FieldType.Nested) private Map> buckets = new HashMap>(); - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public Author getAuthor() { - return author; - } - - public void setAuthor(Author author) { - this.author = author; - } - - public Map> getBuckets() { - return buckets; - } - - public void setBuckets(Map> buckets) { - this.buckets = buckets; - } } diff --git a/src/test/java/org/springframework/data/elasticsearch/entities/Car.java b/src/test/java/org/springframework/data/elasticsearch/entities/Car.java index e321da5cb..1e7180286 100644 --- a/src/test/java/org/springframework/data/elasticsearch/entities/Car.java +++ b/src/test/java/org/springframework/data/elasticsearch/entities/Car.java @@ -15,11 +15,18 @@ */ package org.springframework.data.elasticsearch.entities; +import lombok.*; + /** * @author Rizwan Idrees * @author Mohsin Husen * @author Artur Konczak */ +@Setter +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder public class Car { private String name; diff --git a/src/test/java/org/springframework/data/elasticsearch/entities/GeoEntity.java b/src/test/java/org/springframework/data/elasticsearch/entities/GeoEntity.java new file mode 100644 index 000000000..b0732032e --- /dev/null +++ b/src/test/java/org/springframework/data/elasticsearch/entities/GeoEntity.java @@ -0,0 +1,44 @@ +package org.springframework.data.elasticsearch.entities; + +import lombok.*; +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.GeoPointField; +import org.springframework.data.elasticsearch.core.geo.GeoBox; +import org.springframework.data.elasticsearch.core.geo.GeoPoint; +import org.springframework.data.geo.Box; +import org.springframework.data.geo.Circle; +import org.springframework.data.geo.Point; +import org.springframework.data.geo.Polygon; + +/** + * @author Artur Konczak + */ +@Setter +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Document(indexName = "geo-test-index", type = "geo-test-index", indexStoreType = "memory", shards = 1, replicas = 0, refreshInterval = "-1") +public class GeoEntity { + + @Id + private String id; + + //geo shape - Spring Data + private Box box; + private Circle circle; + private Polygon polygon; + + //geo point - Custom implementation + Spring Data + @GeoPointField + private Point pointA; + + private GeoPoint pointB; + + @GeoPointField + private String pointC; + + @GeoPointField + private double[] pointD; +} diff --git a/src/test/java/org/springframework/data/elasticsearch/entities/SampleEntity.java b/src/test/java/org/springframework/data/elasticsearch/entities/SampleEntity.java index 953843ccc..c530ef94d 100644 --- a/src/test/java/org/springframework/data/elasticsearch/entities/SampleEntity.java +++ b/src/test/java/org/springframework/data/elasticsearch/entities/SampleEntity.java @@ -15,8 +15,7 @@ */ package org.springframework.data.elasticsearch.entities; -import org.apache.commons.lang.builder.EqualsBuilder; -import org.apache.commons.lang.builder.HashCodeBuilder; +import lombok.*; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Version; import org.springframework.data.elasticsearch.annotations.Document; @@ -26,6 +25,12 @@ import org.springframework.data.elasticsearch.core.geo.GeoPoint; * @author Rizwan Idrees * @author Mohsin Husen */ + +@Setter +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder @Document(indexName = "test-index", type = "test-type", indexStoreType = "memory", shards = 1, replicas = 0, refreshInterval = "-1") public class SampleEntity { @@ -42,99 +47,36 @@ public class SampleEntity { @Version private Long version; - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public int getRate() { - return rate; - } - - public void setRate(int rate) { - this.rate = rate; - } - - public boolean isAvailable() { - return available; - } - - public void setAvailable(boolean available) { - this.available = available; - } - - public String getHighlightedMessage() { - return highlightedMessage; - } - - public void setHighlightedMessage(String highlightedMessage) { - this.highlightedMessage = highlightedMessage; - } - - public GeoPoint getLocation() { - return location; - } - - public void setLocation(GeoPoint location) { - this.location = location; - } - - public Long getVersion() { - return version; - } - - public void setVersion(Long version) { - this.version = version; - } - @Override - public boolean equals(Object obj) { - if (!(obj instanceof SampleEntity)) { + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + SampleEntity that = (SampleEntity) o; + + if (available != that.available) return false; + if (rate != that.rate) return false; + if (highlightedMessage != null ? !highlightedMessage.equals(that.highlightedMessage) : that.highlightedMessage != null) return false; - } - if (this == obj) { - return true; - } - SampleEntity rhs = (SampleEntity) obj; - return new EqualsBuilder().append(this.id, rhs.id).append(this.type, rhs.type).append(this.message, rhs.message) - .append(this.rate, rhs.rate).append(this.available, rhs.available).append(this.version, rhs.version).isEquals(); + if (id != null ? !id.equals(that.id) : that.id != null) return false; + if (location != null ? !location.equals(that.location) : that.location != null) return false; + if (message != null ? !message.equals(that.message) : that.message != null) return false; + if (type != null ? !type.equals(that.type) : that.type != null) return false; + if (version != null ? !version.equals(that.version) : that.version != null) return false; + + return true; } @Override public int hashCode() { - return new HashCodeBuilder().append(id).append(type).append(message).append(rate).append(available).append(version) - .toHashCode(); - } - - @Override - public String toString() { - return "SampleEntity{" + - "id='" + id + '\'' + - ", type='" + type + '\'' + - ", message='" + message + '\'' + - ", rate=" + rate + - ", available=" + available + - ", highlightedMessage='" + highlightedMessage + '\'' + - ", version=" + version + - '}'; + int result = id != null ? id.hashCode() : 0; + result = 31 * result + (type != null ? type.hashCode() : 0); + result = 31 * result + (message != null ? message.hashCode() : 0); + result = 31 * result + rate; + result = 31 * result + (available ? 1 : 0); + result = 31 * result + (highlightedMessage != null ? highlightedMessage.hashCode() : 0); + result = 31 * result + (location != null ? location.hashCode() : 0); + result = 31 * result + (version != null ? version.hashCode() : 0); + return result; } } diff --git a/src/test/java/org/springframework/data/elasticsearch/entities/StockPrice.java b/src/test/java/org/springframework/data/elasticsearch/entities/StockPrice.java index 99eb74d96..2b68a572d 100644 --- a/src/test/java/org/springframework/data/elasticsearch/entities/StockPrice.java +++ b/src/test/java/org/springframework/data/elasticsearch/entities/StockPrice.java @@ -17,6 +17,7 @@ package org.springframework.data.elasticsearch.entities; import java.math.BigDecimal; +import lombok.*; import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; @@ -26,6 +27,11 @@ import org.springframework.data.elasticsearch.annotations.FieldType; * @author Artur Konczak * @author Mohsin Husen */ +@Setter +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder @Document(indexName = "stock", type = "price", indexStoreType = "memory", shards = 1, replicas = 0, refreshInterval = "-1") public class StockPrice { @@ -36,36 +42,4 @@ public class StockPrice { @Field(type = FieldType.Double) private BigDecimal price; - - private StockPrice() { - //don't delete - } - - public StockPrice(String id) { - this.id = id; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getSymbol() { - return symbol; - } - - public void setSymbol(String symbol) { - this.symbol = symbol; - } - - public BigDecimal getPrice() { - return price; - } - - public void setPrice(BigDecimal price) { - this.price = price; - } } diff --git a/src/test/java/org/springframework/data/elasticsearch/repositories/geo/SpringDataGeoRepository.java b/src/test/java/org/springframework/data/elasticsearch/repositories/geo/SpringDataGeoRepository.java new file mode 100644 index 000000000..4581ed030 --- /dev/null +++ b/src/test/java/org/springframework/data/elasticsearch/repositories/geo/SpringDataGeoRepository.java @@ -0,0 +1,11 @@ +package org.springframework.data.elasticsearch.repositories.geo; + +import org.springframework.data.elasticsearch.entities.GeoEntity; +import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; + +/** + * Created by akonczak on 22/11/2015. + */ +public interface SpringDataGeoRepository extends ElasticsearchRepository { + +} diff --git a/src/test/java/org/springframework/data/elasticsearch/repositories/geo/SpringDataGeoRepositoryTest.java b/src/test/java/org/springframework/data/elasticsearch/repositories/geo/SpringDataGeoRepositoryTest.java new file mode 100644 index 000000000..11b275278 --- /dev/null +++ b/src/test/java/org/springframework/data/elasticsearch/repositories/geo/SpringDataGeoRepositoryTest.java @@ -0,0 +1,66 @@ +package org.springframework.data.elasticsearch.repositories.geo; + +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; +import org.springframework.data.elasticsearch.core.geo.GeoPoint; +import org.springframework.data.elasticsearch.entities.GeoEntity; +import org.springframework.data.geo.Point; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("classpath:/repository-spring-data-geo-support.xml") +public class SpringDataGeoRepositoryTest { + + @Autowired + private ElasticsearchTemplate template; + + @Autowired + private SpringDataGeoRepository repository; + + @Before + public void init() { + template.deleteIndex(GeoEntity.class); + template.createIndex(GeoEntity.class); + template.putMapping(GeoEntity.class); + template.refresh(GeoEntity.class, true); + } + + @Test + public void shouldSaveAndLoadGeoPoints() { + //given + final Point point = new Point(15, 25); + GeoEntity entity = GeoEntity.builder() + .pointA(point) + .pointB(new GeoPoint(point.getX(), point.getY())) + .pointC(toGeoString(point)) + .pointD(toGeoArray(point)) + .build(); + //when + entity = repository.save(entity); + GeoEntity result = repository.findOne(entity.getId()); + //then + + assertThat(entity.getPointA(), is(result.getPointA())); + assertThat(entity.getPointB(), is(result.getPointB())); + assertThat(entity.getPointC(), is(result.getPointC())); + assertThat(entity.getPointD(), is(result.getPointD())); + } + + private String toGeoString(Point point) { + return String.format("%.1f,%.1f", point.getX(), point.getY()); + } + + private double[] toGeoArray(Point point) { + return new double[]{ + point.getX(), point.getY() + }; + } +} \ No newline at end of file diff --git a/src/test/java/org/springframework/data/elasticsearch/utils/IndexBuilder.java b/src/test/java/org/springframework/data/elasticsearch/utils/IndexBuilder.java new file mode 100644 index 000000000..f365581e6 --- /dev/null +++ b/src/test/java/org/springframework/data/elasticsearch/utils/IndexBuilder.java @@ -0,0 +1,29 @@ +package org.springframework.data.elasticsearch.utils; + +import java.lang.reflect.Field; + +import org.apache.commons.lang.ArrayUtils; +import org.springframework.data.elasticsearch.core.query.IndexQuery; + +/** + * Created by akonczak on 02/12/2015. + */ +public class IndexBuilder { + + public static IndexQuery buildIndex(Object object) { + for (Field f : object.getClass().getDeclaredFields()) { + if (ArrayUtils.isNotEmpty(f.getAnnotationsByType(org.springframework.data.annotation.Id.class))) { + try { + f.setAccessible(true); + IndexQuery indexQuery = new IndexQuery(); + indexQuery.setId((String) f.get(object)); + indexQuery.setObject(object); + return indexQuery; + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + } + throw new RuntimeException("Missing @Id field"); + } +} diff --git a/src/test/resources/repository-spring-data-geo-support.xml b/src/test/resources/repository-spring-data-geo-support.xml new file mode 100644 index 000000000..e1bdb743d --- /dev/null +++ b/src/test/resources/repository-spring-data-geo-support.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + \ No newline at end of file