DATAES-579 - Test code cleanup.

Original pull request: #283.
This commit is contained in:
P.J.Meisch 2019-05-09 23:30:30 +02:00 committed by Mark Paluch
parent 287aa45b98
commit 4c206f7de5
164 changed files with 7454 additions and 6143 deletions

View File

@ -37,6 +37,7 @@ import java.util.stream.Collectors;
* @author Kevin Leturc * @author Kevin Leturc
* @author Zetang Zeng * @author Zetang Zeng
* @author Dmitriy Yakovlev * @author Dmitriy Yakovlev
* @author Peter-Josef Meisch
*/ */
public interface ElasticsearchOperations { public interface ElasticsearchOperations {
@ -108,7 +109,7 @@ public interface ElasticsearchOperations {
* @param clazz * @param clazz
* @param <T> * @param <T>
*/ */
<T> Map getMapping(Class<T> clazz); <T> Map<String, Object> getMapping(Class<T> clazz);
/** /**
* Get mapping for a given indexName and type * Get mapping for a given indexName and type
@ -116,21 +117,21 @@ public interface ElasticsearchOperations {
* @param indexName * @param indexName
* @param type * @param type
*/ */
Map getMapping(String indexName, String type); Map<String, Object> getMapping(String indexName, String type);
/** /**
* Get settings for a given indexName * Get settings for a given indexName
* *
* @param indexName * @param indexName
*/ */
Map getSetting(String indexName); Map<String, Object> getSetting(String indexName);
/** /**
* Get settings for a given class * Get settings for a given class
* *
* @param clazz * @param clazz
*/ */
<T> Map getSetting(Class<T> clazz); <T> Map<String, Object> getSetting(Class<T> clazz);
/** /**

View File

@ -124,6 +124,7 @@ import org.springframework.util.StringUtils;
* @author Ivan Greene * @author Ivan Greene
* @author Christoph Strobl * @author Christoph Strobl
* @author Dmitriy Yakovlev * @author Dmitriy Yakovlev
* @author Peter-Josef Meisch
*/ */
public class ElasticsearchTemplate implements ElasticsearchOperations, EsClient<Client>, ApplicationContextAware { public class ElasticsearchTemplate implements ElasticsearchOperations, EsClient<Client>, ApplicationContextAware {
@ -234,10 +235,10 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, EsClient<
} }
@Override @Override
public Map getMapping(String indexName, String type) { public Map<String, Object> getMapping(String indexName, String type) {
Assert.notNull(indexName, "No index defined for putMapping()"); Assert.notNull(indexName, "No index defined for putMapping()");
Assert.notNull(type, "No type defined for putMapping()"); Assert.notNull(type, "No type defined for putMapping()");
Map mappings = null; Map<String, Object> mappings = null;
try { try {
mappings = client.admin().indices().getMappings(new GetMappingsRequest().indices(indexName).types(type)) mappings = client.admin().indices().getMappings(new GetMappingsRequest().indices(indexName).types(type))
.actionGet().getMappings().get(indexName).get(type).getSourceAsMap(); .actionGet().getMappings().get(indexName).get(type).getSourceAsMap();
@ -249,7 +250,7 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, EsClient<
} }
@Override @Override
public <T> Map getMapping(Class<T> clazz) { public <T> Map<String, Object> getMapping(Class<T> clazz) {
return getMapping(getPersistentEntityFor(clazz).getIndexName(), getPersistentEntityFor(clazz).getIndexType()); return getMapping(getPersistentEntityFor(clazz).getIndexName(), getPersistentEntityFor(clazz).getIndexType());
} }
@ -1034,10 +1035,10 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, EsClient<
return createIndex(getPersistentEntityFor(clazz).getIndexName(), settings); return createIndex(getPersistentEntityFor(clazz).getIndexName(), settings);
} }
private <T> Map getDefaultSettings(ElasticsearchPersistentEntity<T> persistentEntity) { private <T> Map<String, String> getDefaultSettings(ElasticsearchPersistentEntity<T> persistentEntity) {
if (persistentEntity.isUseServerConfiguration()) if (persistentEntity.isUseServerConfiguration())
return new HashMap(); return new HashMap<>();
return new MapBuilder<String, String>().put("index.number_of_shards", String.valueOf(persistentEntity.getShards())) return new MapBuilder<String, String>().put("index.number_of_shards", String.valueOf(persistentEntity.getShards()))
.put("index.number_of_replicas", String.valueOf(persistentEntity.getReplicas())) .put("index.number_of_replicas", String.valueOf(persistentEntity.getReplicas()))
@ -1046,12 +1047,12 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, EsClient<
} }
@Override @Override
public <T> Map getSetting(Class<T> clazz) { public <T> Map<String, Object> getSetting(Class<T> clazz) {
return getSetting(getPersistentEntityFor(clazz).getIndexName()); return getSetting(getPersistentEntityFor(clazz).getIndexName());
} }
@Override @Override
public Map getSetting(String indexName) { public Map<String, Object> getSetting(String indexName) {
Assert.notNull(indexName, "No index defined for getSettings"); Assert.notNull(indexName, "No index defined for getSettings");
Settings settings = client.admin().indices().getSettings(new GetSettingsRequest()).actionGet().getIndexToSettings() Settings settings = client.admin().indices().getSettings(new GetSettingsRequest()).actionGet().getIndexToSettings()
.get(indexName); .get(indexName);

View File

@ -1,73 +0,0 @@
/*
* Copyright 2014-2019 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
*
* https://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;
import static org.apache.commons.lang.RandomStringUtils.*;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
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.entities.Author;
import org.springframework.data.elasticsearch.entities.Book;
import org.springframework.data.elasticsearch.repositories.book.SampleElasticSearchBookRepository;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @author Mohsin Husen
* @author Christoph Strobl
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:/repository-test-nested-object-books.xml")
public class InnerObjectTests {
@Autowired private SampleElasticSearchBookRepository bookRepository;
@Autowired private ElasticsearchTemplate elasticsearchTemplate;
@Before
public void before() {
elasticsearchTemplate.deleteIndex(Book.class);
elasticsearchTemplate.createIndex(Book.class);
elasticsearchTemplate.putMapping(Book.class);
elasticsearchTemplate.refresh(Book.class);
}
@Test
public void shouldIndexInnerObject() {
// given
String id = randomAlphanumeric(5);
Book book = new Book();
book.setId(id);
book.setName("xyz");
Author author = new Author();
author.setId("1");
author.setName("ABC");
book.setAuthor(author);
// when
bookRepository.save(book);
// then
assertThat(bookRepository.findById(id), is(notNullValue()));
}
}

View File

@ -16,14 +16,16 @@
package org.springframework.data.elasticsearch; package org.springframework.data.elasticsearch;
import static org.apache.commons.lang.RandomStringUtils.*; import static org.apache.commons.lang.RandomStringUtils.*;
import static org.assertj.core.api.Assertions.*;
import static org.elasticsearch.index.query.QueryBuilders.*; import static org.elasticsearch.index.query.QueryBuilders.*;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.Matchers.notNullValue; import lombok.Getter;
import static org.junit.Assert.*; import lombok.Setter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -35,18 +37,19 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.annotation.Id;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import org.springframework.data.elasticsearch.annotations.InnerField;
import org.springframework.data.elasticsearch.annotations.MultiField;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.GetQuery; import org.springframework.data.elasticsearch.core.query.GetQuery;
import org.springframework.data.elasticsearch.core.query.IndexQuery; import org.springframework.data.elasticsearch.core.query.IndexQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.query.SearchQuery; import org.springframework.data.elasticsearch.core.query.SearchQuery;
import org.springframework.data.elasticsearch.entities.Author; import org.springframework.data.elasticsearch.utils.IndexInitializer;
import org.springframework.data.elasticsearch.entities.Book;
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.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@ -54,29 +57,20 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
* @author Rizwan Idrees * @author Rizwan Idrees
* @author Mohsin Husen * @author Mohsin Husen
* @author Artur Konczak * @author Artur Konczak
* @author Peter-Josef Meisch
*/ */
@RunWith(SpringJUnit4ClassRunner.class) @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:/repository-test-nested-object.xml") @ContextConfiguration("classpath:/elasticsearch-template-test.xml")
public class NestedObjectTests { public class NestedObjectTests {
@Autowired @Autowired private ElasticsearchTemplate elasticsearchTemplate;
private ElasticsearchTemplate elasticsearchTemplate;
@Before @Before
public void before() { public void before() {
elasticsearchTemplate.deleteIndex(Book.class);
elasticsearchTemplate.createIndex(Book.class); IndexInitializer.init(elasticsearchTemplate, Book.class);
elasticsearchTemplate.putMapping(Book.class); IndexInitializer.init(elasticsearchTemplate, Person.class);
elasticsearchTemplate.refresh(Book.class); IndexInitializer.init(elasticsearchTemplate, PersonMultipleLevelNested.class);
elasticsearchTemplate.deleteIndex(Person.class);
elasticsearchTemplate.createIndex(Person.class);
elasticsearchTemplate.putMapping(Person.class);
elasticsearchTemplate.refresh(Person.class);
elasticsearchTemplate.deleteIndex(PersonMultipleLevelNested.class);
elasticsearchTemplate.createIndex(PersonMultipleLevelNested.class);
elasticsearchTemplate.putMapping(PersonMultipleLevelNested.class);
elasticsearchTemplate.refresh(PersonMultipleLevelNested.class);
} }
@Test @Test
@ -126,81 +120,79 @@ public class NestedObjectTests {
indexQueries.add(indexQuery1); indexQueries.add(indexQuery1);
indexQueries.add(indexQuery2); indexQueries.add(indexQuery2);
elasticsearchTemplate.putMapping(Person.class);
elasticsearchTemplate.bulkIndex(indexQueries); elasticsearchTemplate.bulkIndex(indexQueries);
elasticsearchTemplate.refresh(Person.class); elasticsearchTemplate.refresh(Person.class);
final QueryBuilder builder = nestedQuery("car", boolQuery().must(termQuery("car.name", "saturn")).must(termQuery("car.model", "imprezza")), ScoreMode.None); final QueryBuilder builder = nestedQuery("car",
boolQuery().must(termQuery("car.name", "saturn")).must(termQuery("car.model", "imprezza")), ScoreMode.None);
final SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder).build(); final SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder).build();
final List<Person> persons = elasticsearchTemplate.queryForList(searchQuery, Person.class); final List<Person> persons = elasticsearchTemplate.queryForList(searchQuery, Person.class);
assertThat(persons.size(), is(1)); assertThat(persons).hasSize(1);
} }
@Test @Test
public void shouldIndexMultipleLevelNestedObject() { public void shouldIndexMultipleLevelNestedObject() {
//given
// given
final List<IndexQuery> indexQueries = createPerson(); final List<IndexQuery> indexQueries = createPerson();
//when // when
elasticsearchTemplate.putMapping(PersonMultipleLevelNested.class);
elasticsearchTemplate.bulkIndex(indexQueries); elasticsearchTemplate.bulkIndex(indexQueries);
elasticsearchTemplate.refresh(PersonMultipleLevelNested.class); elasticsearchTemplate.refresh(PersonMultipleLevelNested.class);
//then // then
final GetQuery getQuery = new GetQuery(); final GetQuery getQuery = new GetQuery();
getQuery.setId("1"); getQuery.setId("1");
final PersonMultipleLevelNested personIndexed = elasticsearchTemplate.queryForObject(getQuery, PersonMultipleLevelNested.class); final PersonMultipleLevelNested personIndexed = elasticsearchTemplate.queryForObject(getQuery,
assertThat(personIndexed, is(notNullValue())); PersonMultipleLevelNested.class);
assertThat(personIndexed).isNotNull();
} }
@Test @Test
public void shouldIndexMultipleLevelNestedObjectWithIncludeInParent() { public void shouldIndexMultipleLevelNestedObjectWithIncludeInParent() {
//given
// given
final List<IndexQuery> indexQueries = createPerson(); final List<IndexQuery> indexQueries = createPerson();
//when // when
elasticsearchTemplate.putMapping(PersonMultipleLevelNested.class);
elasticsearchTemplate.bulkIndex(indexQueries); elasticsearchTemplate.bulkIndex(indexQueries);
// then // then
final Map<String, Object> mapping = elasticsearchTemplate.getMapping(PersonMultipleLevelNested.class);
final Map mapping = elasticsearchTemplate.getMapping(PersonMultipleLevelNested.class); assertThat(mapping).isNotNull();
final Map<String, Object> propertyMap = (Map<String, Object>) mapping.get("properties");
assertThat(mapping, is(notNullValue())); assertThat(propertyMap).isNotNull();
final Map propertyMap = (Map) mapping.get("properties");
assertThat(propertyMap, is(notNullValue()));
final Map bestCarsAttributes = (Map) propertyMap.get("bestCars"); final Map bestCarsAttributes = (Map) propertyMap.get("bestCars");
assertThat(bestCarsAttributes.get("include_in_parent"), is(notNullValue())); assertThat(bestCarsAttributes.get("include_in_parent")).isNotNull();
} }
@Test @Test
public void shouldSearchUsingNestedQueryOnMultipleLevelNestedObject() { public void shouldSearchUsingNestedQueryOnMultipleLevelNestedObject() {
//given
// given
final List<IndexQuery> indexQueries = createPerson(); final List<IndexQuery> indexQueries = createPerson();
//when // when
elasticsearchTemplate.putMapping(PersonMultipleLevelNested.class);
elasticsearchTemplate.bulkIndex(indexQueries); elasticsearchTemplate.bulkIndex(indexQueries);
elasticsearchTemplate.refresh(PersonMultipleLevelNested.class); elasticsearchTemplate.refresh(PersonMultipleLevelNested.class);
//then // then
final BoolQueryBuilder builder = boolQuery(); final BoolQueryBuilder builder = boolQuery();
builder.must(nestedQuery("girlFriends", termQuery("girlFriends.type", "temp"),ScoreMode.None)) builder.must(nestedQuery("girlFriends", termQuery("girlFriends.type", "temp"), ScoreMode.None)).must(
.must(nestedQuery("girlFriends.cars", termQuery("girlFriends.cars.name", "Ford".toLowerCase()),ScoreMode.None)); nestedQuery("girlFriends.cars", termQuery("girlFriends.cars.name", "Ford".toLowerCase()), ScoreMode.None));
final SearchQuery searchQuery = new NativeSearchQueryBuilder() final SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder).build();
.withQuery(builder)
.build();
final Page<PersonMultipleLevelNested> personIndexed = elasticsearchTemplate.queryForPage(searchQuery, PersonMultipleLevelNested.class); final Page<PersonMultipleLevelNested> personIndexed = elasticsearchTemplate.queryForPage(searchQuery,
assertThat(personIndexed, is(notNullValue())); PersonMultipleLevelNested.class);
assertThat(personIndexed.getTotalElements(), is(1L)); assertThat(personIndexed).isNotNull();
assertThat(personIndexed.getContent().get(0).getId(), is("1")); assertThat(personIndexed.getTotalElements()).isEqualTo(1);
assertThat(personIndexed.getContent().get(0).getId()).isEqualTo("1");
} }
private List<IndexQuery> createPerson() { private List<IndexQuery> createPerson() {
final PersonMultipleLevelNested person1 = new PersonMultipleLevelNested(); final PersonMultipleLevelNested person1 = new PersonMultipleLevelNested();
@ -245,7 +237,7 @@ public class NestedObjectTests {
person2.setId("2"); person2.setId("2");
person2.setName("name"); person2.setName("name");
person2.setGirlFriends(Arrays.asList(permanent)); person2.setGirlFriends(Collections.singletonList(permanent));
final IndexQuery indexQuery2 = new IndexQuery(); final IndexQuery indexQuery2 = new IndexQuery();
indexQuery2.setId(person2.getId()); indexQuery2.setId(person2.getId());
@ -261,6 +253,7 @@ public class NestedObjectTests {
@Test @Test
public void shouldSearchBooksForPersonInitialLevelNestedType() { public void shouldSearchBooksForPersonInitialLevelNestedType() {
// given
final List<Car> cars = new ArrayList<>(); final List<Car> cars = new ArrayList<>();
final Car saturn = new Car(); final Car saturn = new Car();
@ -322,24 +315,24 @@ public class NestedObjectTests {
indexQueries.add(indexQuery1); indexQueries.add(indexQuery1);
indexQueries.add(indexQuery2); indexQueries.add(indexQuery2);
elasticsearchTemplate.putMapping(Person.class);
elasticsearchTemplate.bulkIndex(indexQueries); elasticsearchTemplate.bulkIndex(indexQueries);
elasticsearchTemplate.refresh(Person.class); elasticsearchTemplate.refresh(Person.class);
final QueryBuilder builder = nestedQuery("books", boolQuery().must(termQuery("books.name", "java")), ScoreMode.None); // when
final QueryBuilder builder = nestedQuery("books", boolQuery().must(termQuery("books.name", "java")),
ScoreMode.None);
final SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder).build(); final SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder).build();
final List<Person> persons = elasticsearchTemplate.queryForList(searchQuery, Person.class); final List<Person> persons = elasticsearchTemplate.queryForList(searchQuery, Person.class);
assertThat(persons.size(), is(1)); // then
assertThat(persons).hasSize(1);
} }
/* @Test // DATAES-73
DATAES-73
*/
@Test
public void shouldIndexAndSearchMapAsNestedType() { public void shouldIndexAndSearchMapAsNestedType() {
//given
// given
final Book book1 = new Book(); final Book book1 = new Book();
final Book book2 = new Book(); final Book book2 = new Book();
@ -369,17 +362,221 @@ public class NestedObjectTests {
indexQueries.add(indexQuery1); indexQueries.add(indexQuery1);
indexQueries.add(indexQuery2); indexQueries.add(indexQuery2);
//when
// when
elasticsearchTemplate.bulkIndex(indexQueries); elasticsearchTemplate.bulkIndex(indexQueries);
elasticsearchTemplate.refresh(Book.class); elasticsearchTemplate.refresh(Book.class);
//then
// then
final SearchQuery searchQuery = new NativeSearchQueryBuilder() final SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(nestedQuery("buckets", termQuery("buckets.1", "test3"),ScoreMode.None)) .withQuery(nestedQuery("buckets", termQuery("buckets.1", "test3"), ScoreMode.None)).build();
.build();
final Page<Book> books = elasticsearchTemplate.queryForPage(searchQuery, Book.class); final Page<Book> books = elasticsearchTemplate.queryForPage(searchQuery, Book.class);
assertThat(books.getContent().size(), is(1)); assertThat(books.getContent()).hasSize(1);
assertThat(books.getContent().get(0).getId(), is(book2.getId())); assertThat(books.getContent().get(0).getId()).isEqualTo(book2.getId());
} }
}
@Setter
@Getter
@Document(indexName = "test-index-book-nested-objects", type = "book", shards = 1, replicas = 0, refreshInterval = "-1")
static class Book {
@Id private String id;
private String name;
@Field(type = FieldType.Object) private Author author;
@Field(type = FieldType.Nested) private Map<Integer, Collection<String>> buckets = new HashMap<>();
@MultiField(mainField = @Field(type = FieldType.Text, analyzer = "whitespace"),
otherFields = { @InnerField(suffix = "prefix", type = FieldType.Text, analyzer = "stop",
searchAnalyzer = "standard") }) private String description;
}
@Document(indexName = "test-index-person", type = "user", shards = 1, replicas = 0, refreshInterval = "-1")
static class Person {
@Id private String id;
private String name;
@Field(type = FieldType.Nested) private List<Car> car;
@Field(type = FieldType.Nested, includeInParent = true) private List<Book> books;
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 List<Car> getCar() {
return car;
}
public void setCar(List<Car> car) {
this.car = car;
}
public List<Book> getBooks() {
return books;
}
public void setBooks(List<Book> books) {
this.books = books;
}
}
static class Car {
private String name;
private String model;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
}
/**
* @author Rizwan Idrees
* @author Mohsin Husen
* @author Artur Konczak
*/
@Document(indexName = "test-index-person-multiple-level-nested", type = "user", shards = 1, replicas = 0,
refreshInterval = "-1")
static class PersonMultipleLevelNested {
@Id private String id;
private String name;
@Field(type = FieldType.Nested) private List<GirlFriend> girlFriends;
@Field(type = FieldType.Nested) private List<Car> cars;
@Field(type = FieldType.Nested, includeInParent = true) private List<Car> bestCars;
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 List<GirlFriend> getGirlFriends() {
return girlFriends;
}
public void setGirlFriends(List<GirlFriend> girlFriends) {
this.girlFriends = girlFriends;
}
public List<Car> getCars() {
return cars;
}
public void setCars(List<Car> cars) {
this.cars = cars;
}
public List<Car> getBestCars() {
return bestCars;
}
public void setBestCars(List<Car> bestCars) {
this.bestCars = bestCars;
}
}
/**
* @author Mohsin Husen
*/
static class GirlFriend {
private String name;
private String type;
@Field(type = FieldType.Nested) private List<Car> cars;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public List<Car> getCars() {
return cars;
}
public void setCars(List<Car> cars) {
this.cars = cars;
}
}
/**
* @author Rizwan Idrees
* @author Mohsin Husen
*/
static class Author {
private String id;
private String name;
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;
}
}
}

View File

@ -1,55 +0,0 @@
/*
* Copyright 2014-2019 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
*
* https://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.util.Date;
import org.springframework.data.elasticsearch.core.query.IndexQuery;
import org.springframework.data.elasticsearch.entities.SampleInheritedEntity;
/**
* @author Kevin Leturc
*/
public class SampleInheritedEntityBuilder {
private SampleInheritedEntity result;
public SampleInheritedEntityBuilder(String id) {
result = new SampleInheritedEntity();
result.setId(id);
}
public SampleInheritedEntityBuilder createdDate(Date createdDate) {
result.setCreatedDate(createdDate);
return this;
}
public SampleInheritedEntityBuilder message(String message) {
result.setMessage(message);
return this;
}
public SampleInheritedEntity build() {
return result;
}
public IndexQuery buildIndex() {
IndexQuery indexQuery = new IndexQuery();
indexQuery.setId(result.getId());
indexQuery.setObject(result);
return indexQuery;
}
}

View File

@ -17,9 +17,6 @@ package org.springframework.data.elasticsearch.client;
import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.*;
import java.util.List;
import org.elasticsearch.common.transport.TransportAddress;
import org.junit.Test; import org.junit.Test;
/** /**
@ -85,6 +82,6 @@ public class ClusterNodesUnitTests {
public void rejectsUnresolvableHost() { public void rejectsUnresolvableHost() {
assertThatExceptionOfType(IllegalArgumentException.class) // assertThatExceptionOfType(IllegalArgumentException.class) //
.isThrownBy(() -> ClusterNodes.of("mylocalhost:80")); .isThrownBy(() -> ClusterNodes.of("mylocalhost.invalid.:80"));
} }
} }

View File

@ -18,7 +18,6 @@ package org.springframework.data.elasticsearch.client.reactive;
import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
import org.springframework.data.elasticsearch.client.reactive.HostProvider.Verification;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import reactor.test.StepVerifier; import reactor.test.StepVerifier;
@ -26,6 +25,7 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.springframework.data.elasticsearch.client.ElasticsearchHost; import org.springframework.data.elasticsearch.client.ElasticsearchHost;
import org.springframework.data.elasticsearch.client.ElasticsearchHost.State; import org.springframework.data.elasticsearch.client.ElasticsearchHost.State;
import org.springframework.data.elasticsearch.client.reactive.HostProvider.Verification;
import org.springframework.data.elasticsearch.client.reactive.ReactiveMockClientTestsUtils.MockDelegatingElasticsearchHostProvider; import org.springframework.data.elasticsearch.client.reactive.ReactiveMockClientTestsUtils.MockDelegatingElasticsearchHostProvider;
import org.springframework.data.elasticsearch.client.reactive.ReactiveMockClientTestsUtils.MockWebClientProvider.Receive; import org.springframework.data.elasticsearch.client.reactive.ReactiveMockClientTestsUtils.MockWebClientProvider.Receive;
import org.springframework.web.reactive.function.client.ClientResponse; import org.springframework.web.reactive.function.client.ClientResponse;
@ -106,8 +106,7 @@ public class MultiNodeHostProviderUnitTests {
provider.clusterInfo().as(StepVerifier::create).expectNextCount(1).verifyComplete(); provider.clusterInfo().as(StepVerifier::create).expectNextCount(1).verifyComplete();
provider.getActive(Verification.ACTIVE).as(StepVerifier::create).expectNext(mock.client(HOST_2)) provider.getActive(Verification.ACTIVE).as(StepVerifier::create).expectNext(mock.client(HOST_2)).verifyComplete();
.verifyComplete();
verify(mock.client(HOST_2), times(2)).head(); verify(mock.client(HOST_2), times(2)).head();
} }

View File

@ -53,7 +53,6 @@ import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.data.elasticsearch.ElasticsearchVersion; import org.springframework.data.elasticsearch.ElasticsearchVersion;
import org.springframework.data.elasticsearch.ElasticsearchVersionRule; import org.springframework.data.elasticsearch.ElasticsearchVersionRule;
import org.springframework.data.elasticsearch.TestUtils; import org.springframework.data.elasticsearch.TestUtils;

View File

@ -16,7 +16,7 @@
package org.springframework.data.elasticsearch.client.reactive; package org.springframework.data.elasticsearch.client.reactive;
import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
import static org.springframework.data.elasticsearch.client.reactive.ReactiveMockClientTestsUtils.MockWebClientProvider.Receive.*; import static org.springframework.data.elasticsearch.client.reactive.ReactiveMockClientTestsUtils.MockWebClientProvider.Receive.*;

View File

@ -24,7 +24,6 @@ import java.util.Collections;
import org.apache.commons.lang.ClassUtils; import org.apache.commons.lang.ClassUtils;
import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.RestHighLevelClient;
import org.junit.Test; import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;

View File

@ -1,101 +0,0 @@
/*
* Copyright 2013-15 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
*
* https://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.config;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import java.util.Arrays;
import org.elasticsearch.node.NodeValidationException;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.Utils;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.entities.SampleEntity;
import org.springframework.data.elasticsearch.repositories.sample.SampleElasticsearchRepository;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
import org.springframework.data.repository.Repository;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @author Rizwan Idrees
* @author Mohsin Husen
* @author Kevin Leturc
* @author Gad Akuka
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class EnableElasticsearchRepositoriesTests implements ApplicationContextAware {
ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.context = applicationContext;
}
@Configuration
@EnableElasticsearchRepositories(basePackages = {"org.springframework.data.elasticsearch.repositories.sample",
"org.springframework.data.elasticsearch.config"})
static class Config {
@Bean
public ElasticsearchOperations elasticsearchTemplate() throws NodeValidationException {
return new ElasticsearchTemplate(Utils.getNodeClient());
}
}
@Autowired
private SampleElasticsearchRepository repository;
@Autowired(required = false)
private SampleRepository nestedRepository;
interface SampleRepository extends Repository<SampleEntity, Long> {};
@Test
public void bootstrapsRepository() {
assertThat(repository, is(notNullValue()));
}
@Test
public void shouldScanSelectedPackage() {
//given
//when
String[] beanNamesForType = context.getBeanNamesForType(ElasticsearchRepository.class);
//then
assertThat(beanNamesForType.length, is(2));
assertTrue(Arrays.asList(beanNamesForType).contains("sampleElasticsearchRepository"));
assertTrue(Arrays.asList(beanNamesForType).contains("sampleUUIDKeyedElasticsearchRepository"));
}
@Test
public void hasNotNestedRepository() {
assertNull(nestedRepository);
}
}

View File

@ -13,19 +13,20 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.data.elasticsearch.config; package org.springframework.data.elasticsearch.config.abstractelasticsearchconfiguration;
import static org.hamcrest.CoreMatchers.*; import static org.assertj.core.api.Assertions.*;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.RestHighLevelClient;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.repositories.existing.index.CreateIndexFalseRepository; import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories; import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@ -47,8 +48,8 @@ public class ElasticsearchConfigurationTests {
@Configuration @Configuration
@EnableElasticsearchRepositories( @EnableElasticsearchRepositories(
basePackages = { "org.springframework.data.elasticsearch.repositories.existing.index", basePackages = { "org.springframework.data.elasticsearch.config.abstractelasticsearchconfiguration" },
"org.springframework.data.elasticsearch.config" }) considerNestedRepositories = true)
static class Config extends AbstractElasticsearchConfiguration { static class Config extends AbstractElasticsearchConfiguration {
@Override @Override
@ -60,6 +61,15 @@ public class ElasticsearchConfigurationTests {
@Test // DATAES-563 @Test // DATAES-563
public void bootstrapsRepository() { public void bootstrapsRepository() {
assertThat(repository, is(notNullValue()));
assertThat(repository).isNotNull();
} }
@Document(indexName = "test-index-config-abstractelasticsearchconfiguraiton", type = "test-type", createIndex = false)
static class CreateIndexFalseEntity {
@Id private String id;
}
interface CreateIndexFalseRepository extends ElasticsearchRepository<CreateIndexFalseEntity, String> {}
} }

View File

@ -13,19 +13,19 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.data.elasticsearch.config; package org.springframework.data.elasticsearch.config.namespace;
import static org.hamcrest.CoreMatchers.*; import static org.assertj.core.api.Assertions.*;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.*;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.client.RestClientFactoryBean; import org.springframework.data.elasticsearch.client.RestClientFactoryBean;
import org.springframework.data.elasticsearch.client.TransportClientFactoryBean; import org.springframework.data.elasticsearch.client.TransportClientFactoryBean;
import org.springframework.data.elasticsearch.repositories.sample.SampleElasticsearchRepository; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@ -33,31 +33,41 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
* @author Rizwan Idrees * @author Rizwan Idrees
* @author Mohsin Husen * @author Mohsin Husen
* @author Don Wellington * @author Don Wellington
* @author Peter-Josef Meisch
*/ */
@RunWith(SpringJUnit4ClassRunner.class) @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("namespace.xml") @ContextConfiguration("namespace.xml")
public class ElasticsearchNamespaceHandlerTests { public class ElasticsearchNamespaceHandlerTests {
@Autowired @Autowired private ApplicationContext context;
private ApplicationContext context;
@Test @Test
public void shouldCreateTransportClient() { public void shouldCreateTransportClient() {
assertThat(context.getBean(TransportClientFactoryBean.class), is(notNullValue()));
assertThat(context.getBean(TransportClientFactoryBean.class), is(instanceOf(TransportClientFactoryBean.class))); assertThat(context.getBean(TransportClientFactoryBean.class)).isNotNull();
assertThat(context.getBean(TransportClientFactoryBean.class)).isInstanceOf(TransportClientFactoryBean.class);
} }
@Test @Test
public void shouldCreateRepository() { public void shouldCreateRepository() {
assertThat(context.getBean(TransportClientFactoryBean.class), is(notNullValue()));
assertThat(context.getBean(SampleElasticsearchRepository.class), assertThat(context.getBean(TransportClientFactoryBean.class)).isNotNull();
is(instanceOf(SampleElasticsearchRepository.class))); assertThat(context.getBean(CreateIndexFalseRepository.class)).isInstanceOf(CreateIndexFalseRepository.class);
} }
@Test @Test
public void shouldCreateRestClient() { public void shouldCreateRestClient() {
assertThat(context.getBean(RestClientFactoryBean.class), is(notNullValue()));
assertThat(context.getBean(RestClientFactoryBean.class), is(instanceOf(RestClientFactoryBean.class))); assertThat(context.getBean(RestClientFactoryBean.class)).isNotNull();
assertThat(context.getBean(RestClientFactoryBean.class)).isInstanceOf(RestClientFactoryBean.class);
} }
@Document(indexName = "test-index-config-namespace", type = "test-type", createIndex = false)
static class CreateIndexFalseEntity {
@Id private String id;
}
interface CreateIndexFalseRepository extends ElasticsearchRepository<CreateIndexFalseEntity, String> {}
} }

View File

@ -13,9 +13,20 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.data.elasticsearch.config; package org.springframework.data.elasticsearch.config.nested;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import static org.springframework.data.elasticsearch.annotations.FieldType.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import java.lang.Double;
import java.lang.Long;
import org.elasticsearch.node.NodeValidationException; import org.elasticsearch.node.NodeValidationException;
import org.junit.Test; import org.junit.Test;
@ -23,10 +34,16 @@ import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Version;
import org.springframework.data.elasticsearch.Utils; import org.springframework.data.elasticsearch.Utils;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.Score;
import org.springframework.data.elasticsearch.annotations.ScriptedField;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.entities.SampleEntity; import org.springframework.data.elasticsearch.core.geo.GeoPoint;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories; import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
import org.springframework.data.repository.Repository; import org.springframework.data.repository.Repository;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
@ -34,29 +51,59 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/** /**
* @author Kevin Leturc * @author Kevin Leturc
* @author Peter-Josef Meisch
*/ */
@RunWith(SpringJUnit4ClassRunner.class) @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration @ContextConfiguration
public class EnableNestedElasticsearchRepositoriesTests { public class EnableNestedElasticsearchRepositoriesTests {
@Configuration @Configuration
@EnableElasticsearchRepositories(basePackages = {"org.springframework.data.elasticsearch.repositories.sample", @EnableElasticsearchRepositories(basePackages = { "org.springframework.data.elasticsearch.config.nested" },
"org.springframework.data.elasticsearch.config"}, considerNestedRepositories = true) considerNestedRepositories = true)
static class Config { static class Config {
@Bean @Bean
public ElasticsearchOperations elasticsearchTemplate() throws NodeValidationException { public ElasticsearchOperations elasticsearchTemplate() throws NodeValidationException {
return new ElasticsearchTemplate(Utils.getNodeClient()); return new ElasticsearchTemplate(Utils.getNodeClient());
} }
} }
@Autowired(required = false) @Autowired(required = false) private SampleRepository nestedRepository;
private SampleRepository nestedRepository;
interface SampleRepository extends Repository<SampleEntity, Long> {};
/**
* @author Rizwan Idrees
* @author Mohsin Husen
* @author Chris White
* @author Sascha Woo
*/
@Test @Test
public void hasNestedRepository() { public void hasNestedRepository() {
assertNotNull(nestedRepository); assertNotNull(nestedRepository);
} }
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Builder
@Document(indexName = "test-index-sample-config-nested", type = "test-type", shards = 1, replicas = 0, refreshInterval = "-1")
static class SampleEntity {
@Id private String id;
@Field(type = Text, store = true, fielddata = true) private String type;
@Field(type = Text, store = true, fielddata = true) private String message;
private int rate;
@ScriptedField private Double scriptedRate;
private boolean available;
private String highlightedMessage;
private GeoPoint location;
@Version private Long version;
@Score private float score;
}
interface SampleRepository extends Repository<SampleEntity, Long> {}
} }

View File

@ -0,0 +1,186 @@
/*
* Copyright 2013-15 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
*
* https://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.config.notnested;
import static org.assertj.core.api.Assertions.*;
import static org.springframework.data.elasticsearch.annotations.FieldType.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import java.lang.Double;
import java.lang.Long;
import java.util.UUID;
import org.elasticsearch.node.NodeValidationException;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Version;
import org.springframework.data.elasticsearch.Utils;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import org.springframework.data.elasticsearch.annotations.Score;
import org.springframework.data.elasticsearch.annotations.ScriptedField;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
import org.springframework.data.elasticsearch.utils.IndexInitializer;
import org.springframework.data.repository.Repository;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @author Rizwan Idrees
* @author Mohsin Husen
* @author Kevin Leturc
* @author Gad Akuka
* @author Peter-Josef Meisch
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class EnableElasticsearchRepositoriesTests implements ApplicationContextAware {
ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.context = applicationContext;
}
@Configuration
@EnableElasticsearchRepositories(basePackages = { "org.springframework.data.elasticsearch.config.notnested" })
static class Config {
@Bean
public ElasticsearchOperations elasticsearchTemplate() throws NodeValidationException {
return new ElasticsearchTemplate(Utils.getNodeClient());
}
}
@Autowired ElasticsearchTemplate elasticsearchTemplate;
@Autowired private SampleElasticsearchRepository repository;
@Autowired(required = false) private SampleRepository nestedRepository;
interface SampleRepository extends Repository<EnableElasticsearchRepositoriesTests.SampleEntity, Long> {}
@Before
public void before() {
IndexInitializer.init(elasticsearchTemplate, SampleEntity.class);
}
@Test
public void bootstrapsRepository() {
assertThat(repository).isNotNull();
}
@Test
public void shouldScanSelectedPackage() {
// given
// when
String[] beanNamesForType = context.getBeanNamesForType(ElasticsearchRepository.class);
// then
assertThat(beanNamesForType).containsExactlyInAnyOrder("sampleElasticsearchRepository",
"sampleUUIDKeyedElasticsearchRepository");
}
@Test
public void hasNotNestedRepository() {
assertThat(nestedRepository).isNull();
}
/**
* @author Rizwan Idrees
* @author Mohsin Husen
* @author Chris White
* @author Sascha Woo
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Builder
@Document(indexName = "test-index-sample-config-not-nested", type = "test-type", shards = 1, replicas = 0,
refreshInterval = "-1")
static class SampleEntity {
@Id private String id;
@Field(type = Text, store = true, fielddata = true) private String type;
@Field(type = Text, store = true, fielddata = true) private String message;
private int rate;
@ScriptedField private Double scriptedRate;
private boolean available;
private String highlightedMessage;
private GeoPoint location;
@Version private Long version;
@Score private float score;
}
/**
* @author Gad Akuka
* @author Rizwan Idrees
* @author Mohsin Husen
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Document(indexName = "test-index-uuid-keyed-config-not-nested", type = "test-type-uuid-keyed", shards = 1,
replicas = 0, refreshInterval = "-1")
static class SampleEntityUUIDKeyed {
@Id private UUID id;
private String type;
@Field(type = FieldType.Text, fielddata = true) private String message;
private int rate;
@ScriptedField private Long scriptedRate;
private boolean available;
private String highlightedMessage;
private GeoPoint location;
@Version private Long version;
}
}

View File

@ -13,11 +13,10 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.data.elasticsearch.repositories.sample; package org.springframework.data.elasticsearch.config.notnested;
import java.util.List; import java.util.List;
import org.springframework.data.elasticsearch.entities.SampleEntity;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
/** /**
@ -25,13 +24,14 @@ import org.springframework.data.elasticsearch.repository.ElasticsearchRepository
* @author Mohsin Husen * @author Mohsin Husen
* @author Christoph Strobl * @author Christoph Strobl
*/ */
public interface SampleElasticsearchRepository extends ElasticsearchRepository<SampleEntity, String> { public interface SampleElasticsearchRepository
extends ElasticsearchRepository<EnableElasticsearchRepositoriesTests.SampleEntity, String> {
long deleteSampleEntityById(String id); long deleteSampleEntityById(String id);
List<SampleEntity> deleteByAvailable(boolean available); List<EnableElasticsearchRepositoriesTests.SampleEntity> deleteByAvailable(boolean available);
List<SampleEntity> deleteByMessage(String message); List<EnableElasticsearchRepositoriesTests.SampleEntity> deleteByMessage(String message);
void deleteByType(String type); void deleteByType(String type);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2013-2019 the original author or authors. * Copyright 2018-2019 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -13,25 +13,25 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.data.elasticsearch.repositories.sample; package org.springframework.data.elasticsearch.config.notnested;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import org.springframework.data.elasticsearch.entities.SampleEntityUUIDKeyed;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
/** /**
* @author Gad Akuka * @author Gad Akuka
* @author Christoph Strobl * @author Christoph Strobl
*/ */
public interface SampleUUIDKeyedElasticsearchRepository extends ElasticsearchRepository<SampleEntityUUIDKeyed, UUID> { interface SampleUUIDKeyedElasticsearchRepository
extends ElasticsearchRepository<EnableElasticsearchRepositoriesTests.SampleEntityUUIDKeyed, UUID> {
long deleteSampleEntityUUIDKeyedById(UUID id); long deleteSampleEntityUUIDKeyedById(UUID id);
List<SampleEntityUUIDKeyed> deleteByAvailable(boolean available); List<EnableElasticsearchRepositoriesTests.SampleEntityUUIDKeyed> deleteByAvailable(boolean available);
List<SampleEntityUUIDKeyed> deleteByMessage(String message); List<EnableElasticsearchRepositoriesTests.SampleEntityUUIDKeyed> deleteByMessage(String message);
void deleteByType(String type); void deleteByType(String type);

View File

@ -16,10 +16,19 @@
package org.springframework.data.elasticsearch.core; package org.springframework.data.elasticsearch.core;
import static org.apache.commons.lang.RandomStringUtils.*; import static org.apache.commons.lang.RandomStringUtils.*;
import static org.assertj.core.api.Assertions.*;
import static org.elasticsearch.index.query.QueryBuilders.*; import static org.elasticsearch.index.query.QueryBuilders.*;
import static org.hamcrest.Matchers.*; import static org.springframework.data.elasticsearch.annotations.FieldType.*;
import static org.junit.Assert.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.lang.Double;
import java.lang.Long;
import java.lang.Object;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -29,19 +38,27 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Version;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.Score;
import org.springframework.data.elasticsearch.annotations.ScriptedField;
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
import org.springframework.data.elasticsearch.core.query.AliasBuilder; import org.springframework.data.elasticsearch.core.query.AliasBuilder;
import org.springframework.data.elasticsearch.core.query.AliasQuery; import org.springframework.data.elasticsearch.core.query.AliasQuery;
import org.springframework.data.elasticsearch.core.query.IndexQuery; import org.springframework.data.elasticsearch.core.query.IndexQuery;
import org.springframework.data.elasticsearch.core.query.IndexQueryBuilder; import org.springframework.data.elasticsearch.core.query.IndexQueryBuilder;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.query.SearchQuery; import org.springframework.data.elasticsearch.core.query.SearchQuery;
import org.springframework.data.elasticsearch.entities.SampleEntity; import org.springframework.data.elasticsearch.utils.IndexInitializer;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/** /**
* @author Mohsin Husen * @author Mohsin Husen
* @author Ilkang Na * @author Ilkang Na
* @author Peter-Josef Meisch
*/ */
@RunWith(SpringJUnit4ClassRunner.class) @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:elasticsearch-template-test.xml") @ContextConfiguration("classpath:elasticsearch-template-test.xml")
@ -51,16 +68,18 @@ public class AliasTests {
private static final String INDEX_NAME_2 = "test-alias-index-2"; private static final String INDEX_NAME_2 = "test-alias-index-2";
private static final String TYPE_NAME = "test-alias-type"; private static final String TYPE_NAME = "test-alias-type";
@Autowired private static Map<String, Object> settings = new HashMap<>();
private ElasticsearchTemplate elasticsearchTemplate; static {
@Before
public void before() {
Map<String, Object> settings = new HashMap<>();
settings.put("index.refresh_interval", "-1"); settings.put("index.refresh_interval", "-1");
settings.put("index.number_of_replicas", "0"); settings.put("index.number_of_replicas", "0");
settings.put("index.number_of_shards", "2"); settings.put("index.number_of_shards", "2");
settings.put("index.store.type", "fs"); settings.put("index.store.type", "fs");
}
@Autowired private ElasticsearchTemplate elasticsearchTemplate;
@Before
public void before() {
elasticsearchTemplate.deleteIndex(INDEX_NAME_1); elasticsearchTemplate.deleteIndex(INDEX_NAME_1);
elasticsearchTemplate.createIndex(INDEX_NAME_1, settings); elasticsearchTemplate.createIndex(INDEX_NAME_1, settings);
@ -69,143 +88,146 @@ public class AliasTests {
elasticsearchTemplate.deleteIndex(INDEX_NAME_2); elasticsearchTemplate.deleteIndex(INDEX_NAME_2);
elasticsearchTemplate.createIndex(INDEX_NAME_2, settings); elasticsearchTemplate.createIndex(INDEX_NAME_2, settings);
elasticsearchTemplate.refresh(INDEX_NAME_2); elasticsearchTemplate.refresh(INDEX_NAME_2);
IndexInitializer.init(elasticsearchTemplate, SampleEntity.class);
} }
@Test @Test
public void shouldAddAlias() { public void shouldAddAlias() {
// given // given
String aliasName = "test-alias"; String aliasName = "test-alias";
AliasQuery aliasQuery = new AliasBuilder() AliasQuery aliasQuery = new AliasBuilder().withIndexName(INDEX_NAME_1).withAliasName(aliasName).build();
.withIndexName(INDEX_NAME_1)
.withAliasName(aliasName).build();
// when // when
elasticsearchTemplate.addAlias(aliasQuery); elasticsearchTemplate.addAlias(aliasQuery);
// then // then
List<AliasMetaData> aliases = elasticsearchTemplate.queryForAlias(INDEX_NAME_1); List<AliasMetaData> aliases = elasticsearchTemplate.queryForAlias(INDEX_NAME_1);
assertThat(aliases, is(notNullValue())); assertThat(aliases).isNotNull();
assertThat(aliases.get(0).alias(), is(aliasName)); assertThat(aliases.get(0).alias()).isEqualTo(aliasName);
} }
@Test @Test
public void shouldRemoveAlias() { public void shouldRemoveAlias() {
// given // given
String indexName = INDEX_NAME_1; String indexName = INDEX_NAME_1;
String aliasName = "test-alias"; String aliasName = "test-alias";
AliasQuery aliasQuery = new AliasBuilder() AliasQuery aliasQuery = new AliasBuilder().withIndexName(indexName).withAliasName(aliasName).build();
.withIndexName(indexName)
.withAliasName(aliasName).build();
// when // when
elasticsearchTemplate.addAlias(aliasQuery); elasticsearchTemplate.addAlias(aliasQuery);
List<AliasMetaData> aliases = elasticsearchTemplate.queryForAlias(indexName); List<AliasMetaData> aliases = elasticsearchTemplate.queryForAlias(indexName);
assertThat(aliases, is(notNullValue())); assertThat(aliases).isNotNull();
assertThat(aliases.get(0).alias(), is(aliasName)); assertThat(aliases.get(0).alias()).isEqualTo(aliasName);
// then // then
elasticsearchTemplate.removeAlias(aliasQuery); elasticsearchTemplate.removeAlias(aliasQuery);
aliases = elasticsearchTemplate.queryForAlias(indexName); aliases = elasticsearchTemplate.queryForAlias(indexName);
assertThat(aliases, anyOf(is(nullValue()), hasSize(0))); assertThat(aliases).isEmpty();
} }
/* @Test // DATAES-70
DATAES-70
*/
@Test
public void shouldAddAliasWithGivenRoutingValue() { public void shouldAddAliasWithGivenRoutingValue() {
//given
String indexName = INDEX_NAME_1; // given
String alias = "test-alias"; String alias = "test-alias";
AliasQuery aliasQuery = new AliasBuilder() AliasQuery aliasQuery = new AliasBuilder().withIndexName(INDEX_NAME_1).withAliasName(alias).withRouting("0")
.withIndexName(indexName) .build();
.withAliasName(alias)
.withRouting("0").build();
//when // when
elasticsearchTemplate.addAlias(aliasQuery); elasticsearchTemplate.addAlias(aliasQuery);
String documentId = randomNumeric(5); String documentId = randomNumeric(5);
SampleEntity sampleEntity = SampleEntity.builder().id(documentId) SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message")
.message("some message")
.version(System.currentTimeMillis()).build(); .version(System.currentTimeMillis()).build();
IndexQuery indexQuery = new IndexQueryBuilder() IndexQuery indexQuery = new IndexQueryBuilder().withIndexName(alias).withId(sampleEntity.getId())
.withIndexName(alias) .withType(TYPE_NAME).withObject(sampleEntity).build();
.withId(sampleEntity.getId())
.withType(TYPE_NAME)
.withObject(sampleEntity)
.build();
elasticsearchTemplate.index(indexQuery); elasticsearchTemplate.index(indexQuery);
elasticsearchTemplate.refresh(INDEX_NAME_1); elasticsearchTemplate.refresh(INDEX_NAME_1);
SearchQuery query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) SearchQuery query = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withIndices(alias)
.withIndices(alias).withTypes(TYPE_NAME).build(); .withTypes(TYPE_NAME).build();
long count = elasticsearchTemplate.count(query); long count = elasticsearchTemplate.count(query);
//then
List<AliasMetaData> aliases = elasticsearchTemplate.queryForAlias(INDEX_NAME_1);
assertThat(aliases, is(notNullValue()));
assertThat(aliases.get(0).alias(), is(alias));
assertThat(aliases.get(0).searchRouting(), is("0"));
assertThat(aliases.get(0).indexRouting(), is("0"));
assertThat(count, is(1L));
//cleanup // then
List<AliasMetaData> aliases = elasticsearchTemplate.queryForAlias(INDEX_NAME_1);
assertThat(aliases).isNotNull();
final AliasMetaData aliasMetaData = aliases.get(0);
assertThat(aliasMetaData.alias()).isEqualTo(alias);
assertThat(aliasMetaData.searchRouting()).isEqualTo("0");
assertThat(aliasMetaData.indexRouting()).isEqualTo("0");
assertThat(count).isEqualTo(1);
// cleanup
elasticsearchTemplate.removeAlias(aliasQuery); elasticsearchTemplate.removeAlias(aliasQuery);
elasticsearchTemplate.deleteIndex(SampleEntity.class);
elasticsearchTemplate.createIndex(SampleEntity.class);
elasticsearchTemplate.putMapping(SampleEntity.class);
elasticsearchTemplate.refresh(SampleEntity.class);
} }
/* @Test // DATAES-70
DATAES-70
*/
@Test
public void shouldAddAliasForVariousRoutingValues() { public void shouldAddAliasForVariousRoutingValues() {
//given
// given
String alias1 = "test-alias-1"; String alias1 = "test-alias-1";
String alias2 = "test-alias-2"; String alias2 = "test-alias-2";
AliasQuery aliasQuery1 = new AliasBuilder() AliasQuery aliasQuery1 = new AliasBuilder().withIndexName(INDEX_NAME_1).withAliasName(alias1).withIndexRouting("0")
.withIndexName(INDEX_NAME_1) .build();
.withAliasName(alias1)
.withIndexRouting("0").build();
AliasQuery aliasQuery2 = new AliasBuilder() AliasQuery aliasQuery2 = new AliasBuilder().withIndexName(INDEX_NAME_2).withAliasName(alias2).withSearchRouting("1")
.withIndexName(INDEX_NAME_2) .build();
.withAliasName(alias2)
.withSearchRouting("1").build();
//when // when
elasticsearchTemplate.addAlias(aliasQuery1); elasticsearchTemplate.addAlias(aliasQuery1);
elasticsearchTemplate.addAlias(aliasQuery2); elasticsearchTemplate.addAlias(aliasQuery2);
String documentId = randomNumeric(5); String documentId = randomNumeric(5);
SampleEntity sampleEntity = SampleEntity.builder().id(documentId) SampleEntity sampleEntity = SampleEntity.builder().id(documentId).message("some message")
.message("some message")
.version(System.currentTimeMillis()).build(); .version(System.currentTimeMillis()).build();
IndexQuery indexQuery = new IndexQueryBuilder() IndexQuery indexQuery = new IndexQueryBuilder().withIndexName(alias1).withType(TYPE_NAME)
.withIndexName(alias1) .withId(sampleEntity.getId()).withObject(sampleEntity).build();
.withType(TYPE_NAME)
.withId(sampleEntity.getId())
.withObject(sampleEntity).build();
elasticsearchTemplate.index(indexQuery); elasticsearchTemplate.index(indexQuery);
// then // then
List<AliasMetaData> responseAlias1 = elasticsearchTemplate.queryForAlias(INDEX_NAME_1); List<AliasMetaData> responseAlias1 = elasticsearchTemplate.queryForAlias(INDEX_NAME_1);
assertThat(responseAlias1, is(notNullValue())); assertThat(responseAlias1).isNotNull();
assertThat(responseAlias1.get(0).alias(), is(alias1)); final AliasMetaData aliasMetaData1 = responseAlias1.get(0);
assertThat(responseAlias1.get(0).indexRouting(), is("0")); assertThat(aliasMetaData1.alias()).isEqualTo(alias1);
assertThat(aliasMetaData1.indexRouting()).isEqualTo("0");
List<AliasMetaData> responseAlias2 = elasticsearchTemplate.queryForAlias(INDEX_NAME_2); List<AliasMetaData> responseAlias2 = elasticsearchTemplate.queryForAlias(INDEX_NAME_2);
assertThat(responseAlias2, is(notNullValue())); assertThat(responseAlias2).isNotNull();
assertThat(responseAlias2.get(0).alias(), is(alias2)); final AliasMetaData aliasMetaData2 = responseAlias2.get(0);
assertThat(responseAlias2.get(0).searchRouting(), is("1")); assertThat(aliasMetaData2.alias()).isEqualTo(alias2);
assertThat(aliasMetaData2.searchRouting()).isEqualTo("1");
//cleanup // cleanup
elasticsearchTemplate.removeAlias(aliasQuery1); elasticsearchTemplate.removeAlias(aliasQuery1);
elasticsearchTemplate.removeAlias(aliasQuery2); elasticsearchTemplate.removeAlias(aliasQuery2);
} }
@Builder
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "test-index-sample-core-alias", type = "test-type", shards = 1, replicas = 0, refreshInterval = "-1")
static class SampleEntity {
@Id private String id;
@Field(type = Text, store = true, fielddata = true) private String type;
@Field(type = Text, store = true, fielddata = true) private String message;
private int rate;
@ScriptedField private Double scriptedRate;
private boolean available;
private String highlightedMessage;
private GeoPoint location;
@Version private Long version;
@Score private float score;
}
} }

View File

@ -17,23 +17,34 @@ package org.springframework.data.elasticsearch.core;
import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.io.IOException; import java.io.IOException;
import java.util.Locale; import java.util.Locale;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.ReadOnlyProperty; import org.springframework.data.annotation.ReadOnlyProperty;
import org.springframework.data.annotation.Transient; import org.springframework.data.annotation.Transient;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.GeoPointField;
import org.springframework.data.elasticsearch.core.geo.GeoPoint; import org.springframework.data.elasticsearch.core.geo.GeoPoint;
import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext; import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext;
import org.springframework.data.elasticsearch.entities.Car; import org.springframework.data.geo.Box;
import org.springframework.data.elasticsearch.entities.GeoEntity; import org.springframework.data.geo.Circle;
import org.springframework.data.geo.Point; import org.springframework.data.geo.Point;
import org.springframework.data.geo.Polygon;
/** /**
* @author Artur Konczak * @author Artur Konczak
* @author Mohsin Husen * @author Mohsin Husen
* @author Oliver Gierke * @author Oliver Gierke
* @author Peter-Josef Meisch
*/ */
public class DefaultEntityMapperTests { public class DefaultEntityMapperTests {
@ -49,44 +60,46 @@ public class DefaultEntityMapperTests {
@Test @Test
public void shouldMapObjectToJsonString() throws IOException { public void shouldMapObjectToJsonString() throws IOException {
//Given
//When // given
// when
String jsonResult = entityMapper.mapToString(Car.builder().model(CAR_MODEL).name(CAR_NAME).build()); String jsonResult = entityMapper.mapToString(Car.builder().model(CAR_MODEL).name(CAR_NAME).build());
//Then // then
assertThat(jsonResult).isEqualTo(JSON_STRING); assertThat(jsonResult).isEqualTo(JSON_STRING);
} }
@Test @Test
public void shouldMapJsonStringToObject() throws IOException { public void shouldMapJsonStringToObject() throws IOException {
//Given
//When // given
// when
Car result = entityMapper.mapToObject(JSON_STRING, Car.class); Car result = entityMapper.mapToObject(JSON_STRING, Car.class);
//Then // then
assertThat(result.getName()).isEqualTo(CAR_NAME); assertThat(result.getName()).isEqualTo(CAR_NAME);
assertThat(result.getModel()).isEqualTo(CAR_MODEL); assertThat(result.getModel()).isEqualTo(CAR_MODEL);
} }
@Test @Test
public void shouldMapGeoPointElasticsearchNames() throws IOException { public void shouldMapGeoPointElasticsearchNames() throws IOException {
//given // given
final Point point = new Point(10, 20); final Point point = new Point(10, 20);
final String pointAsString = point.getX() + "," + point.getY(); final String pointAsString = point.getX() + "," + point.getY();
final double[] pointAsArray = {point.getX(), point.getY()}; final double[] pointAsArray = { point.getX(), point.getY() };
final GeoEntity geoEntity = GeoEntity.builder() final GeoEntity geoEntity = GeoEntity.builder().pointA(point).pointB(GeoPoint.fromPoint(point))
.pointA(point).pointB(GeoPoint.fromPoint(point)).pointC(pointAsString).pointD(pointAsArray) .pointC(pointAsString).pointD(pointAsArray).build();
.build(); // when
//when
String jsonResult = entityMapper.mapToString(geoEntity); String jsonResult = entityMapper.mapToString(geoEntity);
//then // then
assertThat(jsonResult).contains(pointTemplate("pointA", point)); assertThat(jsonResult).contains(pointTemplate("pointA", point));
assertThat(jsonResult).contains(pointTemplate("pointB", point)); assertThat(jsonResult).contains(pointTemplate("pointB", point));
assertThat(jsonResult).contains(String.format(Locale.ENGLISH, "\"%s\":\"%s\"", "pointC", pointAsString)); assertThat(jsonResult).contains(String.format(Locale.ENGLISH, "\"%s\":\"%s\"", "pointC", pointAsString));
assertThat(jsonResult).contains(String.format(Locale.ENGLISH, "\"%s\":[%.1f,%.1f]", "pointD", pointAsArray[0], pointAsArray[1])); assertThat(jsonResult)
.contains(String.format(Locale.ENGLISH, "\"%s\":[%.1f,%.1f]", "pointD", pointAsArray[0], pointAsArray[1]));
} }
@Test // DATAES-464 @Test // DATAES-464
@ -116,10 +129,71 @@ public class DefaultEntityMapperTests {
public static class Sample { public static class Sample {
public @ReadOnlyProperty String readOnly; public @ReadOnlyProperty String readOnly;
public @Transient String annotatedTransientProperty; public @Transient String annotatedTransientProperty;
public transient String transientProperty; public transient String transientProperty;
public String property; public String property;
} }
/**
* @author Rizwan Idrees
* @author Mohsin Husen
* @author Artur Konczak
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
static class Car {
private String name;
private String model;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
}
/**
* @author Artur Konczak
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Document(indexName = "test-index-geo-core-default-entity-mapper", type = "geo-test-index", shards = 1, replicas = 0,
refreshInterval = "-1")
static 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;
}
} }

View File

@ -16,13 +16,20 @@
package org.springframework.data.elasticsearch.core; package org.springframework.data.elasticsearch.core;
import static java.util.Arrays.*; import static java.util.Arrays.*;
import static org.hamcrest.Matchers.*; import static org.assertj.core.api.Assertions.*;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
import static org.springframework.data.elasticsearch.annotations.FieldType.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import java.lang.Double;
import java.lang.Long;
import java.lang.Object;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
@ -48,13 +55,17 @@ import org.junit.runners.Parameterized.Parameters;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Version;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.Score;
import org.springframework.data.elasticsearch.annotations.ScriptedField;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage; import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext; import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext;
import org.springframework.data.elasticsearch.entities.Car;
import org.springframework.data.elasticsearch.entities.SampleEntity;
import com.fasterxml.jackson.databind.util.ArrayIterator; import com.fasterxml.jackson.databind.util.ArrayIterator;
@ -65,6 +76,7 @@ import com.fasterxml.jackson.databind.util.ArrayIterator;
* @author Mark Paluch * @author Mark Paluch
* @author Ilkang Na * @author Ilkang Na
* @author Christoph Strobl * @author Christoph Strobl
* @author Peter-Josef Meisch
*/ */
@RunWith(Parameterized.class) @RunWith(Parameterized.class)
public class DefaultResultMapperTests { public class DefaultResultMapperTests {
@ -99,7 +111,8 @@ public class DefaultResultMapperTests {
@Test @Test
public void shouldMapAggregationsToPage() { public void shouldMapAggregationsToPage() {
// Given
// given
SearchHit[] hits = { createCarHit("Ford", "Grat"), createCarHit("BMW", "Arrow") }; SearchHit[] hits = { createCarHit("Ford", "Grat"), createCarHit("BMW", "Arrow") };
SearchHits searchHits = mock(SearchHits.class); SearchHits searchHits = mock(SearchHits.class);
when(searchHits.getTotalHits()).thenReturn(2L); when(searchHits.getTotalHits()).thenReturn(2L);
@ -109,70 +122,70 @@ public class DefaultResultMapperTests {
Aggregations aggregations = new Aggregations(asList(createCarAggregation())); Aggregations aggregations = new Aggregations(asList(createCarAggregation()));
when(response.getAggregations()).thenReturn(aggregations); when(response.getAggregations()).thenReturn(aggregations);
// When // when
AggregatedPage<Car> page = (AggregatedPage<Car>) resultMapper.mapResults(response, Car.class, Pageable.unpaged()); AggregatedPage<Car> page = resultMapper.mapResults(response, Car.class, Pageable.unpaged());
// Then // then
page.hasFacets(); page.hasFacets();
assertThat(page.hasAggregations(), is(true)); assertThat(page.hasAggregations()).isTrue();
assertThat(page.getAggregation("Diesel").getName(), is("Diesel")); assertThat(page.getAggregation("Diesel").getName()).isEqualTo("Diesel");
} }
@Test @Test
public void shouldMapSearchRequestToPage() { public void shouldMapSearchRequestToPage() {
// Given
// given
SearchHit[] hits = { createCarHit("Ford", "Grat"), createCarHit("BMW", "Arrow") }; SearchHit[] hits = { createCarHit("Ford", "Grat"), createCarHit("BMW", "Arrow") };
SearchHits searchHits = mock(SearchHits.class); SearchHits searchHits = mock(SearchHits.class);
when(searchHits.getTotalHits()).thenReturn(2L); when(searchHits.getTotalHits()).thenReturn(2L);
when(searchHits.iterator()).thenReturn(new ArrayIterator(hits)); when(searchHits.iterator()).thenReturn(new ArrayIterator(hits));
when(response.getHits()).thenReturn(searchHits); when(response.getHits()).thenReturn(searchHits);
// When // when
Page<Car> page = resultMapper.mapResults(response, Car.class, Pageable.unpaged()); Page<Car> page = resultMapper.mapResults(response, Car.class, Pageable.unpaged());
// Then // then
assertThat(page.hasContent(), is(true)); assertThat(page.hasContent()).isTrue();
assertThat(page.getTotalElements(), is(2L)); assertThat(page.getTotalElements()).isEqualTo(2);
assertThat(page.getContent().get(0).getName(), is("Ford")); assertThat(page.getContent().get(0).getName()).isEqualTo("Ford");
} }
@Test @Test
public void shouldMapPartialSearchRequestToObject() { public void shouldMapPartialSearchRequestToObject() {
// Given
// given
SearchHit[] hits = { createCarPartialHit("Ford", "Grat"), createCarPartialHit("BMW", "Arrow") }; SearchHit[] hits = { createCarPartialHit("Ford", "Grat"), createCarPartialHit("BMW", "Arrow") };
SearchHits searchHits = mock(SearchHits.class); SearchHits searchHits = mock(SearchHits.class);
when(searchHits.getTotalHits()).thenReturn(2L); when(searchHits.getTotalHits()).thenReturn(2L);
when(searchHits.iterator()).thenReturn(new ArrayIterator(hits)); when(searchHits.iterator()).thenReturn(new ArrayIterator(hits));
when(response.getHits()).thenReturn(searchHits); when(response.getHits()).thenReturn(searchHits);
// When // when
Page<Car> page = resultMapper.mapResults(response, Car.class, Pageable.unpaged()); Page<Car> page = resultMapper.mapResults(response, Car.class, Pageable.unpaged());
// Then // then
assertThat(page.hasContent(), is(true)); assertThat(page.hasContent()).isTrue();
assertThat(page.getTotalElements(), is(2L)); assertThat(page.getTotalElements()).isEqualTo(2);
assertThat(page.getContent().get(0).getName(), is("Ford")); assertThat(page.getContent().get(0).getName()).isEqualTo("Ford");
} }
@Test @Test
public void shouldMapGetRequestToObject() { public void shouldMapGetRequestToObject() {
// Given
// given
GetResponse response = mock(GetResponse.class); GetResponse response = mock(GetResponse.class);
when(response.getSourceAsString()).thenReturn(createJsonCar("Ford", "Grat")); when(response.getSourceAsString()).thenReturn(createJsonCar("Ford", "Grat"));
// When // when
Car result = resultMapper.mapResult(response, Car.class); Car result = resultMapper.mapResult(response, Car.class);
// Then // then
assertThat(result, notNullValue()); assertThat(result).isNotNull();
assertThat(result.getModel(), is("Grat")); assertThat(result.getModel()).isEqualTo("Grat");
assertThat(result.getName(), is("Ford")); assertThat(result.getName()).isEqualTo("Ford");
} }
/** @Test // DATAES-281
* @see DATAES-281.
*/
@Test
@Ignore("fix me - UnsupportedOperation") @Ignore("fix me - UnsupportedOperation")
public void setsIdentifierOnImmutableType() { public void setsIdentifierOnImmutableType() {
@ -182,24 +195,26 @@ public class DefaultResultMapperTests {
ImmutableEntity result = resultMapper.mapResult(response, ImmutableEntity.class); ImmutableEntity result = resultMapper.mapResult(response, ImmutableEntity.class);
assertThat(result, is(notNullValue())); assertThat(result).isNotNull();
assertThat(result.getId(), is("identifier")); assertThat(result.getId()).isEqualTo("identifier");
} }
@Test // DATAES-198 @Test // DATAES-198
public void setsVersionFromGetResponse() { public void setsVersionFromGetResponse() {
GetResponse response = mock(GetResponse.class); GetResponse response = mock(GetResponse.class);
when(response.getSourceAsString()).thenReturn("{}"); when(response.getSourceAsString()).thenReturn("{}");
when(response.getVersion()).thenReturn(1234L); when(response.getVersion()).thenReturn(1234L);
SampleEntity result = resultMapper.mapResult(response, SampleEntity.class); SampleEntity result = resultMapper.mapResult(response, SampleEntity.class);
assertThat(result, is(notNullValue())); assertThat(result).isNotNull();
assertThat(result.getVersion(), is(1234L)); assertThat(result.getVersion()).isEqualTo(1234);
} }
@Test // DATAES-198 @Test // DATAES-198
public void setsVersionFromMultiGetResponse() { public void setsVersionFromMultiGetResponse() {
GetResponse response1 = mock(GetResponse.class); GetResponse response1 = mock(GetResponse.class);
when(response1.getSourceAsString()).thenReturn("{}"); when(response1.getSourceAsString()).thenReturn("{}");
when(response1.isExists()).thenReturn(true); when(response1.isExists()).thenReturn(true);
@ -216,15 +231,15 @@ public class DefaultResultMapperTests {
LinkedList<SampleEntity> results = resultMapper.mapResults(multiResponse, SampleEntity.class); LinkedList<SampleEntity> results = resultMapper.mapResults(multiResponse, SampleEntity.class);
assertThat(results, is(notNullValue())); assertThat(results).isNotNull().hasSize(2);
assertThat(results, hasSize(2));
assertThat(results.get(0).getVersion(), is(1234L)); assertThat(results.get(0).getVersion()).isEqualTo(1234);
assertThat(results.get(1).getVersion(), is(5678L)); assertThat(results.get(1).getVersion()).isEqualTo(5678);
} }
@Test // DATAES-198 @Test // DATAES-198
public void setsVersionFromSearchResponse() { public void setsVersionFromSearchResponse() {
SearchHit hit1 = mock(SearchHit.class); SearchHit hit1 = mock(SearchHit.class);
when(hit1.getSourceAsString()).thenReturn("{}"); when(hit1.getSourceAsString()).thenReturn("{}");
when(hit1.getVersion()).thenReturn(1234L); when(hit1.getVersion()).thenReturn(1234L);
@ -243,25 +258,28 @@ public class DefaultResultMapperTests {
AggregatedPage<SampleEntity> results = resultMapper.mapResults(searchResponse, SampleEntity.class, AggregatedPage<SampleEntity> results = resultMapper.mapResults(searchResponse, SampleEntity.class,
mock(Pageable.class)); mock(Pageable.class));
assertThat(results, is(notNullValue())); assertThat(results).isNotNull();
assertThat(results.getContent().get(0).getVersion(), is(1234L)); assertThat(results.getContent().get(0).getVersion()).isEqualTo(1234);
assertThat(results.getContent().get(1).getVersion(), is(5678L)); assertThat(results.getContent().get(1).getVersion()).isEqualTo(5678);
} }
private Aggregation createCarAggregation() { private Aggregation createCarAggregation() {
Aggregation aggregation = mock(Terms.class); Aggregation aggregation = mock(Terms.class);
when(aggregation.getName()).thenReturn("Diesel"); when(aggregation.getName()).thenReturn("Diesel");
return aggregation; return aggregation;
} }
private SearchHit createCarHit(String name, String model) { private SearchHit createCarHit(String name, String model) {
SearchHit hit = mock(SearchHit.class); SearchHit hit = mock(SearchHit.class);
when(hit.getSourceAsString()).thenReturn(createJsonCar(name, model)); when(hit.getSourceAsString()).thenReturn(createJsonCar(name, model));
return hit; return hit;
} }
private SearchHit createCarPartialHit(String name, String model) { private SearchHit createCarPartialHit(String name, String model) {
SearchHit hit = mock(SearchHit.class); SearchHit hit = mock(SearchHit.class);
when(hit.getSourceAsString()).thenReturn(null); when(hit.getSourceAsString()).thenReturn(null);
when(hit.getFields()).thenReturn(createCarFields(name, model)); when(hit.getFields()).thenReturn(createCarFields(name, model));
@ -269,6 +287,7 @@ public class DefaultResultMapperTests {
} }
private String createJsonCar(String name, String model) { private String createJsonCar(String name, String model) {
final String q = "\""; final String q = "\"";
StringBuffer sb = new StringBuffer(); StringBuffer sb = new StringBuffer();
sb.append("{").append(q).append("name").append(q).append(":").append(q).append(name).append(q).append(","); sb.append("{").append(q).append("name").append(q).append(":").append(q).append(name).append(q).append(",");
@ -277,6 +296,7 @@ public class DefaultResultMapperTests {
} }
private Map<String, DocumentField> createCarFields(String name, String model) { private Map<String, DocumentField> createCarFields(String name, String model) {
Map<String, DocumentField> result = new HashMap<>(); Map<String, DocumentField> result = new HashMap<>();
result.put("name", new DocumentField("name", asList(name))); result.put("name", new DocumentField("name", asList(name)));
result.put("model", new DocumentField("model", asList(model))); result.put("model", new DocumentField("model", asList(model)));
@ -290,4 +310,107 @@ public class DefaultResultMapperTests {
private final String id, name; private final String id, name;
} }
/**
* @author Rizwan Idrees
* @author Mohsin Husen
* @author Artur Konczak
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
static class Car {
private String name;
private String model;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
}
/**
* @author Rizwan Idrees
* @author Mohsin Husen
* @author Chris White
* @author Sascha Woo
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Builder
@Document(indexName = "test-index-sample-default-result-mapper", type = "test-type", shards = 1, replicas = 0, refreshInterval = "-1")
static class SampleEntity {
@Id private String id;
@Field(type = Text, store = true, fielddata = true) private String type;
@Field(type = Text, store = true, fielddata = true) private String message;
private int rate;
@ScriptedField private Double scriptedRate;
private boolean available;
private String highlightedMessage;
private GeoPoint location;
@Version private Long version;
@Score private float score;
@Override
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 (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() {
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;
}
}
} }

View File

@ -17,10 +17,14 @@ package org.springframework.data.elasticsearch.core;
import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.Setter;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
@ -43,19 +47,22 @@ import org.springframework.data.annotation.Transient;
import org.springframework.data.annotation.TypeAlias; import org.springframework.data.annotation.TypeAlias;
import org.springframework.data.convert.ReadingConverter; import org.springframework.data.convert.ReadingConverter;
import org.springframework.data.convert.WritingConverter; import org.springframework.data.convert.WritingConverter;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.GeoPointField;
import org.springframework.data.elasticsearch.core.convert.ElasticsearchCustomConversions; import org.springframework.data.elasticsearch.core.convert.ElasticsearchCustomConversions;
import org.springframework.data.elasticsearch.core.geo.GeoPoint; import org.springframework.data.elasticsearch.core.geo.GeoPoint;
import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext; import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext;
import org.springframework.data.elasticsearch.entities.Car; import org.springframework.data.geo.Box;
import org.springframework.data.elasticsearch.entities.GeoEntity; import org.springframework.data.geo.Circle;
import org.springframework.data.geo.Point; import org.springframework.data.geo.Point;
import org.springframework.data.geo.Polygon;
/** /**
* @author Christoph Strobl * @author Christoph Strobl
*/ */
public class ElasticsearchEntityMapperUnitTests { public class ElasticsearchEntityMapperUnitTests {
static final String JSON_STRING = "{\"_class\":\"org.springframework.data.elasticsearch.entities.Car\",\"name\":\"Grat\",\"model\":\"Ford\"}"; static final String JSON_STRING = "{\"_class\":\"org.springframework.data.elasticsearch.core.ElasticsearchEntityMapperUnitTests$Car\",\"name\":\"Grat\",\"model\":\"Ford\"}";
static final String CAR_MODEL = "Ford"; static final String CAR_MODEL = "Ford";
static final String CAR_NAME = "Grat"; static final String CAR_NAME = "Grat";
ElasticsearchEntityMapper entityMapper; ElasticsearchEntityMapper entityMapper;
@ -674,4 +681,66 @@ public class ElasticsearchEntityMapperUnitTests {
return new ShotGun(source.get("model").toString()); return new ShotGun(source.get("model").toString());
} }
} }
/**
* @author Rizwan Idrees
* @author Mohsin Husen
* @author Artur Konczak
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
static class Car {
private String name;
private String model;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
}
/**
* @author Artur Konczak
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Document(indexName = "test-index-geo-core-entity-mapper", type = "geo-test-index", shards = 1, replicas = 0,
refreshInterval = "-1")
static 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;
}
} }

View File

@ -16,15 +16,33 @@
package org.springframework.data.elasticsearch.core; package org.springframework.data.elasticsearch.core;
import static org.apache.commons.lang.RandomStringUtils.*; import static org.apache.commons.lang.RandomStringUtils.*;
import static org.springframework.data.elasticsearch.annotations.FieldType.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import java.lang.Double;
import java.lang.Long;
import java.lang.Object;
import org.elasticsearch.ElasticsearchStatusException; import org.elasticsearch.ElasticsearchStatusException;
import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.common.xcontent.XContentType;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Version;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.Score;
import org.springframework.data.elasticsearch.annotations.ScriptedField;
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
import org.springframework.data.elasticsearch.core.query.UpdateQuery; import org.springframework.data.elasticsearch.core.query.UpdateQuery;
import org.springframework.data.elasticsearch.core.query.UpdateQueryBuilder; import org.springframework.data.elasticsearch.core.query.UpdateQueryBuilder;
import org.springframework.data.elasticsearch.entities.SampleEntity;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@ -40,6 +58,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
* @author Alen Turkovic * @author Alen Turkovic
* @author Sascha Woo * @author Sascha Woo
* @author Don Wellington * @author Don Wellington
* @author Peter-Josef Meisch
*/ */
@RunWith(SpringJUnit4ClassRunner.class) @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:elasticsearch-rest-template-test.xml") @ContextConfiguration("classpath:elasticsearch-rest-template-test.xml")
@ -47,6 +66,7 @@ public class ElasticsearchRestTemplateTests extends ElasticsearchTemplateTests {
@Test(expected = ElasticsearchStatusException.class) @Test(expected = ElasticsearchStatusException.class)
public void shouldThrowExceptionIfDocumentDoesNotExistWhileDoingPartialUpdate() { public void shouldThrowExceptionIfDocumentDoesNotExistWhileDoingPartialUpdate() {
// when // when
IndexRequest indexRequest = new IndexRequest(); IndexRequest indexRequest = new IndexRequest();
indexRequest.source("{}", XContentType.JSON); indexRequest.source("{}", XContentType.JSON);
@ -54,4 +74,74 @@ public class ElasticsearchRestTemplateTests extends ElasticsearchTemplateTests {
.withIndexRequest(indexRequest).build(); .withIndexRequest(indexRequest).build();
elasticsearchTemplate.update(updateQuery); elasticsearchTemplate.update(updateQuery);
} }
/**
* @author Rizwan Idrees
* @author Mohsin Husen
* @author Chris White
* @author Sascha Woo
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Builder
@Document(indexName = "test-index-sample-core-rest-template", type = "test-type", shards = 1, replicas = 0, refreshInterval = "-1")
static class SampleEntity {
@Id private String id;
@Field(type = Text, store = true, fielddata = true) private String type;
@Field(type = Text, store = true, fielddata = true) private String message;
private int rate;
@ScriptedField private Double scriptedRate;
private boolean available;
private String highlightedMessage;
private GeoPoint location;
@Version private Long version;
@Score private float score;
@Override
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 (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() {
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;
}
}
} }

View File

@ -15,8 +15,7 @@
*/ */
package org.springframework.data.elasticsearch.core; package org.springframework.data.elasticsearch.core;
import static org.hamcrest.Matchers.*; import static org.assertj.core.api.Assertions.*;
import static org.junit.Assert.*;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@ -26,26 +25,27 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/** /**
* @author Artur Konczak * @author Artur Konczak
* @author Peter-Josef Meisch
*/ */
@RunWith(SpringJUnit4ClassRunner.class) @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:elasticsearch-template-custom-mapper.xml") @ContextConfiguration("classpath:elasticsearch-template-custom-mapper.xml")
public class ElasticsearchTemplateCustomMapperTests { public class ElasticsearchTemplateCustomMapperTests {
@Autowired @Autowired private ElasticsearchTemplate elasticsearchTemplate;
private ElasticsearchTemplate elasticsearchTemplate;
@Autowired @Autowired private EntityMapper entityMapper;
private EntityMapper entityMapper;
@Autowired @Autowired private ResultsMapper resultsMapper;
private ResultsMapper resultsMapper;
@Test @Test
public void shouldUseCustomMapper() { public void shouldUseCustomMapper() {
//given
//when // given
//them
assertThat(elasticsearchTemplate.getResultsMapper(), is(resultsMapper)); // when
assertThat(elasticsearchTemplate.getResultsMapper().getEntityMapper(), is(entityMapper));
// then
assertThat(elasticsearchTemplate.getResultsMapper()).isSameAs(resultsMapper);
assertThat(elasticsearchTemplate.getResultsMapper().getEntityMapper()).isSameAs(entityMapper);
} }
} }

View File

@ -15,10 +15,9 @@
*/ */
package org.springframework.data.elasticsearch.core; package org.springframework.data.elasticsearch.core;
import static org.assertj.core.api.Assertions.*;
import static org.elasticsearch.common.xcontent.XContentFactory.*; import static org.elasticsearch.common.xcontent.XContentFactory.*;
import static org.elasticsearch.join.query.JoinQueryBuilders.hasChildQuery; import static org.elasticsearch.join.query.JoinQueryBuilders.*;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import java.util.List; import java.util.List;
@ -29,48 +28,46 @@ import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.QueryBuilders;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Ignore; import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.style.ToStringCreator;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import org.springframework.data.elasticsearch.annotations.Parent;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplateParentChildTests.ParentEntity.ChildEntity;
import org.springframework.data.elasticsearch.core.query.IndexQuery; import org.springframework.data.elasticsearch.core.query.IndexQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery; import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.UpdateQuery; import org.springframework.data.elasticsearch.core.query.UpdateQuery;
import org.springframework.data.elasticsearch.entities.ParentEntity; import org.springframework.data.elasticsearch.utils.IndexInitializer;
import org.springframework.data.elasticsearch.entities.ParentEntity.ChildEntity;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/** /**
* @author Philipp Jardas * @author Philipp Jardas
* @author Peter-Josef Meisch
*/ */
@Ignore(value = "DATAES-421")
@RunWith(SpringJUnit4ClassRunner.class) @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:elasticsearch-template-test.xml") @ContextConfiguration("classpath:elasticsearch-template-test.xml")
public class ElasticsearchTemplateParentChildTests { public class ElasticsearchTemplateParentChildTests {
@Autowired @Autowired private ElasticsearchTemplate elasticsearchTemplate;
private ElasticsearchTemplate elasticsearchTemplate;
@Before @Before
public void before() { public void before() {
clean();
elasticsearchTemplate.createIndex(ParentEntity.class);
elasticsearchTemplate.createIndex(ChildEntity.class);
elasticsearchTemplate.putMapping(ChildEntity.class);
}
@After IndexInitializer.init(elasticsearchTemplate, ParentEntity.class);
public void clean() { IndexInitializer.init(elasticsearchTemplate, ChildEntity.class);
elasticsearchTemplate.deleteIndex(ChildEntity.class);
elasticsearchTemplate.deleteIndex(ParentEntity.class);
} }
@Ignore(value = "DATAES-421") @Ignore(value = "DATAES-421")
@Test @Test
public void shouldIndexParentChildEntity() { public void shouldIndexParentChildEntity() {
// index two parents // index two parents
ParentEntity parent1 = index("parent1", "First Parent"); ParentEntity parent1 = index("parent1", "First Parent");
ParentEntity parent2 = index("parent2", "Second Parent"); ParentEntity parent2 = index("parent2", "Second Parent");
@ -84,16 +81,19 @@ public class ElasticsearchTemplateParentChildTests {
elasticsearchTemplate.refresh(ChildEntity.class); elasticsearchTemplate.refresh(ChildEntity.class);
// find all parents that have the first child // find all parents that have the first child
QueryBuilder query = hasChildQuery(ParentEntity.CHILD_TYPE, QueryBuilders.termQuery("name", child1name.toLowerCase()), ScoreMode.None); QueryBuilder query = hasChildQuery(ParentEntity.CHILD_TYPE,
QueryBuilders.termQuery("name", child1name.toLowerCase()), ScoreMode.None);
List<ParentEntity> parents = elasticsearchTemplate.queryForList(new NativeSearchQuery(query), ParentEntity.class); List<ParentEntity> parents = elasticsearchTemplate.queryForList(new NativeSearchQuery(query), ParentEntity.class);
// we're expecting only the first parent as result // we're expecting only the first parent as result
assertThat("parents", parents, contains(hasProperty("id", is(parent1.getId())))); assertThat(parents).hasSize(1);
assertThat(parents.get(0).getId()).isEqualTo(parent1.getId());
} }
@Ignore(value = "DATAES-421") @Ignore(value = "DATAES-421")
@Test @Test
public void shouldUpdateChild() throws Exception { public void shouldUpdateChild() throws Exception {
// index parent and child // index parent and child
ParentEntity parent = index("parent", "Parent"); ParentEntity parent = index("parent", "Parent");
ChildEntity child = index("child", parent.getId(), "Child"); ChildEntity child = index("child", parent.getId(), "Child");
@ -107,12 +107,13 @@ public class ElasticsearchTemplateParentChildTests {
updateRequest.doc(builder); updateRequest.doc(builder);
final UpdateResponse response = update(updateRequest); final UpdateResponse response = update(updateRequest);
assertThat(response.getShardInfo().getSuccessful(), is(1)); assertThat(response.getShardInfo().getSuccessful()).isEqualTo(1);
} }
@Ignore(value = "DATAES-421") @Ignore(value = "DATAES-421")
@Test(expected = RoutingMissingException.class) @Test(expected = RoutingMissingException.class)
public void shouldFailWithRoutingMissingExceptionOnUpdateChildIfNotRoutingSetOnUpdateRequest() throws Exception { public void shouldFailWithRoutingMissingExceptionOnUpdateChildIfNotRoutingSetOnUpdateRequest() throws Exception {
// index parent and child // index parent and child
ParentEntity parent = index("parent", "Parent"); ParentEntity parent = index("parent", "Parent");
ChildEntity child = index("child", parent.getId(), "Child"); ChildEntity child = index("child", parent.getId(), "Child");
@ -129,6 +130,7 @@ public class ElasticsearchTemplateParentChildTests {
@Ignore(value = "DATAES-421") @Ignore(value = "DATAES-421")
@Test(expected = RoutingMissingException.class) @Test(expected = RoutingMissingException.class)
public void shouldFailWithRoutingMissingExceptionOnUpdateChildIfRoutingOnlySetOnRequestDoc() throws Exception { public void shouldFailWithRoutingMissingExceptionOnUpdateChildIfRoutingOnlySetOnRequestDoc() throws Exception {
// index parent and child // index parent and child
ParentEntity parent = index("parent", "Parent"); ParentEntity parent = index("parent", "Parent");
ChildEntity child = index("child", parent.getId(), "Child"); ChildEntity child = index("child", parent.getId(), "Child");
@ -144,6 +146,7 @@ public class ElasticsearchTemplateParentChildTests {
} }
private ParentEntity index(String parentId, String name) { private ParentEntity index(String parentId, String name) {
ParentEntity parent = new ParentEntity(parentId, name); ParentEntity parent = new ParentEntity(parentId, name);
IndexQuery index = new IndexQuery(); IndexQuery index = new IndexQuery();
index.setId(parent.getId()); index.setId(parent.getId());
@ -154,6 +157,7 @@ public class ElasticsearchTemplateParentChildTests {
} }
private ChildEntity index(String childId, String parentId, String name) { private ChildEntity index(String childId, String parentId, String name) {
ChildEntity child = new ChildEntity(childId, parentId, name); ChildEntity child = new ChildEntity(childId, parentId, name);
IndexQuery index = new IndexQuery(); IndexQuery index = new IndexQuery();
index.setId(child.getId()); index.setId(child.getId());
@ -165,6 +169,7 @@ public class ElasticsearchTemplateParentChildTests {
} }
private UpdateResponse update(UpdateRequest updateRequest) { private UpdateResponse update(UpdateRequest updateRequest) {
final UpdateQuery update = new UpdateQuery(); final UpdateQuery update = new UpdateQuery();
update.setId(updateRequest.id()); update.setId(updateRequest.id());
update.setType(updateRequest.type()); update.setType(updateRequest.type());
@ -172,4 +177,76 @@ public class ElasticsearchTemplateParentChildTests {
update.setUpdateRequest(updateRequest); update.setUpdateRequest(updateRequest);
return elasticsearchTemplate.update(update); return elasticsearchTemplate.update(update);
} }
/**
* @author Philipp Jardas
* @author Mohsin Husen
*/
@Document(
indexName = org.springframework.data.elasticsearch.core.ElasticsearchTemplateParentChildTests.ParentEntity.INDEX,
type = org.springframework.data.elasticsearch.core.ElasticsearchTemplateParentChildTests.ParentEntity.PARENT_TYPE,
shards = 1, replicas = 0, refreshInterval = "-1")
static class ParentEntity {
public static final String INDEX = "parent-child";
public static final String PARENT_TYPE = "parent-entity";
public static final String CHILD_TYPE = "child-entity";
@Id private String id;
@Field(type = FieldType.Text, store = true) private String name;
public ParentEntity() {}
public ParentEntity(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
@Override
public String toString() {
return new ToStringCreator(this).append("id", id).append("name", name).toString();
}
@Document(indexName = INDEX, type = CHILD_TYPE, shards = 1, replicas = 0, refreshInterval = "-1")
static class ChildEntity {
@Id private String id;
@Field(type = FieldType.Text, store = true) @Parent(type = PARENT_TYPE) private String parentId;
@Field(type = FieldType.Text, store = true) private String name;
public ChildEntity() {}
public ChildEntity(String id, String parentId, String name) {
this.id = id;
this.parentId = parentId;
this.name = name;
}
public String getId() {
return id;
}
public String getParentId() {
return parentId;
}
public String getName() {
return name;
}
@Override
public String toString() {
return new ToStringCreator(this).append("id", id).append("parentId", parentId).append("name", name).toString();
}
}
}
} }

View File

@ -1,18 +1,53 @@
/*
* Copyright 2018-2019 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
*
* https://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.core; package org.springframework.data.elasticsearch.core;
import static org.apache.commons.lang.RandomStringUtils.*; import static org.apache.commons.lang.RandomStringUtils.*;
import static org.springframework.data.elasticsearch.annotations.FieldType.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import java.lang.Double;
import java.lang.Long;
import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.engine.DocumentMissingException; import org.elasticsearch.index.engine.DocumentMissingException;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Version;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.Score;
import org.springframework.data.elasticsearch.annotations.ScriptedField;
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
import org.springframework.data.elasticsearch.core.query.UpdateQuery; import org.springframework.data.elasticsearch.core.query.UpdateQuery;
import org.springframework.data.elasticsearch.core.query.UpdateQueryBuilder; import org.springframework.data.elasticsearch.core.query.UpdateQueryBuilder;
import org.springframework.data.elasticsearch.entities.SampleEntity;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @author Peter-Josef Meisch
*/
@RunWith(SpringJUnit4ClassRunner.class) @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:elasticsearch-template-test.xml") @ContextConfiguration("classpath:elasticsearch-template-test.xml")
public class ElasticsearchTransportTemplateTests extends ElasticsearchTemplateTests { public class ElasticsearchTransportTemplateTests extends ElasticsearchTemplateTests {
@ -22,8 +57,35 @@ public class ElasticsearchTransportTemplateTests extends ElasticsearchTemplateTe
// when // when
IndexRequest indexRequest = new IndexRequest(); IndexRequest indexRequest = new IndexRequest();
indexRequest.source("{}", XContentType.JSON); indexRequest.source("{}", XContentType.JSON);
UpdateQuery updateQuery = new UpdateQueryBuilder().withId(randomNumeric(5)) UpdateQuery updateQuery = new UpdateQueryBuilder().withId(randomNumeric(5)).withClass(SampleEntity.class)
.withClass(SampleEntity.class).withIndexRequest(indexRequest).build(); .withIndexRequest(indexRequest).build();
elasticsearchTemplate.update(updateQuery); elasticsearchTemplate.update(updateQuery);
} }
/**
* @author Rizwan Idrees
* @author Mohsin Husen
* @author Chris White
* @author Sascha Woo
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Builder
@Document(indexName = "test-index-sample-core-transport-template", type = "test-type", shards = 1, replicas = 0, refreshInterval = "-1")
static class SampleEntity {
@Id private String id;
@Field(type = Text, store = true, fielddata = true) private String type;
@Field(type = Text, store = true, fielddata = true) private String message;
private int rate;
@ScriptedField private Double scriptedRate;
private boolean available;
private String highlightedMessage;
private GeoPoint location;
@Version private Long version;
@Score private float score;
}
} }

View File

@ -15,14 +15,14 @@
*/ */
package org.springframework.data.elasticsearch.core; package org.springframework.data.elasticsearch.core;
import static org.assertj.core.api.Assertions.*;
import static org.elasticsearch.index.query.QueryBuilders.*; import static org.elasticsearch.index.query.QueryBuilders.*;
import static org.hamcrest.Matchers.*; import static org.springframework.data.elasticsearch.annotations.FieldType.*;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.*;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date;
import java.util.List; import java.util.List;
import org.elasticsearch.action.search.SearchPhaseExecutionException; import org.elasticsearch.action.search.SearchPhaseExecutionException;
@ -30,11 +30,13 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.facet.LogEntity; import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.core.facet.LogEntityBuilder; import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.core.query.IndexQuery; import org.springframework.data.elasticsearch.core.query.IndexQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.query.SearchQuery; import org.springframework.data.elasticsearch.core.query.SearchQuery;
import org.springframework.data.elasticsearch.utils.IndexInitializer;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@ -43,79 +45,188 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
* *
* @author Artur Konczak * @author Artur Konczak
* @author Mohsin Husen * @author Mohsin Husen
* @author Peter-Josef Meisch
*/ */
@RunWith(SpringJUnit4ClassRunner.class) @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:elasticsearch-template-test.xml") @ContextConfiguration("classpath:elasticsearch-template-test.xml")
public class LogEntityTests { public class LogEntityTests {
@Autowired @Autowired private ElasticsearchTemplate template;
private ElasticsearchTemplate template;
@Before @Before
public void before() throws ParseException { public void before() throws ParseException {
template.deleteIndex(LogEntity.class);
template.createIndex(LogEntity.class); IndexInitializer.init(template, LogEntity.class);
template.putMapping(LogEntity.class);
SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm"); SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm");
IndexQuery indexQuery1 = new LogEntityBuilder("1").action("update").date(dateFormatter.parse("2013-10-18 18:01")).code(2) IndexQuery indexQuery1 = new LogEntityBuilder("1").action("update").date(dateFormatter.parse("2013-10-18 18:01"))
.ip("10.10.10.1").buildIndex(); .code(2).ip("10.10.10.1").buildIndex();
IndexQuery indexQuery2 = new LogEntityBuilder("2").action("update").date(dateFormatter.parse("2013-10-19 18:02")).code(2) IndexQuery indexQuery2 = new LogEntityBuilder("2").action("update").date(dateFormatter.parse("2013-10-19 18:02"))
.ip("10.10.10.2").buildIndex(); .code(2).ip("10.10.10.2").buildIndex();
IndexQuery indexQuery3 = new LogEntityBuilder("3").action("update").date(dateFormatter.parse("2013-10-19 18:03")).code(2) IndexQuery indexQuery3 = new LogEntityBuilder("3").action("update").date(dateFormatter.parse("2013-10-19 18:03"))
.ip("10.10.10.3").buildIndex(); .code(2).ip("10.10.10.3").buildIndex();
IndexQuery indexQuery4 = new LogEntityBuilder("4").action("update").date(dateFormatter.parse("2013-10-19 18:04")).code(2) IndexQuery indexQuery4 = new LogEntityBuilder("4").action("update").date(dateFormatter.parse("2013-10-19 18:04"))
.ip("10.10.10.4").buildIndex(); .code(2).ip("10.10.10.4").buildIndex();
template.bulkIndex(Arrays.asList(indexQuery1, indexQuery2, indexQuery3, indexQuery4)); template.bulkIndex(Arrays.asList(indexQuery1, indexQuery2, indexQuery3, indexQuery4));
template.refresh(LogEntity.class); template.refresh(LogEntity.class);
} }
/* @Test // DATAES-66
DATAES-66 public void shouldIndexGivenLogEntityWithIPFieldType() {
*/
@Test
public void shouldIndexGivenLogEntityWithIPFieldType() throws ParseException {
//when
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(termQuery("ip", "10.10.10.1")).build();
// when
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("ip", "10.10.10.1")).build();
List<LogEntity> entities = template.queryForList(searchQuery, LogEntity.class); List<LogEntity> entities = template.queryForList(searchQuery, LogEntity.class);
//then
assertThat(entities, is(notNullValue())); // then
assertThat(entities.size(), is(1)); assertThat(entities).isNotNull().hasSize(1);
} }
/* @Test(expected = SearchPhaseExecutionException.class) // DATAES-66
DATAES-66
*/
@Test(expected = SearchPhaseExecutionException.class)
public void shouldThrowExceptionWhenInvalidIPGivenForSearchQuery() { public void shouldThrowExceptionWhenInvalidIPGivenForSearchQuery() {
//when
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(termQuery("ip", "10.10.10")).build();
// when
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("ip", "10.10.10")).build();
List<LogEntity> entities = template.queryForList(searchQuery, LogEntity.class); List<LogEntity> entities = template.queryForList(searchQuery, LogEntity.class);
//then
assertThat(entities, is(notNullValue())); // then
assertThat(entities.size(), is(1)); assertThat(entities).isNotNull().hasSize(1);
} }
/* @Test // DATAES-66
DATAES-66
*/
@Test
public void shouldReturnLogsForGivenIPRanges() { public void shouldReturnLogsForGivenIPRanges() {
//when
// when
SearchQuery searchQuery = new NativeSearchQueryBuilder() SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(rangeQuery("ip").from("10.10.10.1").to("10.10.10.3")).build(); .withQuery(rangeQuery("ip").from("10.10.10.1").to("10.10.10.3")).build();
List<LogEntity> entities = template.queryForList(searchQuery, LogEntity.class); List<LogEntity> entities = template.queryForList(searchQuery, LogEntity.class);
//then
assertThat(entities, is(notNullValue())); // then
assertThat(entities.size(), is(3)); assertThat(entities).isNotNull().hasSize(3);
}
/**
* Simple type to test facets
*
* @author Artur Konczak
* @author Mohsin Husen
*/
@Document(indexName = "test-index-log-core", type = "test-log-type", shards = 1, replicas = 0, refreshInterval = "-1")
static class LogEntity {
private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
@Id private String id;
private String action;
private long sequenceCode;
@Field(type = Ip) private String ip;
@Field(type = Date) private java.util.Date date;
private LogEntity() {}
public LogEntity(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getAction() {
return action;
}
public String toString() {
return new StringBuffer().append("{id:").append(id).append(",action:").append(action).append(",code:")
.append(sequenceCode).append(",date:").append(format.format(date)).append("}").toString();
}
public void setAction(String action) {
this.action = action;
}
public long getSequenceCode() {
return sequenceCode;
}
public void setSequenceCode(long sequenceCode) {
this.sequenceCode = sequenceCode;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
/**
* Simple type to test facets
*
* @author Artur Konczak
* @author Mohsin Husen
*/
static class LogEntityBuilder {
private LogEntity result;
public LogEntityBuilder(String id) {
result = new LogEntity(id);
}
public LogEntityBuilder action(String action) {
result.setAction(action);
return this;
}
public LogEntityBuilder code(long sequenceCode) {
result.setSequenceCode(sequenceCode);
return this;
}
public LogEntityBuilder date(Date date) {
result.setDate(date);
return this;
}
public LogEntityBuilder ip(String ip) {
result.setIp(ip);
return this;
}
public LogEntity build() {
return result;
}
public IndexQuery buildIndex() {
IndexQuery indexQuery = new IndexQuery();
indexQuery.setId(result.getId());
indexQuery.setObject(result);
return indexQuery;
}
} }
} }

View File

@ -16,48 +16,58 @@
package org.springframework.data.elasticsearch.core; package org.springframework.data.elasticsearch.core;
import static org.assertj.core.api.Assertions.*;
import static org.elasticsearch.index.query.QueryBuilders.*; import static org.elasticsearch.index.query.QueryBuilders.*;
import static org.hamcrest.CoreMatchers.*; import static org.skyscreamer.jsonassert.JSONAssert.*;
import static org.junit.Assert.*; import static org.springframework.data.elasticsearch.annotations.FieldType.*;
import static org.skyscreamer.jsonassert.JSONAssert.assertEquals;
import static org.springframework.data.elasticsearch.utils.IndexBuilder.*; import static org.springframework.data.elasticsearch.utils.IndexBuilder.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.io.IOException; import java.io.IOException;
import java.lang.Boolean;
import java.lang.Integer;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import org.assertj.core.data.Percentage;
import org.json.JSONException; import org.json.JSONException;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Transient;
import org.springframework.data.elasticsearch.annotations.CompletionField; import org.springframework.data.elasticsearch.annotations.CompletionField;
import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType; import org.springframework.data.elasticsearch.annotations.FieldType;
import org.springframework.data.elasticsearch.annotations.GeoPointField;
import org.springframework.data.elasticsearch.annotations.InnerField; import org.springframework.data.elasticsearch.annotations.InnerField;
import org.springframework.data.elasticsearch.annotations.Mapping; import org.springframework.data.elasticsearch.annotations.Mapping;
import org.springframework.data.elasticsearch.annotations.MultiField; import org.springframework.data.elasticsearch.annotations.MultiField;
import org.springframework.data.elasticsearch.annotations.Parent; import org.springframework.data.elasticsearch.annotations.Parent;
import org.springframework.data.elasticsearch.builder.SampleInheritedEntityBuilder; import org.springframework.data.elasticsearch.annotations.Setting;
import org.springframework.data.elasticsearch.core.completion.Completion; import org.springframework.data.elasticsearch.core.completion.Completion;
import org.springframework.data.elasticsearch.core.geo.GeoPoint; import org.springframework.data.elasticsearch.core.geo.GeoPoint;
import org.springframework.data.elasticsearch.core.query.IndexQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.query.SearchQuery; import org.springframework.data.elasticsearch.core.query.SearchQuery;
import org.springframework.data.elasticsearch.entities.Book; import org.springframework.data.geo.Box;
import org.springframework.data.elasticsearch.entities.CopyToEntity; import org.springframework.data.geo.Circle;
import org.springframework.data.elasticsearch.entities.GeoEntity; import org.springframework.data.geo.Point;
import org.springframework.data.elasticsearch.entities.Group; import org.springframework.data.geo.Polygon;
import org.springframework.data.elasticsearch.entities.NormalizerEntity;
import org.springframework.data.elasticsearch.entities.SampleInheritedEntity;
import org.springframework.data.elasticsearch.entities.SampleTransientEntity;
import org.springframework.data.elasticsearch.entities.SimpleRecursiveEntity;
import org.springframework.data.elasticsearch.entities.StockPrice;
import org.springframework.data.elasticsearch.entities.User;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@ -77,9 +87,23 @@ public class MappingBuilderTests extends MappingContextBaseTests {
@Autowired private ElasticsearchTemplate elasticsearchTemplate; @Autowired private ElasticsearchTemplate elasticsearchTemplate;
@Before
public void before() {
elasticsearchTemplate.deleteIndex(StockPrice.class);
elasticsearchTemplate.deleteIndex(SimpleRecursiveEntity.class);
elasticsearchTemplate.deleteIndex(StockPrice.class);
elasticsearchTemplate.deleteIndex(SampleInheritedEntity.class);
elasticsearchTemplate.deleteIndex(User.class);
elasticsearchTemplate.deleteIndex(Group.class);
elasticsearchTemplate.deleteIndex(Book.class);
elasticsearchTemplate.deleteIndex(NormalizerEntity.class);
elasticsearchTemplate.deleteIndex(CopyToEntity.class);
}
@Test @Test
public void shouldNotFailOnCircularReference() { public void shouldNotFailOnCircularReference() {
elasticsearchTemplate.deleteIndex(SimpleRecursiveEntity.class);
elasticsearchTemplate.createIndex(SimpleRecursiveEntity.class); elasticsearchTemplate.createIndex(SimpleRecursiveEntity.class);
elasticsearchTemplate.putMapping(SimpleRecursiveEntity.class); elasticsearchTemplate.putMapping(SimpleRecursiveEntity.class);
elasticsearchTemplate.refresh(SimpleRecursiveEntity.class); elasticsearchTemplate.refresh(SimpleRecursiveEntity.class);
@ -115,7 +139,6 @@ public class MappingBuilderTests extends MappingContextBaseTests {
// Given // Given
// When // When
elasticsearchTemplate.deleteIndex(StockPrice.class);
elasticsearchTemplate.createIndex(StockPrice.class); elasticsearchTemplate.createIndex(StockPrice.class);
elasticsearchTemplate.putMapping(StockPrice.class); elasticsearchTemplate.putMapping(StockPrice.class);
String symbol = "AU"; String symbol = "AU";
@ -128,11 +151,12 @@ public class MappingBuilderTests extends MappingContextBaseTests {
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build();
List<StockPrice> result = elasticsearchTemplate.queryForList(searchQuery, StockPrice.class); List<StockPrice> result = elasticsearchTemplate.queryForList(searchQuery, StockPrice.class);
// Then // Then
assertThat(result.size(), is(1)); assertThat(result).hasSize(1);
StockPrice entry = result.get(0); StockPrice entry = result.get(0);
assertThat(entry.getSymbol(), is(symbol)); assertThat(entry.getSymbol()).isEqualTo(symbol);
assertThat(entry.getPrice(), is(BigDecimal.valueOf(price))); assertThat(entry.getPrice()).isCloseTo(BigDecimal.valueOf(price), Percentage.withPercentage(0.01));
} }
@Test // DATAES-568 @Test // DATAES-568
@ -160,10 +184,9 @@ public class MappingBuilderTests extends MappingContextBaseTests {
@Test // DATAES-76 @Test // DATAES-76
public void shouldAddSampleInheritedEntityDocumentToIndex() { public void shouldAddSampleInheritedEntityDocumentToIndex() {
// Given // given
// When // when
elasticsearchTemplate.deleteIndex(SampleInheritedEntity.class);
elasticsearchTemplate.createIndex(SampleInheritedEntity.class); elasticsearchTemplate.createIndex(SampleInheritedEntity.class);
elasticsearchTemplate.putMapping(SampleInheritedEntity.class); elasticsearchTemplate.putMapping(SampleInheritedEntity.class);
Date createdDate = new Date(); Date createdDate = new Date();
@ -175,12 +198,13 @@ public class MappingBuilderTests extends MappingContextBaseTests {
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build();
List<SampleInheritedEntity> result = elasticsearchTemplate.queryForList(searchQuery, SampleInheritedEntity.class); List<SampleInheritedEntity> result = elasticsearchTemplate.queryForList(searchQuery, SampleInheritedEntity.class);
// Then
assertThat(result.size(), is(1)); // then
assertThat(result).hasSize(1);
SampleInheritedEntity entry = result.get(0); SampleInheritedEntity entry = result.get(0);
assertThat(entry.getCreatedDate(), is(createdDate)); assertThat(entry.getCreatedDate()).isEqualTo(createdDate);
assertThat(entry.getMessage(), is(message)); assertThat(entry.getMessage()).isEqualTo(message);
} }
@Test // DATAES-568 @Test // DATAES-568
@ -207,6 +231,7 @@ public class MappingBuilderTests extends MappingContextBaseTests {
elasticsearchTemplate.putMapping(User.class); elasticsearchTemplate.putMapping(User.class);
elasticsearchTemplate.createIndex(Group.class); elasticsearchTemplate.createIndex(Group.class);
elasticsearchTemplate.putMapping(Group.class); elasticsearchTemplate.putMapping(Group.class);
// when // when
// then // then
@ -218,7 +243,9 @@ public class MappingBuilderTests extends MappingContextBaseTests {
// given // given
elasticsearchTemplate.createIndex(Book.class); elasticsearchTemplate.createIndex(Book.class);
elasticsearchTemplate.putMapping(Book.class); elasticsearchTemplate.putMapping(Book.class);
// when // when
// then // then
} }
@ -226,7 +253,6 @@ public class MappingBuilderTests extends MappingContextBaseTests {
public void shouldUseBothAnalyzer() { public void shouldUseBothAnalyzer() {
// given // given
elasticsearchTemplate.deleteIndex(Book.class);
elasticsearchTemplate.createIndex(Book.class); elasticsearchTemplate.createIndex(Book.class);
elasticsearchTemplate.putMapping(Book.class); elasticsearchTemplate.putMapping(Book.class);
@ -236,19 +262,18 @@ public class MappingBuilderTests extends MappingContextBaseTests {
Map prefixDescription = (Map) ((Map) descriptionMapping.get("fields")).get("prefix"); Map prefixDescription = (Map) ((Map) descriptionMapping.get("fields")).get("prefix");
// then // then
assertThat(prefixDescription.size(), is(3)); assertThat(prefixDescription).hasSize(3);
assertThat(prefixDescription.get("type"), equalTo("text")); assertThat(prefixDescription.get("type")).isEqualTo("text");
assertThat(prefixDescription.get("analyzer"), equalTo("stop")); assertThat(prefixDescription.get("analyzer")).isEqualTo("stop");
assertThat(prefixDescription.get("search_analyzer"), equalTo("standard")); assertThat(prefixDescription.get("search_analyzer")).isEqualTo("standard");
assertThat(descriptionMapping.get("type"), equalTo("text")); assertThat(descriptionMapping.get("type")).isEqualTo("text");
assertThat(descriptionMapping.get("analyzer"), equalTo("whitespace")); assertThat(descriptionMapping.get("analyzer")).isEqualTo("whitespace");
} }
@Test // DATAES-492 @Test // DATAES-492
public void shouldUseKeywordNormalizer() { public void shouldUseKeywordNormalizer() {
// given // given
elasticsearchTemplate.deleteIndex(NormalizerEntity.class);
elasticsearchTemplate.createIndex(NormalizerEntity.class); elasticsearchTemplate.createIndex(NormalizerEntity.class);
elasticsearchTemplate.putMapping(NormalizerEntity.class); elasticsearchTemplate.putMapping(NormalizerEntity.class);
@ -259,17 +284,16 @@ public class MappingBuilderTests extends MappingContextBaseTests {
Map fieldDescriptionLowerCase = (Map) ((Map) ((Map) properties.get("description")).get("fields")).get("lower_case"); Map fieldDescriptionLowerCase = (Map) ((Map) ((Map) properties.get("description")).get("fields")).get("lower_case");
// then // then
assertThat(fieldName.get("type"), equalTo("keyword")); assertThat(fieldName.get("type")).isEqualTo("keyword");
assertThat(fieldName.get("normalizer"), equalTo("lower_case_normalizer")); assertThat(fieldName.get("normalizer")).isEqualTo("lower_case_normalizer");
assertThat(fieldDescriptionLowerCase.get("type"), equalTo("keyword")); assertThat(fieldDescriptionLowerCase.get("type")).isEqualTo("keyword");
assertThat(fieldDescriptionLowerCase.get("normalizer"), equalTo("lower_case_normalizer")); assertThat(fieldDescriptionLowerCase.get("normalizer")).isEqualTo("lower_case_normalizer");
} }
@Test // DATAES-503 @Test // DATAES-503
public void shouldUseCopyTo() { public void shouldUseCopyTo() {
// given // given
elasticsearchTemplate.deleteIndex(CopyToEntity.class);
elasticsearchTemplate.createIndex(CopyToEntity.class); elasticsearchTemplate.createIndex(CopyToEntity.class);
elasticsearchTemplate.putMapping(CopyToEntity.class); elasticsearchTemplate.putMapping(CopyToEntity.class);
@ -281,8 +305,8 @@ public class MappingBuilderTests extends MappingContextBaseTests {
// then // then
List<String> copyToValue = Collections.singletonList("name"); List<String> copyToValue = Collections.singletonList("name");
assertThat(fieldFirstName.get("copy_to"), equalTo(copyToValue)); assertThat(fieldFirstName.get("copy_to")).isEqualTo(copyToValue);
assertThat(fieldLastName.get("copy_to"), equalTo(copyToValue)); assertThat(fieldLastName.get("copy_to")).isEqualTo(copyToValue);
} }
@Test // DATAES-568 @Test // DATAES-568
@ -455,7 +479,7 @@ public class MappingBuilderTests extends MappingContextBaseTests {
/** /**
* MinimalChildEntity * MinimalChildEntity
* *
* @author Peter-josef Meisch * @author Peter-Josef Meisch
*/ */
@Document(indexName = "test-index-minimal", type = "mapping") @Document(indexName = "test-index-minimal", type = "mapping")
static class MinimalChildEntity { static class MinimalChildEntity {
@ -464,4 +488,303 @@ public class MappingBuilderTests extends MappingContextBaseTests {
@Parent(type = "parentType") private String parentId; @Parent(type = "parentType") private String parentId;
} }
/**
* @author Rizwan Idrees
* @author Mohsin Husen
* @author Nordine Bittich
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Document(indexName = "test-index-book-mapping-builder", type = "book", shards = 1, replicas = 0, refreshInterval = "-1")
static class Book {
@Id private String id;
private String name;
@Field(type = FieldType.Object) private Author author;
@Field(type = FieldType.Nested) private Map<Integer, Collection<String>> buckets = new HashMap<>();
@MultiField(mainField = @Field(type = FieldType.Text, analyzer = "whitespace"),
otherFields = { @InnerField(suffix = "prefix", type = FieldType.Text, analyzer = "stop",
searchAnalyzer = "standard") }) private String description;
}
/**
* @author Stuart Stevenson
* @author Mohsin Husen
*/
@Document(indexName = "test-index-simple-recursive-mapping-builder", type = "circular-object", shards = 1, replicas = 0,
refreshInterval = "-1")
static class SimpleRecursiveEntity {
@Id private String id;
@Field(type = FieldType.Object, ignoreFields = { "circularObject" }) private SimpleRecursiveEntity circularObject;
}
/**
* @author Sascha Woo
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Document(indexName = "test-copy-to-mapping-builder", type = "test", shards = 1, replicas = 0, refreshInterval = "-1")
static class CopyToEntity {
@Id private String id;
@Field(type = FieldType.Keyword, copyTo = "name") private String firstName;
@Field(type = FieldType.Keyword, copyTo = "name") private String lastName;
@Field(type = FieldType.Keyword) private String name;
}
/**
* @author Sascha Woo
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Document(indexName = "test-index-normalizer-mapping-builder", type = "test", shards = 1, replicas = 0, refreshInterval = "-1")
@Setting(settingPath = "/settings/test-normalizer.json")
static class NormalizerEntity {
@Id private String id;
@Field(type = FieldType.Keyword, normalizer = "lower_case_normalizer") private String name;
@MultiField(mainField = @Field(type = FieldType.Text), otherFields = { @InnerField(suffix = "lower_case",
type = FieldType.Keyword, normalizer = "lower_case_normalizer") }) private String description;
}
/**
* @author Rizwan Idrees
* @author Mohsin Husen
*/
static class Author {
private String id;
private String name;
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;
}
}
/**
* @author Kevin Leturc
*/
@Document(indexName = "test-index-sample-inherited-mapping-builder", type = "mapping", shards = 1, replicas = 0,
refreshInterval = "-1")
static class SampleInheritedEntity extends AbstractInheritedEntity {
@Field(type = Text, index = false, store = true, analyzer = "standard") private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
/**
* @author Kevin Leturc
*/
static class SampleInheritedEntityBuilder {
private SampleInheritedEntity result;
public SampleInheritedEntityBuilder(String id) {
result = new SampleInheritedEntity();
result.setId(id);
}
public SampleInheritedEntityBuilder createdDate(Date createdDate) {
result.setCreatedDate(createdDate);
return this;
}
public SampleInheritedEntityBuilder message(String message) {
result.setMessage(message);
return this;
}
public SampleInheritedEntity build() {
return result;
}
public IndexQuery buildIndex() {
IndexQuery indexQuery = new IndexQuery();
indexQuery.setId(result.getId());
indexQuery.setObject(result);
return indexQuery;
}
}
/**
* @author Artur Konczak
* @author Mohsin Husen
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Document(indexName = "test-index-stock-mapping-builder", type = "price", shards = 1, replicas = 0, refreshInterval = "-1")
static class StockPrice {
@Id private String id;
private String symbol;
@Field(type = FieldType.Double) private BigDecimal price;
}
/**
* @author Kevin Letur
*/
static class AbstractInheritedEntity {
@Id private String id;
@Field(type = FieldType.Date, index = false) private Date createdDate;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Date getCreatedDate() {
return createdDate;
}
public void setCreatedDate(Date createdDate) {
this.createdDate = createdDate;
}
}
/**
* @author Jakub Vavrik
*/
@Document(indexName = "test-index-recursive-mapping-mapping-builder", type = "mapping", shards = 1, replicas = 0,
refreshInterval = "-1")
static class SampleTransientEntity {
@Id private String id;
@Field(type = Text, index = false, store = true, analyzer = "standard") private String message;
@Transient private SampleTransientEntity.NestedEntity nested;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
static class NestedEntity {
@Field private static SampleTransientEntity.NestedEntity someField = new SampleTransientEntity.NestedEntity();
@Field private Boolean something;
public SampleTransientEntity.NestedEntity getSomeField() {
return someField;
}
public void setSomeField(SampleTransientEntity.NestedEntity someField) {
this.someField = someField;
}
public Boolean getSomething() {
return something;
}
public void setSomething(Boolean something) {
this.something = something;
}
}
}
/**
* @author Artur Konczak
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Document(indexName = "test-index-geo-mapping-builder", type = "geo-test-index", shards = 1, replicas = 0, refreshInterval = "-1")
static 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;
}
/**
* Created by akonczak on 21/08/2016.
*/
@Document(indexName = "test-index-user-mapping-builder", type = "user")
static class User {
@Id private String id;
@Field(type = FieldType.Nested, ignoreFields = { "users" }) private Set<Group> groups = new HashSet<>();
}
/**
* Created by akonczak on 21/08/2016.
*/
@Document(indexName = "test-index-group-mapping-builder", type = "group")
static class Group {
@Id String id;
@Field(type = FieldType.Nested, ignoreFields = { "groups" }) private Set<User> users = new HashSet<>();
}
} }

View File

@ -15,9 +15,6 @@
package org.springframework.data.elasticsearch.core; package org.springframework.data.elasticsearch.core;
import java.util.Collection;
import java.util.Collections;
import org.springframework.data.elasticsearch.config.ElasticsearchConfigurationSupport; import org.springframework.data.elasticsearch.config.ElasticsearchConfigurationSupport;
import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter; import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter;
import org.springframework.data.elasticsearch.core.convert.MappingElasticsearchConverter; import org.springframework.data.elasticsearch.core.convert.MappingElasticsearchConverter;
@ -37,13 +34,8 @@ abstract class MappingContextBaseTests {
private SimpleElasticsearchMappingContext setupMappingContext() { private SimpleElasticsearchMappingContext setupMappingContext() {
SimpleElasticsearchMappingContext mappingContext = new ElasticsearchConfigurationSupport() { SimpleElasticsearchMappingContext mappingContext = new ElasticsearchConfigurationSupport() {}
@Override .elasticsearchMappingContext();
protected Collection<String> getMappingBasePackages() {
return Collections.singletonList("org.springframework.data.elasticsearch.entities.mapping");
}
}.elasticsearchMappingContext();
mappingContext.initialize(); mappingContext.initialize();
return mappingContext; return mappingContext;
} }

View File

@ -17,13 +17,21 @@ package org.springframework.data.elasticsearch.core;
import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.*;
import static org.elasticsearch.index.query.QueryBuilders.*; import static org.elasticsearch.index.query.QueryBuilders.*;
import static org.springframework.data.elasticsearch.annotations.FieldType.*;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import reactor.test.StepVerifier; import reactor.test.StepVerifier;
import java.lang.Double;
import java.lang.Long;
import java.lang.Object;
import java.net.ConnectException; import java.net.ConnectException;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
@ -39,10 +47,10 @@ import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.dao.DataAccessResourceFailureException; import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Version;
import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
@ -50,6 +58,10 @@ import org.springframework.data.elasticsearch.ElasticsearchVersion;
import org.springframework.data.elasticsearch.ElasticsearchVersionRule; import org.springframework.data.elasticsearch.ElasticsearchVersionRule;
import org.springframework.data.elasticsearch.TestUtils; import org.springframework.data.elasticsearch.TestUtils;
import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.Score;
import org.springframework.data.elasticsearch.annotations.ScriptedField;
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
import org.springframework.data.elasticsearch.core.query.Criteria; import org.springframework.data.elasticsearch.core.query.Criteria;
import org.springframework.data.elasticsearch.core.query.CriteriaQuery; import org.springframework.data.elasticsearch.core.query.CriteriaQuery;
import org.springframework.data.elasticsearch.core.query.IndexQuery; import org.springframework.data.elasticsearch.core.query.IndexQuery;
@ -57,7 +69,6 @@ import org.springframework.data.elasticsearch.core.query.IndexQueryBuilder;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.query.SearchQuery; import org.springframework.data.elasticsearch.core.query.SearchQuery;
import org.springframework.data.elasticsearch.core.query.StringQuery; import org.springframework.data.elasticsearch.core.query.StringQuery;
import org.springframework.data.elasticsearch.entities.SampleEntity;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
@ -68,6 +79,7 @@ import org.springframework.util.StringUtils;
* @author Christoph Strobl * @author Christoph Strobl
* @author Mark Paluch * @author Mark Paluch
* @currentRead Golden Fool - Robin Hobb * @currentRead Golden Fool - Robin Hobb
* @author Peter-Josef Meisch
*/ */
@RunWith(SpringRunner.class) @RunWith(SpringRunner.class)
@ContextConfiguration("classpath:infrastructure.xml") @ContextConfiguration("classpath:infrastructure.xml")
@ -75,7 +87,7 @@ public class ReactiveElasticsearchTemplateTests {
public @Rule ElasticsearchVersionRule elasticsearchVersion = ElasticsearchVersionRule.any(); public @Rule ElasticsearchVersionRule elasticsearchVersion = ElasticsearchVersionRule.any();
static final String DEFAULT_INDEX = "test-index-sample"; static final String DEFAULT_INDEX = "reactive-template-test-index";
static final String ALTERNATE_INDEX = "reactive-template-tests-alternate-index"; static final String ALTERNATE_INDEX = "reactive-template-tests-alternate-index";
private ElasticsearchRestTemplate restTemplate; private ElasticsearchRestTemplate restTemplate;
@ -676,4 +688,74 @@ public class ReactiveElasticsearchTemplateTests {
static class Message { static class Message {
String message; String message;
} }
/**
* @author Rizwan Idrees
* @author Mohsin Husen
* @author Chris White
* @author Sascha Woo
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Builder
@Document(indexName = DEFAULT_INDEX, type = "test-type", shards = 1, replicas = 0, refreshInterval = "-1")
static class SampleEntity {
@Id private String id;
@Field(type = Text, store = true, fielddata = true) private String type;
@Field(type = Text, store = true, fielddata = true) private String message;
private int rate;
@ScriptedField private Double scriptedRate;
private boolean available;
private String highlightedMessage;
private GeoPoint location;
@Version private Long version;
@Score private float score;
@Override
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 (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() {
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;
}
}
} }

View File

@ -18,13 +18,21 @@ package org.springframework.data.elasticsearch.core;
import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.*;
import static org.elasticsearch.action.search.SearchRequest.*; import static org.elasticsearch.action.search.SearchRequest.*;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
import static org.springframework.data.elasticsearch.annotations.FieldType.*;
import org.springframework.data.domain.PageRequest; import lombok.AllArgsConstructor;
import org.springframework.data.domain.Pageable; import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import reactor.core.publisher.Flux; import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import reactor.test.StepVerifier; import reactor.test.StepVerifier;
import java.lang.Double;
import java.lang.Long;
import java.lang.Object;
import java.util.Collections; import java.util.Collections;
import org.elasticsearch.action.delete.DeleteRequest; import org.elasticsearch.action.delete.DeleteRequest;
@ -41,15 +49,24 @@ import org.mockito.ArgumentCaptor;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule; import org.mockito.junit.MockitoRule;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Version;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.Score;
import org.springframework.data.elasticsearch.annotations.ScriptedField;
import org.springframework.data.elasticsearch.client.reactive.ReactiveElasticsearchClient; import org.springframework.data.elasticsearch.client.reactive.ReactiveElasticsearchClient;
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
import org.springframework.data.elasticsearch.core.query.Criteria; import org.springframework.data.elasticsearch.core.query.Criteria;
import org.springframework.data.elasticsearch.core.query.CriteriaQuery; import org.springframework.data.elasticsearch.core.query.CriteriaQuery;
import org.springframework.data.elasticsearch.core.query.StringQuery; import org.springframework.data.elasticsearch.core.query.StringQuery;
import org.springframework.data.elasticsearch.entities.SampleEntity;
/** /**
* @author Christoph Strobl * @author Christoph Strobl
* @currentRead Fool's Fate - Robin Hobb * @currentRead Fool's Fate - Robin Hobb
* @author Peter-Josef Meisch
*/ */
public class ReactiveElasticsearchTemplateUnitTests { public class ReactiveElasticsearchTemplateUnitTests {
@ -61,6 +78,7 @@ public class ReactiveElasticsearchTemplateUnitTests {
@Before @Before
public void setUp() { public void setUp() {
template = new ReactiveElasticsearchTemplate(client); template = new ReactiveElasticsearchTemplate(client);
} }
@ -126,7 +144,6 @@ public class ReactiveElasticsearchTemplateUnitTests {
ArgumentCaptor<SearchRequest> captor = ArgumentCaptor.forClass(SearchRequest.class); ArgumentCaptor<SearchRequest> captor = ArgumentCaptor.forClass(SearchRequest.class);
when(client.search(captor.capture())).thenReturn(Flux.empty()); when(client.search(captor.capture())).thenReturn(Flux.empty());
template.find(new CriteriaQuery(new Criteria("*")).setPageable(PageRequest.of(2, 50)), SampleEntity.class) // template.find(new CriteriaQuery(new Criteria("*")).setPageable(PageRequest.of(2, 50)), SampleEntity.class) //
.as(StepVerifier::create) // .as(StepVerifier::create) //
.verifyComplete(); .verifyComplete();
@ -141,7 +158,6 @@ public class ReactiveElasticsearchTemplateUnitTests {
ArgumentCaptor<SearchRequest> captor = ArgumentCaptor.forClass(SearchRequest.class); ArgumentCaptor<SearchRequest> captor = ArgumentCaptor.forClass(SearchRequest.class);
when(client.scroll(captor.capture())).thenReturn(Flux.empty()); when(client.scroll(captor.capture())).thenReturn(Flux.empty());
template.find(new CriteriaQuery(new Criteria("*")).setPageable(Pageable.unpaged()), SampleEntity.class) // template.find(new CriteriaQuery(new Criteria("*")).setPageable(Pageable.unpaged()), SampleEntity.class) //
.as(StepVerifier::create) // .as(StepVerifier::create) //
.verifyComplete(); .verifyComplete();
@ -232,4 +248,74 @@ public class ReactiveElasticsearchTemplateUnitTests {
assertThat(captor.getValue().indicesOptions()).isEqualTo(IndicesOptions.LENIENT_EXPAND_OPEN); assertThat(captor.getValue().indicesOptions()).isEqualTo(IndicesOptions.LENIENT_EXPAND_OPEN);
} }
/**
* @author Rizwan Idrees
* @author Mohsin Husen
* @author Chris White
* @author Sascha Woo
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Builder
@Document(indexName = "test-index-sample-core-reactive-template-Unit", type = "test-type", shards = 1, replicas = 0, refreshInterval = "-1")
static class SampleEntity {
@Id private String id;
@Field(type = Text, store = true, fielddata = true) private String type;
@Field(type = Text, store = true, fielddata = true) private String message;
private int rate;
@ScriptedField private Double scriptedRate;
private boolean available;
private String highlightedMessage;
private GeoPoint location;
@Version private Long version;
@Score private float score;
@Override
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 (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() {
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;
}
}
} }

View File

@ -3,12 +3,16 @@ package org.springframework.data.elasticsearch.core;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.entities.SampleDynamicTemplatesEntity; import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.entities.SampleDynamicTemplatesEntityTwo; import org.springframework.data.elasticsearch.annotations.DynamicTemplates;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@ -48,4 +52,31 @@ public class SimpleDynamicTemplatesMappingTests extends MappingContextBaseTests
assertEquals(EXPECTED_MAPPING_TWO, mapping); assertEquals(EXPECTED_MAPPING_TWO, mapping);
} }
/**
* @author Petr Kukral
*/
@Document(indexName = "test-dynamictemplates", type = "test-dynamictemplatestype", indexStoreType = "memory",
shards = 1, replicas = 0, refreshInterval = "-1")
@DynamicTemplates(mappingPath = "/mappings/test-dynamic_templates_mappings.json")
static class SampleDynamicTemplatesEntity {
@Id private String id;
@Field(type = FieldType.Object) private Map<String, String> names = new HashMap<String, String>();
}
/**
* @author Petr Kukral
*/
@Document(indexName = "test-dynamictemplates", type = "test-dynamictemplatestype", indexStoreType = "memory",
shards = 1, replicas = 0, refreshInterval = "-1")
@DynamicTemplates(mappingPath = "/mappings/test-dynamic_templates_mappings_two.json")
static class SampleDynamicTemplatesEntityTwo {
@Id private String id;
@Field(type = FieldType.Object) private Map<String, String> names = new HashMap<String, String>();
}
} }

View File

@ -16,12 +16,17 @@
package org.springframework.data.elasticsearch.core; package org.springframework.data.elasticsearch.core;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import static org.springframework.data.elasticsearch.annotations.FieldType.*;
import java.io.IOException; import java.io.IOException;
import java.util.Date;
import org.junit.Test; import org.junit.Test;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.entities.SampleDateMappingEntity; import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
/** /**
* @author Jakub Vavrik * @author Jakub Vavrik
@ -43,4 +48,63 @@ public class SimpleElasticsearchDateMappingTests extends MappingContextBaseTests
assertEquals(EXPECTED_MAPPING, mapping); assertEquals(EXPECTED_MAPPING, mapping);
} }
/**
* @author Jakub Vavrik
*/
@Document(indexName = "test-index-date-mapping-core", type = "mapping", shards = 1, replicas = 0,
refreshInterval = "-1")
static class SampleDateMappingEntity {
@Id private String id;
@Field(type = Text, index = false, store = true, analyzer = "standard") private String message;
@Field(type = Date, format = DateFormat.custom,
pattern = "dd.MM.yyyy hh:mm") private java.util.Date customFormatDate;
@Field(type = FieldType.Date) private Date defaultFormatDate;
@Field(type = FieldType.Date, format = DateFormat.basic_date) private Date basicFormatDate;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Date getCustomFormatDate() {
return customFormatDate;
}
public void setCustomFormatDate(Date customFormatDate) {
this.customFormatDate = customFormatDate;
}
public Date getDefaultFormatDate() {
return defaultFormatDate;
}
public void setDefaultFormatDate(Date defaultFormatDate) {
this.defaultFormatDate = defaultFormatDate;
}
public Date getBasicFormatDate() {
return basicFormatDate;
}
public void setBasicFormatDate(Date basicFormatDate) {
this.basicFormatDate = basicFormatDate;
}
}
} }

View File

@ -15,39 +15,44 @@
*/ */
package org.springframework.data.elasticsearch.core.aggregation; package org.springframework.data.elasticsearch.core.aggregation;
import static org.elasticsearch.action.search.SearchType.*; import static org.assertj.core.api.Assertions.*;
import static org.elasticsearch.index.query.QueryBuilders.*; import static org.elasticsearch.index.query.QueryBuilders.*;
import static org.elasticsearch.search.aggregations.AggregationBuilders.*; import static org.elasticsearch.search.aggregations.AggregationBuilders.*;
import static org.hamcrest.Matchers.*; import static org.springframework.data.elasticsearch.annotations.FieldType.*;
import static org.junit.Assert.*; import static org.springframework.data.elasticsearch.annotations.FieldType.Integer;
import java.lang.Integer;
import java.util.ArrayList;
import java.util.List;
import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType; import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.search.aggregations.Aggregations; import org.elasticsearch.search.aggregations.Aggregations;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.InnerField;
import org.springframework.data.elasticsearch.annotations.MultiField;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.ResultsExtractor; import org.springframework.data.elasticsearch.core.ResultsExtractor;
import org.springframework.data.elasticsearch.core.facet.ArticleEntity;
import org.springframework.data.elasticsearch.core.facet.ArticleEntityBuilder;
import org.springframework.data.elasticsearch.core.query.IndexQuery; import org.springframework.data.elasticsearch.core.query.IndexQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.query.SearchQuery; import org.springframework.data.elasticsearch.core.query.SearchQuery;
import org.springframework.data.elasticsearch.utils.IndexInitializer;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
import static org.elasticsearch.search.aggregations.AggregationBuilders.terms;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
import static org.junit.Assert.assertThat;
/** /**
* @author Rizwan Idrees * @author Rizwan Idrees
* @author Mohsin Husen * @author Mohsin Husen
* @author Jonathan Yan * @author Jonathan Yan
* @author Artur Konczak * @author Artur Konczak
* @author Peter-Josef Meisch
*/ */
@RunWith(SpringJUnit4ClassRunner.class) @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:elasticsearch-template-test.xml") @ContextConfiguration("classpath:elasticsearch-template-test.xml")
@ -60,20 +65,27 @@ public class ElasticsearchTemplateAggregationTests {
public static final int YEAR_2002 = 2002; public static final int YEAR_2002 = 2002;
public static final int YEAR_2001 = 2001; public static final int YEAR_2001 = 2001;
public static final int YEAR_2000 = 2000; public static final int YEAR_2000 = 2000;
@Autowired public static final String INDEX_NAME = "test-index-articles-core-aggregation";
private ElasticsearchTemplate elasticsearchTemplate;
@Autowired private ElasticsearchTemplate elasticsearchTemplate;
@Before @Before
public void before() { public void before() {
elasticsearchTemplate.deleteIndex(ArticleEntity.class);
elasticsearchTemplate.createIndex(ArticleEntity.class);
elasticsearchTemplate.putMapping(ArticleEntity.class);
elasticsearchTemplate.refresh(ArticleEntity.class);
IndexQuery article1 = new ArticleEntityBuilder("1").title("article four").subject("computing").addAuthor(RIZWAN_IDREES).addAuthor(ARTUR_KONCZAK).addAuthor(MOHSIN_HUSEN).addAuthor(JONATHAN_YAN).score(10).buildIndex(); IndexInitializer.init(elasticsearchTemplate, ArticleEntity.class);
IndexQuery article2 = new ArticleEntityBuilder("2").title("article three").subject("computing").addAuthor(RIZWAN_IDREES).addAuthor(ARTUR_KONCZAK).addAuthor(MOHSIN_HUSEN).addPublishedYear(YEAR_2000).score(20).buildIndex();
IndexQuery article3 = new ArticleEntityBuilder("3").title("article two").subject("computing").addAuthor(RIZWAN_IDREES).addAuthor(ARTUR_KONCZAK).addPublishedYear(YEAR_2001).addPublishedYear(YEAR_2000).score(30).buildIndex(); IndexQuery article1 = new ArticleEntityBuilder("1").title("article four").subject("computing")
IndexQuery article4 = new ArticleEntityBuilder("4").title("article one").subject("accounting").addAuthor(RIZWAN_IDREES).addPublishedYear(YEAR_2002).addPublishedYear(YEAR_2001).addPublishedYear(YEAR_2000).score(40).buildIndex(); .addAuthor(RIZWAN_IDREES).addAuthor(ARTUR_KONCZAK).addAuthor(MOHSIN_HUSEN).addAuthor(JONATHAN_YAN).score(10)
.buildIndex();
IndexQuery article2 = new ArticleEntityBuilder("2").title("article three").subject("computing")
.addAuthor(RIZWAN_IDREES).addAuthor(ARTUR_KONCZAK).addAuthor(MOHSIN_HUSEN).addPublishedYear(YEAR_2000).score(20)
.buildIndex();
IndexQuery article3 = new ArticleEntityBuilder("3").title("article two").subject("computing")
.addAuthor(RIZWAN_IDREES).addAuthor(ARTUR_KONCZAK).addPublishedYear(YEAR_2001).addPublishedYear(YEAR_2000)
.score(30).buildIndex();
IndexQuery article4 = new ArticleEntityBuilder("4").title("article one").subject("accounting")
.addAuthor(RIZWAN_IDREES).addPublishedYear(YEAR_2002).addPublishedYear(YEAR_2001).addPublishedYear(YEAR_2000)
.score(40).buildIndex();
elasticsearchTemplate.index(article1); elasticsearchTemplate.index(article1);
elasticsearchTemplate.index(article2); elasticsearchTemplate.index(article2);
@ -82,14 +94,21 @@ public class ElasticsearchTemplateAggregationTests {
elasticsearchTemplate.refresh(ArticleEntity.class); elasticsearchTemplate.refresh(ArticleEntity.class);
} }
@After
public void after() {
elasticsearchTemplate.deleteIndex(ArticleEntity.class);
}
@Test @Test
public void shouldReturnAggregatedResponseForGivenSearchQuery() { public void shouldReturnAggregatedResponseForGivenSearchQuery() {
// given // given
SearchQuery searchQuery = new NativeSearchQueryBuilder() SearchQuery searchQuery = new NativeSearchQueryBuilder() //
.withQuery(matchAllQuery()) .withQuery(matchAllQuery()) //
.withSearchType(SearchType.DEFAULT) .withSearchType(SearchType.DEFAULT) //
.withIndices("test-index-articles").withTypes("article") .withIndices(INDEX_NAME).withTypes("article") //
.addAggregation(terms("subjects").field("subject")) .addAggregation(terms("subjects").field("subject")) //
.build(); .build();
// when // when
Aggregations aggregations = elasticsearchTemplate.query(searchQuery, new ResultsExtractor<Aggregations>() { Aggregations aggregations = elasticsearchTemplate.query(searchQuery, new ResultsExtractor<Aggregations>() {
@ -99,9 +118,139 @@ public class ElasticsearchTemplateAggregationTests {
} }
}); });
// then // then
assertThat(aggregations, is(notNullValue())); assertThat(aggregations).isNotNull();
assertThat(aggregations.asMap().get("subjects"), is(notNullValue())); assertThat(aggregations.asMap().get("subjects")).isNotNull();
} }
/**
* Simple type to test facets
*
* @author Artur Konczak
* @author Mohsin Husen
*/
@Document(indexName = "test-index-articles-core-aggregation", type = "article", shards = 1, replicas = 0, refreshInterval = "-1")
static class ArticleEntity {
@Id private String id;
private String title;
@Field(type = Text, fielddata = true) private String subject;
@MultiField(mainField = @Field(type = Text),
otherFields = {
@InnerField(suffix = "untouched", type = Text, store = true, fielddata = true, analyzer = "keyword"),
@InnerField(suffix = "sort", type = Text, store = true,
analyzer = "keyword") }) private List<String> authors = new ArrayList<>();
@Field(type = Integer, store = true) private List<Integer> publishedYears = new ArrayList<>();
private int score;
private ArticleEntity() {
}
public ArticleEntity(String id) {
this.id = id;
}
public void setId(String id) {
this.id = id;
}
public String getId() {
return id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public List<String> getAuthors() {
return authors;
}
public void setAuthors(List<String> authors) {
this.authors = authors;
}
public List<Integer> getPublishedYears() {
return publishedYears;
}
public void setPublishedYears(List<Integer> publishedYears) {
this.publishedYears = publishedYears;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
}
/**
* Simple type to test facets
*
* @author Artur Konczak
* @author Mohsin Husen
*/
static class ArticleEntityBuilder {
private ArticleEntity result;
public ArticleEntityBuilder(String id) {
result = new ArticleEntity(id);
}
public ArticleEntityBuilder title(String title) {
result.setTitle(title);
return this;
}
public ArticleEntityBuilder subject(String subject) {
result.setSubject(subject);
return this;
}
public ArticleEntityBuilder addAuthor(String author) {
result.getAuthors().add(author);
return this;
}
public ArticleEntityBuilder addPublishedYear(Integer year) {
result.getPublishedYears().add(year);
return this;
}
public ArticleEntityBuilder score(int score) {
result.setScore(score);
return this;
}
public ArticleEntity build() {
return result;
}
public IndexQuery buildIndex() {
IndexQuery indexQuery = new IndexQuery();
indexQuery.setId(result.getId());
indexQuery.setObject(result);
return indexQuery;
}
}
} }

View File

@ -1,50 +0,0 @@
package org.springframework.data.elasticsearch.core.completion;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.CompletionField;
import org.springframework.data.elasticsearch.annotations.Document;
/**
* @author Mewes Kochheim
*/
@Document(indexName = "test-index-annotated-completion", type = "annotated-completion-type", shards = 1, replicas = 0, refreshInterval = "-1")
public class AnnotatedCompletionEntity {
@Id
private String id;
private String name;
@CompletionField(maxInputLength = 100)
private Completion suggest;
private AnnotatedCompletionEntity() {
}
public AnnotatedCompletionEntity(String id) {
this.id = id;
}
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 Completion getSuggest() {
return suggest;
}
public void setSuggest(Completion suggest) {
this.suggest = suggest;
}
}

View File

@ -1,59 +0,0 @@
/*
* Copyright 2013-2019 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
*
* https://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.core.completion;
import org.springframework.data.elasticsearch.core.query.IndexQuery;
/**
* @author Franck Marchand
* @author Mohsin Husen
* @author Mewes Kochheim
*/
public class AnnotatedCompletionEntityBuilder {
private AnnotatedCompletionEntity result;
public AnnotatedCompletionEntityBuilder(String id) {
result = new AnnotatedCompletionEntity(id);
}
public AnnotatedCompletionEntityBuilder name(String name) {
result.setName(name);
return this;
}
public AnnotatedCompletionEntityBuilder suggest(String[] input) {
return suggest(input, null);
}
public AnnotatedCompletionEntityBuilder suggest(String[] input, Integer weight) {
Completion suggest = new Completion(input);
suggest.setWeight(weight);
result.setSuggest(suggest);
return this;
}
public AnnotatedCompletionEntity build() {
return result;
}
public IndexQuery buildIndex() {
IndexQuery indexQuery = new IndexQuery();
indexQuery.setId(result.getId());
indexQuery.setObject(result);
return indexQuery;
}
}

View File

@ -1,52 +0,0 @@
package org.springframework.data.elasticsearch.core.completion;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.CompletionField;
import org.springframework.data.elasticsearch.annotations.Document;
/**
* @author Franck Marchand
* @author Mohsin Husen
* @author Mewes Kochheim
*/
@Document(indexName = "test-index-completion-annotated", type = "completion-annotation-type", shards = 1, replicas = 0, refreshInterval = "-1")
public class CompletionAnnotatedEntity {
@Id
private String id;
private String name;
@CompletionField
private Completion suggest;
private CompletionAnnotatedEntity() {
}
public CompletionAnnotatedEntity(String id) {
this.id = id;
}
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 Completion getSuggest() {
return suggest;
}
public void setSuggest(Completion suggest) {
this.suggest = suggest;
}
}

View File

@ -1,50 +0,0 @@
package org.springframework.data.elasticsearch.core.completion;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.CompletionField;
import org.springframework.data.elasticsearch.annotations.Document;
/**
* @author Mewes Kochheim
*/
@Document(indexName = "test-index-completion", type = "completion-type", shards = 1, replicas = 0, refreshInterval = "-1")
public class CompletionEntity {
@Id
private String id;
private String name;
@CompletionField(maxInputLength = 100)
private Completion suggest;
private CompletionEntity() {
}
public CompletionEntity(String id) {
this.id = id;
}
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 Completion getSuggest() {
return suggest;
}
public void setSuggest(Completion suggest) {
this.suggest = suggest;
}
}

View File

@ -1,61 +0,0 @@
/*
* Copyright 2013-2019 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
*
* https://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.core.completion;
import org.springframework.data.elasticsearch.core.query.IndexQuery;
/**
* @author Franck Marchand
* @author Mohsin Husen
* @author Mewes Kochheim
*/
public class CompletionEntityAnnotatedBuilder {
private CompletionAnnotatedEntity result;
public CompletionEntityAnnotatedBuilder(String id) {
result = new CompletionAnnotatedEntity(id);
}
public CompletionEntityAnnotatedBuilder name(String name) {
result.setName(name);
return this;
}
public CompletionEntityAnnotatedBuilder suggest(String[] input) {
return suggest(input, null);
}
public CompletionEntityAnnotatedBuilder suggest(String[] input, Integer weight) {
Completion suggest = new Completion(input);
if (weight != null) {
suggest.setWeight(weight);
}
result.setSuggest(suggest);
return this;
}
public CompletionAnnotatedEntity build() {
return result;
}
public IndexQuery buildIndex() {
IndexQuery indexQuery = new IndexQuery();
indexQuery.setId(result.getId());
indexQuery.setObject(result);
return indexQuery;
}
}

View File

@ -1,58 +0,0 @@
/*
* Copyright 2013-2019 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
*
* https://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.core.completion;
import org.springframework.data.elasticsearch.core.query.IndexQuery;
/**
* @author Mewes Kochheim
*/
public class CompletionEntityBuilder {
private CompletionEntity result;
public CompletionEntityBuilder(String id) {
result = new CompletionEntity(id);
}
public CompletionEntityBuilder name(String name) {
result.setName(name);
return this;
}
public CompletionEntityBuilder suggest(String[] input) {
return suggest(input, null);
}
public CompletionEntityBuilder suggest(String[] input, Integer weight) {
Completion suggest = new Completion(input);
suggest.setWeight(weight);
result.setSuggest(suggest);
return this;
}
public CompletionEntity build() {
return result;
}
public IndexQuery buildIndex() {
IndexQuery indexQuery = new IndexQuery();
indexQuery.setId(result.getId());
indexQuery.setObject(result);
return indexQuery;
}
}

View File

@ -1,57 +0,0 @@
package org.springframework.data.elasticsearch.core.completion;
import org.elasticsearch.search.suggest.completion.context.ContextMapping;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.CompletionContext;
import org.springframework.data.elasticsearch.annotations.CompletionContextType;
import org.springframework.data.elasticsearch.annotations.CompletionField;
import org.springframework.data.elasticsearch.annotations.Document;
/**
* @author Mewes Kochheim
* @author Robert Gruendler
*/
@Document(indexName = "test-index-context-completion", type = "context-completion-type", shards = 1, replicas = 0, refreshInterval = "-1")
public class ContextCompletionEntity {
public static final String LANGUAGE_CATEGORY = "language";
@Id
private String id;
private String name;
@CompletionField(maxInputLength = 100, contexts = {
@CompletionContext(name = LANGUAGE_CATEGORY, type = ContextMapping.Type.CATEGORY)
})
private Completion suggest;
private ContextCompletionEntity() {
}
public ContextCompletionEntity(String id) {
this.id = id;
}
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 Completion getSuggest() {
return suggest;
}
public void setSuggest(Completion suggest) {
this.suggest = suggest;
}
}

View File

@ -1,57 +0,0 @@
/*
* Copyright 2013-2019 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
*
* https://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.core.completion;
import org.springframework.data.elasticsearch.core.query.IndexQuery;
import java.util.List;
import java.util.Map;
/**
* @author Robert Gruendler
*/
public class ContextCompletionEntityBuilder {
private ContextCompletionEntity result;
public ContextCompletionEntityBuilder(String id) {
result = new ContextCompletionEntity(id);
}
public ContextCompletionEntityBuilder name(String name) {
result.setName(name);
return this;
}
public ContextCompletionEntityBuilder suggest(String[] input, Map<String, List<String>> contexts) {
Completion suggest = new Completion(input);
suggest.setContexts(contexts);
result.setSuggest(suggest);
return this;
}
public ContextCompletionEntity build() {
return result;
}
public IndexQuery buildIndex() {
IndexQuery indexQuery = new IndexQuery();
indexQuery.setId(result.getId());
indexQuery.setObject(result);
return indexQuery;
}
}

View File

@ -15,9 +15,7 @@
*/ */
package org.springframework.data.elasticsearch.core.completion; package org.springframework.data.elasticsearch.core.completion;
import static org.hamcrest.MatcherAssert.assertThat; import static org.assertj.core.api.Assertions.*;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -28,84 +26,85 @@ import org.elasticsearch.search.suggest.SuggestBuilder;
import org.elasticsearch.search.suggest.SuggestBuilders; import org.elasticsearch.search.suggest.SuggestBuilders;
import org.elasticsearch.search.suggest.SuggestionBuilder; import org.elasticsearch.search.suggest.SuggestionBuilder;
import org.elasticsearch.search.suggest.completion.CompletionSuggestion; import org.elasticsearch.search.suggest.completion.CompletionSuggestion;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.CompletionField;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.IndexQuery; import org.springframework.data.elasticsearch.core.query.IndexQuery;
import org.springframework.data.elasticsearch.entities.NonDocumentEntity; import org.springframework.data.elasticsearch.utils.IndexInitializer;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.ArrayList;
import java.util.List;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertEquals;
/** /**
* @author Rizwan Idrees * @author Rizwan Idrees
* @author Mohsin Husen * @author Mohsin Husen
* @author Franck Marchand * @author Franck Marchand
* @author Artur Konczak * @author Artur Konczak
* @author Mewes Kochheim * @author Mewes Kochheim
* @author Peter-Josef Meisch
*/ */
@RunWith(SpringJUnit4ClassRunner.class) @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:elasticsearch-template-test.xml") @ContextConfiguration("classpath:elasticsearch-template-test.xml")
public class ElasticsearchTemplateCompletionTests { public class ElasticsearchTemplateCompletionTests {
@Autowired @Autowired private ElasticsearchTemplate elasticsearchTemplate;
private ElasticsearchTemplate elasticsearchTemplate;
private void loadCompletionObjectEntities() { private void loadCompletionObjectEntities() {
elasticsearchTemplate.deleteIndex(CompletionEntity.class);
elasticsearchTemplate.createIndex(CompletionEntity.class); IndexInitializer.init(elasticsearchTemplate, CompletionEntity.class);
elasticsearchTemplate.refresh(CompletionEntity.class);
elasticsearchTemplate.putMapping(CompletionEntity.class);
List<IndexQuery> indexQueries = new ArrayList<>(); List<IndexQuery> indexQueries = new ArrayList<>();
indexQueries.add(new CompletionEntityBuilder("1").name("Rizwan Idrees").suggest(new String[]{"Rizwan Idrees"}).buildIndex()); indexQueries.add(
indexQueries.add(new CompletionEntityBuilder("2").name("Franck Marchand").suggest(new String[]{"Franck", "Marchand"}).buildIndex()); new CompletionEntityBuilder("1").name("Rizwan Idrees").suggest(new String[] { "Rizwan Idrees" }).buildIndex());
indexQueries.add(new CompletionEntityBuilder("3").name("Mohsin Husen").suggest(new String[]{"Mohsin", "Husen"}).buildIndex()); indexQueries.add(new CompletionEntityBuilder("2").name("Franck Marchand")
indexQueries.add(new CompletionEntityBuilder("4").name("Artur Konczak").suggest(new String[]{"Artur", "Konczak"}).buildIndex()); .suggest(new String[] { "Franck", "Marchand" }).buildIndex());
indexQueries.add(
new CompletionEntityBuilder("3").name("Mohsin Husen").suggest(new String[] { "Mohsin", "Husen" }).buildIndex());
indexQueries.add(new CompletionEntityBuilder("4").name("Artur Konczak").suggest(new String[] { "Artur", "Konczak" })
.buildIndex());
elasticsearchTemplate.bulkIndex(indexQueries); elasticsearchTemplate.bulkIndex(indexQueries);
elasticsearchTemplate.refresh(CompletionEntity.class); elasticsearchTemplate.refresh(CompletionEntity.class);
} }
private void loadAnnotatedCompletionObjectEntities() { private void loadAnnotatedCompletionObjectEntities() {
elasticsearchTemplate.deleteIndex(AnnotatedCompletionEntity.class);
elasticsearchTemplate.createIndex(AnnotatedCompletionEntity.class); IndexInitializer.init(elasticsearchTemplate, AnnotatedCompletionEntity.class);
elasticsearchTemplate.refresh(AnnotatedCompletionEntity.class);
elasticsearchTemplate.putMapping(AnnotatedCompletionEntity.class);
NonDocumentEntity nonDocumentEntity = new NonDocumentEntity(); NonDocumentEntity nonDocumentEntity = new NonDocumentEntity();
nonDocumentEntity.setSomeField1("foo"); nonDocumentEntity.setSomeField1("foo");
nonDocumentEntity.setSomeField2("bar"); nonDocumentEntity.setSomeField2("bar");
List<IndexQuery> indexQueries = new ArrayList<>(); List<IndexQuery> indexQueries = new ArrayList<>();
indexQueries.add(new AnnotatedCompletionEntityBuilder("1").name("Franck Marchand").suggest(new String[]{"Franck", "Marchand"}).buildIndex()); indexQueries.add(new AnnotatedCompletionEntityBuilder("1").name("Franck Marchand")
indexQueries.add(new AnnotatedCompletionEntityBuilder("2").name("Mohsin Husen").suggest(new String[]{"Mohsin", "Husen"}).buildIndex()); .suggest(new String[] { "Franck", "Marchand" }).buildIndex());
indexQueries.add(new AnnotatedCompletionEntityBuilder("3").name("Rizwan Idrees").suggest(new String[]{"Rizwan", "Idrees"}).buildIndex()); indexQueries.add(new AnnotatedCompletionEntityBuilder("2").name("Mohsin Husen")
indexQueries.add(new AnnotatedCompletionEntityBuilder("4").name("Artur Konczak").suggest(new String[]{"Artur", "Konczak"}).buildIndex()); .suggest(new String[] { "Mohsin", "Husen" }).buildIndex());
indexQueries.add(new AnnotatedCompletionEntityBuilder("3").name("Rizwan Idrees")
.suggest(new String[] { "Rizwan", "Idrees" }).buildIndex());
indexQueries.add(new AnnotatedCompletionEntityBuilder("4").name("Artur Konczak")
.suggest(new String[] { "Artur", "Konczak" }).buildIndex());
elasticsearchTemplate.bulkIndex(indexQueries); elasticsearchTemplate.bulkIndex(indexQueries);
elasticsearchTemplate.refresh(AnnotatedCompletionEntity.class); elasticsearchTemplate.refresh(AnnotatedCompletionEntity.class);
} }
private void loadAnnotatedCompletionObjectEntitiesWithWeights() { private void loadAnnotatedCompletionObjectEntitiesWithWeights() {
elasticsearchTemplate.deleteIndex(AnnotatedCompletionEntity.class);
elasticsearchTemplate.createIndex(AnnotatedCompletionEntity.class); IndexInitializer.init(elasticsearchTemplate, AnnotatedCompletionEntity.class);
elasticsearchTemplate.putMapping(AnnotatedCompletionEntity.class);
elasticsearchTemplate.refresh(AnnotatedCompletionEntity.class);
List<IndexQuery> indexQueries = new ArrayList<>(); List<IndexQuery> indexQueries = new ArrayList<>();
indexQueries.add(new AnnotatedCompletionEntityBuilder("1").name("Mewes Kochheim1").suggest(new String[]{"Mewes Kochheim1"},4).buildIndex()); indexQueries.add(new AnnotatedCompletionEntityBuilder("1").name("Mewes Kochheim1")
indexQueries.add(new AnnotatedCompletionEntityBuilder("2").name("Mewes Kochheim2").suggest(new String[]{"Mewes Kochheim2"}, 1).buildIndex()); .suggest(new String[] { "Mewes Kochheim1" }, 4).buildIndex());
indexQueries.add(new AnnotatedCompletionEntityBuilder("3").name("Mewes Kochheim3").suggest(new String[]{"Mewes Kochheim3"}, 2).buildIndex()); indexQueries.add(new AnnotatedCompletionEntityBuilder("2").name("Mewes Kochheim2")
indexQueries.add(new AnnotatedCompletionEntityBuilder("4").name("Mewes Kochheim4").suggest(new String[]{"Mewes Kochheim4"}, Integer.MAX_VALUE).buildIndex()); .suggest(new String[] { "Mewes Kochheim2" }, 1).buildIndex());
indexQueries.add(new AnnotatedCompletionEntityBuilder("3").name("Mewes Kochheim3")
.suggest(new String[] { "Mewes Kochheim3" }, 2).buildIndex());
indexQueries.add(new AnnotatedCompletionEntityBuilder("4").name("Mewes Kochheim4")
.suggest(new String[] { "Mewes Kochheim4" }, Integer.MAX_VALUE).buildIndex());
elasticsearchTemplate.bulkIndex(indexQueries); elasticsearchTemplate.bulkIndex(indexQueries);
elasticsearchTemplate.refresh(AnnotatedCompletionEntity.class); elasticsearchTemplate.refresh(AnnotatedCompletionEntity.class);
@ -113,74 +112,286 @@ public class ElasticsearchTemplateCompletionTests {
@Test @Test
public void shouldPutMappingForGivenEntity() throws Exception { public void shouldPutMappingForGivenEntity() throws Exception {
//given
// given
Class entity = CompletionEntity.class; Class entity = CompletionEntity.class;
elasticsearchTemplate.createIndex(entity); elasticsearchTemplate.createIndex(entity);
//when // when
assertThat(elasticsearchTemplate.putMapping(entity), is(true)); assertThat(elasticsearchTemplate.putMapping(entity)).isTrue();
} }
@Test @Test
public void shouldFindSuggestionsForGivenCriteriaQueryUsingCompletionEntity() { public void shouldFindSuggestionsForGivenCriteriaQueryUsingCompletionEntity() {
//given
// given
loadCompletionObjectEntities(); loadCompletionObjectEntities();
SuggestionBuilder completionSuggestionFuzzyBuilder = SuggestBuilders.completionSuggestion("suggest").prefix("m", Fuzziness.AUTO); SuggestionBuilder completionSuggestionFuzzyBuilder = SuggestBuilders.completionSuggestion("suggest").prefix("m",
Fuzziness.AUTO);
//when // when
final SearchResponse suggestResponse = elasticsearchTemplate.suggest(new SuggestBuilder().addSuggestion("test-suggest",completionSuggestionFuzzyBuilder), CompletionEntity.class); final SearchResponse suggestResponse = elasticsearchTemplate.suggest(
new SuggestBuilder().addSuggestion("test-suggest", completionSuggestionFuzzyBuilder), CompletionEntity.class);
CompletionSuggestion completionSuggestion = suggestResponse.getSuggest().getSuggestion("test-suggest"); CompletionSuggestion completionSuggestion = suggestResponse.getSuggest().getSuggestion("test-suggest");
List<CompletionSuggestion.Entry.Option> options = completionSuggestion.getEntries().get(0).getOptions(); List<CompletionSuggestion.Entry.Option> options = completionSuggestion.getEntries().get(0).getOptions();
//then // then
assertThat(options.size(), is(2)); assertThat(options).hasSize(2);
assertThat(options.get(0).getText().string(), isOneOf("Marchand", "Mohsin")); assertThat(options.get(0).getText().string()).isIn("Marchand", "Mohsin");
assertThat(options.get(1).getText().string(), isOneOf("Marchand", "Mohsin")); assertThat(options.get(1).getText().string()).isIn("Marchand", "Mohsin");
} }
@Test @Test
public void shouldFindSuggestionsForGivenCriteriaQueryUsingAnnotatedCompletionEntity() { public void shouldFindSuggestionsForGivenCriteriaQueryUsingAnnotatedCompletionEntity() {
//given
loadAnnotatedCompletionObjectEntities();
SuggestionBuilder completionSuggestionFuzzyBuilder = SuggestBuilders.completionSuggestion("suggest").prefix("m", Fuzziness.AUTO);
//when // given
final SearchResponse suggestResponse = elasticsearchTemplate.suggest(new SuggestBuilder().addSuggestion("test-suggest", completionSuggestionFuzzyBuilder), CompletionEntity.class); loadAnnotatedCompletionObjectEntities();
SuggestionBuilder completionSuggestionFuzzyBuilder = SuggestBuilders.completionSuggestion("suggest").prefix("m",
Fuzziness.AUTO);
// when
final SearchResponse suggestResponse = elasticsearchTemplate.suggest(
new SuggestBuilder().addSuggestion("test-suggest", completionSuggestionFuzzyBuilder), CompletionEntity.class);
CompletionSuggestion completionSuggestion = suggestResponse.getSuggest().getSuggestion("test-suggest"); CompletionSuggestion completionSuggestion = suggestResponse.getSuggest().getSuggestion("test-suggest");
List<CompletionSuggestion.Entry.Option> options = completionSuggestion.getEntries().get(0).getOptions(); List<CompletionSuggestion.Entry.Option> options = completionSuggestion.getEntries().get(0).getOptions();
//then // then
assertThat(options.size(), is(2)); assertThat(options).hasSize(2);
assertThat(options.get(0).getText().string(), isOneOf("Marchand", "Mohsin")); assertThat(options.get(0).getText().string()).isIn("Marchand", "Mohsin");
assertThat(options.get(1).getText().string(), isOneOf("Marchand", "Mohsin")); assertThat(options.get(1).getText().string()).isIn("Marchand", "Mohsin");
} }
@Test @Test
public void shouldFindSuggestionsWithWeightsForGivenCriteriaQueryUsingAnnotatedCompletionEntity() { public void shouldFindSuggestionsWithWeightsForGivenCriteriaQueryUsingAnnotatedCompletionEntity() {
//given
loadAnnotatedCompletionObjectEntitiesWithWeights();
SuggestionBuilder completionSuggestionFuzzyBuilder = SuggestBuilders.completionSuggestion("suggest").prefix("m", Fuzziness.AUTO);
//when // given
final SearchResponse suggestResponse = elasticsearchTemplate.suggest(new SuggestBuilder().addSuggestion("test-suggest",completionSuggestionFuzzyBuilder), AnnotatedCompletionEntity.class); loadAnnotatedCompletionObjectEntitiesWithWeights();
SuggestionBuilder completionSuggestionFuzzyBuilder = SuggestBuilders.completionSuggestion("suggest").prefix("m",
Fuzziness.AUTO);
// when
final SearchResponse suggestResponse = elasticsearchTemplate.suggest(
new SuggestBuilder().addSuggestion("test-suggest", completionSuggestionFuzzyBuilder),
AnnotatedCompletionEntity.class);
CompletionSuggestion completionSuggestion = suggestResponse.getSuggest().getSuggestion("test-suggest"); CompletionSuggestion completionSuggestion = suggestResponse.getSuggest().getSuggestion("test-suggest");
List<CompletionSuggestion.Entry.Option> options = completionSuggestion.getEntries().get(0).getOptions(); List<CompletionSuggestion.Entry.Option> options = completionSuggestion.getEntries().get(0).getOptions();
//then // then
assertThat(options.size(), is(4)); assertThat(options).hasSize(4);
for (CompletionSuggestion.Entry.Option option : options) { for (CompletionSuggestion.Entry.Option option : options) {
if (option.getText().string().equals("Mewes Kochheim1")) { switch (option.getText().string()) {
assertEquals(4, option.getScore(), 0); case "Mewes Kochheim1":
} else if (option.getText().string().equals("Mewes Kochheim2")) { assertThat(option.getScore()).isEqualTo(4);
assertEquals(1, option.getScore(), 0); break;
} else if (option.getText().string().equals("Mewes Kochheim3")) { case "Mewes Kochheim2":
assertEquals(2, option.getScore(), 0); assertThat(option.getScore()).isEqualTo(1);
} else if (option.getText().string().equals("Mewes Kochheim4")) { break;
assertEquals(Integer.MAX_VALUE, option.getScore(), 0); case "Mewes Kochheim3":
} else { assertThat(option.getScore()).isEqualTo(2);
break;
case "Mewes Kochheim4":
assertThat(option.getScore()).isEqualTo(Integer.MAX_VALUE);
break;
default:
fail("Unexpected option"); fail("Unexpected option");
break;
} }
} }
} }
/**
* @author Rizwan Idrees
* @author Mohsin Husen
*/
static class NonDocumentEntity {
@Id private String someId;
private String someField1;
private String someField2;
public String getSomeField1() {
return someField1;
}
public void setSomeField1(String someField1) {
this.someField1 = someField1;
}
public String getSomeField2() {
return someField2;
}
public void setSomeField2(String someField2) {
this.someField2 = someField2;
}
}
/**
* @author Mewes Kochheim
*/
@Document(indexName = "test-index-core-completion", type = "completion-type", shards = 1, replicas = 0,
refreshInterval = "-1")
static class CompletionEntity {
@Id private String id;
private String name;
@CompletionField(maxInputLength = 100) private Completion suggest;
private CompletionEntity() {}
public CompletionEntity(String id) {
this.id = id;
}
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 Completion getSuggest() {
return suggest;
}
public void setSuggest(Completion suggest) {
this.suggest = suggest;
}
}
/**
* @author Mewes Kochheim
*/
static class CompletionEntityBuilder {
private CompletionEntity result;
public CompletionEntityBuilder(String id) {
result = new CompletionEntity(id);
}
public CompletionEntityBuilder name(String name) {
result.setName(name);
return this;
}
public CompletionEntityBuilder suggest(String[] input) {
return suggest(input, null);
}
public CompletionEntityBuilder suggest(String[] input, Integer weight) {
Completion suggest = new Completion(input);
suggest.setWeight(weight);
result.setSuggest(suggest);
return this;
}
public CompletionEntity build() {
return result;
}
public IndexQuery buildIndex() {
IndexQuery indexQuery = new IndexQuery();
indexQuery.setId(result.getId());
indexQuery.setObject(result);
return indexQuery;
}
}
/**
* @author Mewes Kochheim
*/
@Document(indexName = "test-index-annotated-completion", type = "annotated-completion-type", shards = 1, replicas = 0,
refreshInterval = "-1")
static class AnnotatedCompletionEntity {
@Id private String id;
private String name;
@CompletionField(maxInputLength = 100) private Completion suggest;
private AnnotatedCompletionEntity() {}
public AnnotatedCompletionEntity(String id) {
this.id = id;
}
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 Completion getSuggest() {
return suggest;
}
public void setSuggest(Completion suggest) {
this.suggest = suggest;
}
}
/**
* @author Franck Marchand
* @author Mohsin Husen
* @author Mewes Kochheim
*/
static class AnnotatedCompletionEntityBuilder {
private AnnotatedCompletionEntity result;
public AnnotatedCompletionEntityBuilder(String id) {
result = new AnnotatedCompletionEntity(id);
}
public AnnotatedCompletionEntityBuilder name(String name) {
result.setName(name);
return this;
}
public AnnotatedCompletionEntityBuilder suggest(String[] input) {
return suggest(input, null);
}
public AnnotatedCompletionEntityBuilder suggest(String[] input, Integer weight) {
Completion suggest = new Completion(input);
suggest.setWeight(weight);
result.setSuggest(suggest);
return this;
}
public AnnotatedCompletionEntity build() {
return result;
}
public IndexQuery buildIndex() {
IndexQuery indexQuery = new IndexQuery();
indexQuery.setId(result.getId());
indexQuery.setObject(result);
return indexQuery;
}
}
} }

View File

@ -15,6 +15,14 @@
*/ */
package org.springframework.data.elasticsearch.core.completion; package org.springframework.data.elasticsearch.core.completion;
import static org.assertj.core.api.Assertions.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.common.unit.Fuzziness; import org.elasticsearch.common.unit.Fuzziness;
import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.ToXContent;
@ -24,40 +32,33 @@ import org.elasticsearch.search.suggest.SuggestionBuilder;
import org.elasticsearch.search.suggest.completion.CompletionSuggestion; import org.elasticsearch.search.suggest.completion.CompletionSuggestion;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder; import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.elasticsearch.search.suggest.completion.context.CategoryQueryContext; import org.elasticsearch.search.suggest.completion.context.CategoryQueryContext;
import org.elasticsearch.search.suggest.completion.context.ContextMapping;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.CompletionContext;
import org.springframework.data.elasticsearch.annotations.CompletionField;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.IndexQuery; import org.springframework.data.elasticsearch.core.query.IndexQuery;
import org.springframework.data.elasticsearch.entities.NonDocumentEntity; import org.springframework.data.elasticsearch.utils.IndexInitializer;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
/** /**
* @author Robert Gruendler * @author Robert Gruendler
* @author Peter-Josef Meisch
*/ */
@RunWith(SpringJUnit4ClassRunner.class) @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:elasticsearch-template-test.xml") @ContextConfiguration("classpath:elasticsearch-template-test.xml")
public class ElasticsearchTemplateCompletionWithContextsTests { public class ElasticsearchTemplateCompletionWithContextsTests {
@Autowired @Autowired private ElasticsearchTemplate elasticsearchTemplate;
private ElasticsearchTemplate elasticsearchTemplate;
private void loadContextCompletionObjectEntities() { private void loadContextCompletionObjectEntities() {
elasticsearchTemplate.deleteIndex(ContextCompletionEntity.class);
elasticsearchTemplate.createIndex(ContextCompletionEntity.class); IndexInitializer.init(elasticsearchTemplate, ContextCompletionEntity.class);
elasticsearchTemplate.refresh(ContextCompletionEntity.class);
elasticsearchTemplate.putMapping(ContextCompletionEntity.class);
NonDocumentEntity nonDocumentEntity = new NonDocumentEntity(); NonDocumentEntity nonDocumentEntity = new NonDocumentEntity();
nonDocumentEntity.setSomeField1("foo"); nonDocumentEntity.setSomeField1("foo");
@ -67,19 +68,23 @@ public class ElasticsearchTemplateCompletionWithContextsTests {
Map<String, List<String>> context1 = new HashMap<>(); Map<String, List<String>> context1 = new HashMap<>();
context1.put(ContextCompletionEntity.LANGUAGE_CATEGORY, Arrays.asList("java", "elastic")); context1.put(ContextCompletionEntity.LANGUAGE_CATEGORY, Arrays.asList("java", "elastic"));
indexQueries.add(new ContextCompletionEntityBuilder("1").name("Rizwan Idrees").suggest(new String[]{"Rizwan Idrees"}, context1).buildIndex()); indexQueries.add(new ContextCompletionEntityBuilder("1").name("Rizwan Idrees")
.suggest(new String[] { "Rizwan Idrees" }, context1).buildIndex());
Map<String, List<String>> context2 = new HashMap<>(); Map<String, List<String>> context2 = new HashMap<>();
context2.put(ContextCompletionEntity.LANGUAGE_CATEGORY, Arrays.asList("kotlin", "mongo")); context2.put(ContextCompletionEntity.LANGUAGE_CATEGORY, Arrays.asList("kotlin", "mongo"));
indexQueries.add(new ContextCompletionEntityBuilder("2").name("Franck Marchand").suggest(new String[]{"Franck", "Marchand"}, context2).buildIndex()); indexQueries.add(new ContextCompletionEntityBuilder("2").name("Franck Marchand")
.suggest(new String[] { "Franck", "Marchand" }, context2).buildIndex());
Map<String, List<String>> context3 = new HashMap<>(); Map<String, List<String>> context3 = new HashMap<>();
context3.put(ContextCompletionEntity.LANGUAGE_CATEGORY, Arrays.asList("kotlin", "elastic")); context3.put(ContextCompletionEntity.LANGUAGE_CATEGORY, Arrays.asList("kotlin", "elastic"));
indexQueries.add(new ContextCompletionEntityBuilder("3").name("Mohsin Husen").suggest(new String[]{"Mohsin", "Husen"}, context3).buildIndex()); indexQueries.add(new ContextCompletionEntityBuilder("3").name("Mohsin Husen")
.suggest(new String[] { "Mohsin", "Husen" }, context3).buildIndex());
Map<String, List<String>> context4 = new HashMap<>(); Map<String, List<String>> context4 = new HashMap<>();
context4.put(ContextCompletionEntity.LANGUAGE_CATEGORY, Arrays.asList("java", "kotlin", "redis")); context4.put(ContextCompletionEntity.LANGUAGE_CATEGORY, Arrays.asList("java", "kotlin", "redis"));
indexQueries.add(new ContextCompletionEntityBuilder("4").name("Artur Konczak").suggest(new String[]{"Artur", "Konczak"}, context4).buildIndex()); indexQueries.add(new ContextCompletionEntityBuilder("4").name("Artur Konczak")
.suggest(new String[] { "Artur", "Konczak" }, context4).buildIndex());
elasticsearchTemplate.bulkIndex(indexQueries); elasticsearchTemplate.bulkIndex(indexQueries);
elasticsearchTemplate.refresh(ContextCompletionEntity.class); elasticsearchTemplate.refresh(ContextCompletionEntity.class);
@ -87,19 +92,22 @@ public class ElasticsearchTemplateCompletionWithContextsTests {
@Test @Test
public void shouldPutMappingForGivenEntity() throws Exception { public void shouldPutMappingForGivenEntity() throws Exception {
//given
Class entity = ContextCompletionEntity.class; // given
Class<?> entity = ContextCompletionEntity.class;
elasticsearchTemplate.createIndex(entity); elasticsearchTemplate.createIndex(entity);
//when // when
assertThat(elasticsearchTemplate.putMapping(entity), is(true)); assertThat(elasticsearchTemplate.putMapping(entity)).isTrue();
} }
@Test // DATAES-536 @Test // DATAES-536
public void shouldFindSuggestionsForGivenCriteriaQueryUsingContextCompletionEntityOfMongo() { public void shouldFindSuggestionsForGivenCriteriaQueryUsingContextCompletionEntityOfMongo() {
//given
// given
loadContextCompletionObjectEntities(); loadContextCompletionObjectEntities();
SuggestionBuilder completionSuggestionFuzzyBuilder = SuggestBuilders.completionSuggestion("suggest").prefix("m", Fuzziness.AUTO); SuggestionBuilder completionSuggestionFuzzyBuilder = SuggestBuilders.completionSuggestion("suggest").prefix("m",
Fuzziness.AUTO);
Map<String, List<? extends ToXContent>> contextMap = new HashMap<>(); Map<String, List<? extends ToXContent>> contextMap = new HashMap<>();
List<CategoryQueryContext> contexts = new ArrayList<>(1); List<CategoryQueryContext> contexts = new ArrayList<>(1);
@ -112,22 +120,26 @@ public class ElasticsearchTemplateCompletionWithContextsTests {
((CompletionSuggestionBuilder) completionSuggestionFuzzyBuilder).contexts(contextMap); ((CompletionSuggestionBuilder) completionSuggestionFuzzyBuilder).contexts(contextMap);
//when // when
final SearchResponse suggestResponse = elasticsearchTemplate.suggest(new SuggestBuilder().addSuggestion("test-suggest", completionSuggestionFuzzyBuilder), ContextCompletionEntity.class); final SearchResponse suggestResponse = elasticsearchTemplate.suggest(
assertNotNull(suggestResponse.getSuggest()); new SuggestBuilder().addSuggestion("test-suggest", completionSuggestionFuzzyBuilder),
ContextCompletionEntity.class);
assertThat(suggestResponse.getSuggest()).isNotNull();
CompletionSuggestion completionSuggestion = suggestResponse.getSuggest().getSuggestion("test-suggest"); CompletionSuggestion completionSuggestion = suggestResponse.getSuggest().getSuggestion("test-suggest");
List<CompletionSuggestion.Entry.Option> options = completionSuggestion.getEntries().get(0).getOptions(); List<CompletionSuggestion.Entry.Option> options = completionSuggestion.getEntries().get(0).getOptions();
//then // then
assertThat(options.size(), is(1)); assertThat(options).hasSize(1);
assertThat(options.get(0).getText().string(), isOneOf("Marchand")); assertThat(options.get(0).getText().string()).isEqualTo("Marchand");
} }
@Test // DATAES-536 @Test // DATAES-536
public void shouldFindSuggestionsForGivenCriteriaQueryUsingContextCompletionEntityOfElastic() { public void shouldFindSuggestionsForGivenCriteriaQueryUsingContextCompletionEntityOfElastic() {
//given
// given
loadContextCompletionObjectEntities(); loadContextCompletionObjectEntities();
SuggestionBuilder completionSuggestionFuzzyBuilder = SuggestBuilders.completionSuggestion("suggest").prefix("m", Fuzziness.AUTO); SuggestionBuilder completionSuggestionFuzzyBuilder = SuggestBuilders.completionSuggestion("suggest").prefix("m",
Fuzziness.AUTO);
Map<String, List<? extends ToXContent>> contextMap = new HashMap<>(); Map<String, List<? extends ToXContent>> contextMap = new HashMap<>();
List<CategoryQueryContext> contexts = new ArrayList<>(1); List<CategoryQueryContext> contexts = new ArrayList<>(1);
@ -140,22 +152,26 @@ public class ElasticsearchTemplateCompletionWithContextsTests {
((CompletionSuggestionBuilder) completionSuggestionFuzzyBuilder).contexts(contextMap); ((CompletionSuggestionBuilder) completionSuggestionFuzzyBuilder).contexts(contextMap);
//when // when
final SearchResponse suggestResponse = elasticsearchTemplate.suggest(new SuggestBuilder().addSuggestion("test-suggest", completionSuggestionFuzzyBuilder), ContextCompletionEntity.class); final SearchResponse suggestResponse = elasticsearchTemplate.suggest(
assertNotNull(suggestResponse.getSuggest()); new SuggestBuilder().addSuggestion("test-suggest", completionSuggestionFuzzyBuilder),
ContextCompletionEntity.class);
assertThat(suggestResponse.getSuggest()).isNotNull();
CompletionSuggestion completionSuggestion = suggestResponse.getSuggest().getSuggestion("test-suggest"); CompletionSuggestion completionSuggestion = suggestResponse.getSuggest().getSuggestion("test-suggest");
List<CompletionSuggestion.Entry.Option> options = completionSuggestion.getEntries().get(0).getOptions(); List<CompletionSuggestion.Entry.Option> options = completionSuggestion.getEntries().get(0).getOptions();
//then // then
assertThat(options.size(), is(1)); assertThat(options).hasSize(1);
assertThat(options.get(0).getText().string(), isOneOf( "Mohsin")); assertThat(options.get(0).getText().string()).isEqualTo("Mohsin");
} }
@Test // DATAES-536 @Test // DATAES-536
public void shouldFindSuggestionsForGivenCriteriaQueryUsingContextCompletionEntityOfKotlin() { public void shouldFindSuggestionsForGivenCriteriaQueryUsingContextCompletionEntityOfKotlin() {
//given
// given
loadContextCompletionObjectEntities(); loadContextCompletionObjectEntities();
SuggestionBuilder completionSuggestionFuzzyBuilder = SuggestBuilders.completionSuggestion("suggest").prefix("m", Fuzziness.AUTO); SuggestionBuilder completionSuggestionFuzzyBuilder = SuggestBuilders.completionSuggestion("suggest").prefix("m",
Fuzziness.AUTO);
Map<String, List<? extends ToXContent>> contextMap = new HashMap<>(); Map<String, List<? extends ToXContent>> contextMap = new HashMap<>();
List<CategoryQueryContext> contexts = new ArrayList<>(1); List<CategoryQueryContext> contexts = new ArrayList<>(1);
@ -168,15 +184,127 @@ public class ElasticsearchTemplateCompletionWithContextsTests {
((CompletionSuggestionBuilder) completionSuggestionFuzzyBuilder).contexts(contextMap); ((CompletionSuggestionBuilder) completionSuggestionFuzzyBuilder).contexts(contextMap);
//when // when
final SearchResponse suggestResponse = elasticsearchTemplate.suggest(new SuggestBuilder().addSuggestion("test-suggest", completionSuggestionFuzzyBuilder), ContextCompletionEntity.class); final SearchResponse suggestResponse = elasticsearchTemplate.suggest(
assertNotNull(suggestResponse.getSuggest()); new SuggestBuilder().addSuggestion("test-suggest", completionSuggestionFuzzyBuilder),
ContextCompletionEntity.class);
assertThat(suggestResponse.getSuggest()).isNotNull();
CompletionSuggestion completionSuggestion = suggestResponse.getSuggest().getSuggestion("test-suggest"); CompletionSuggestion completionSuggestion = suggestResponse.getSuggest().getSuggestion("test-suggest");
List<CompletionSuggestion.Entry.Option> options = completionSuggestion.getEntries().get(0).getOptions(); List<CompletionSuggestion.Entry.Option> options = completionSuggestion.getEntries().get(0).getOptions();
//then // then
assertThat(options.size(), is(2)); assertThat(options).hasSize(2);
assertThat(options.get(0).getText().string(), isOneOf("Marchand", "Mohsin")); assertThat(options.get(0).getText().string()).isIn("Marchand", "Mohsin");
assertThat(options.get(1).getText().string(), isOneOf("Marchand", "Mohsin")); assertThat(options.get(1).getText().string()).isIn("Marchand", "Mohsin");
} }
/**
* @author Rizwan Idrees
* @author Mohsin Husen
*/
static class NonDocumentEntity {
@Id private String someId;
private String someField1;
private String someField2;
public String getSomeField1() {
return someField1;
}
public void setSomeField1(String someField1) {
this.someField1 = someField1;
}
public String getSomeField2() {
return someField2;
}
public void setSomeField2(String someField2) {
this.someField2 = someField2;
}
}
/**
* @author Mewes Kochheim
* @author Robert Gruendler
*/
@Document(indexName = "test-index-context-completion", type = "context-completion-type", shards = 1, replicas = 0,
refreshInterval = "-1")
static class ContextCompletionEntity {
public static final String LANGUAGE_CATEGORY = "language";
@Id private String id;
private String name;
@CompletionField(maxInputLength = 100, contexts = {
@CompletionContext(name = LANGUAGE_CATEGORY, type = ContextMapping.Type.CATEGORY) }) private Completion suggest;
private ContextCompletionEntity() {}
public ContextCompletionEntity(String id) {
this.id = id;
}
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 Completion getSuggest() {
return suggest;
}
public void setSuggest(Completion suggest) {
this.suggest = suggest;
}
}
/**
* @author Robert Gruendler
*/
static class ContextCompletionEntityBuilder {
private ContextCompletionEntity result;
public ContextCompletionEntityBuilder(String id) {
result = new ContextCompletionEntity(id);
}
public ContextCompletionEntityBuilder name(String name) {
result.setName(name);
return this;
}
public ContextCompletionEntityBuilder suggest(String[] input, Map<String, List<String>> contexts) {
Completion suggest = new Completion(input);
suggest.setContexts(contexts);
result.setSuggest(suggest);
return this;
}
public ContextCompletionEntity build() {
return result;
}
public IndexQuery buildIndex() {
IndexQuery indexQuery = new IndexQuery();
indexQuery.setId(result.getId());
indexQuery.setObject(result);
return indexQuery;
}
}
} }

View File

@ -15,8 +15,7 @@
*/ */
package org.springframework.data.elasticsearch.core.convert; package org.springframework.data.elasticsearch.core.convert;
import static org.hamcrest.Matchers.*; import static org.assertj.core.api.Assertions.*;
import static org.junit.Assert.*;
import org.junit.Test; import org.junit.Test;
import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.ConversionService;
@ -26,32 +25,40 @@ import org.springframework.data.mapping.context.MappingContext;
/** /**
* @author Rizwan Idrees * @author Rizwan Idrees
* @author Mohsin Husen * @author Mohsin Husen
* @author Peter-Josef Meisch
*/ */
public class MappingElasticsearchConverterTests { public class MappingElasticsearchConverterTests {
@Test(expected = IllegalArgumentException.class) @Test(expected = IllegalArgumentException.class)
public void shouldFailToInitializeGivenMappingContextIsNull() { public void shouldFailToInitializeGivenMappingContextIsNull() {
// given // given
new MappingElasticsearchConverter(null); new MappingElasticsearchConverter(null);
} }
@Test @Test
public void shouldReturnMappingContextWithWhichItWasInitialized() { public void shouldReturnMappingContextWithWhichItWasInitialized() {
// given // given
MappingContext mappingContext = new SimpleElasticsearchMappingContext(); MappingContext mappingContext = new SimpleElasticsearchMappingContext();
MappingElasticsearchConverter converter = new MappingElasticsearchConverter(mappingContext); MappingElasticsearchConverter converter = new MappingElasticsearchConverter(mappingContext);
// then // then
assertThat(converter.getMappingContext(), is(notNullValue())); assertThat(converter.getMappingContext()).isNotNull();
assertThat(converter.getMappingContext(), is(sameInstance(mappingContext))); assertThat(converter.getMappingContext()).isSameAs(mappingContext);
} }
@Test @Test
public void shouldReturnDefaultConversionService() { public void shouldReturnDefaultConversionService() {
// given // given
MappingElasticsearchConverter converter = new MappingElasticsearchConverter(new SimpleElasticsearchMappingContext()); MappingElasticsearchConverter converter = new MappingElasticsearchConverter(
new SimpleElasticsearchMappingContext());
// when // when
ConversionService conversionService = converter.getConversionService(); ConversionService conversionService = converter.getConversionService();
// then // then
assertThat(conversionService, is(notNullValue())); assertThat(conversionService).isNotNull();
} }
} }

View File

@ -1,111 +0,0 @@
/*
* Copyright 2014-2019 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
*
* https://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.core.facet;
import static org.springframework.data.elasticsearch.annotations.FieldType.Integer;
import static org.springframework.data.elasticsearch.annotations.FieldType.Text;
import java.util.ArrayList;
import java.util.List;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.*;
/**
* Simple type to test facets
*
* @author Artur Konczak
* @author Mohsin Husen
*/
@Document(indexName = "test-index-articles", type = "article", shards = 1, replicas = 0, refreshInterval = "-1")
public class ArticleEntity {
@Id
private String id;
private String title;
@Field(type = Text, fielddata = true)
private String subject;
@MultiField(
mainField = @Field(type = Text),
otherFields = {
@InnerField(suffix = "untouched", type = Text, store = true, fielddata = true, analyzer = "keyword"),
@InnerField(suffix = "sort", type = Text, store = true, analyzer = "keyword")
}
)
private List<String> authors = new ArrayList<>();
@Field(type = Integer, store = true)
private List<Integer> publishedYears = new ArrayList<>();
private int score;
private ArticleEntity() {
}
public ArticleEntity(String id) {
this.id = id;
}
public void setId(String id) {
this.id = id;
}
public String getId() {
return id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public List<String> getAuthors() {
return authors;
}
public void setAuthors(List<String> authors) {
this.authors = authors;
}
public List<Integer> getPublishedYears() {
return publishedYears;
}
public void setPublishedYears(List<Integer> publishedYears) {
this.publishedYears = publishedYears;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
}

View File

@ -1,69 +0,0 @@
/*
* Copyright 2014-2019 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
*
* https://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.core.facet;
import org.springframework.data.elasticsearch.core.query.IndexQuery;
/**
* Simple type to test facets
*
* @author Artur Konczak
* @author Mohsin Husen
*/
public class ArticleEntityBuilder {
private ArticleEntity result;
public ArticleEntityBuilder(String id) {
result = new ArticleEntity(id);
}
public ArticleEntityBuilder title(String title) {
result.setTitle(title);
return this;
}
public ArticleEntityBuilder subject(String subject) {
result.setSubject(subject);
return this;
}
public ArticleEntityBuilder addAuthor(String author) {
result.getAuthors().add(author);
return this;
}
public ArticleEntityBuilder addPublishedYear(Integer year) {
result.getPublishedYears().add(year);
return this;
}
public ArticleEntityBuilder score(int score) {
result.setScore(score);
return this;
}
public ArticleEntity build() {
return result;
}
public IndexQuery buildIndex() {
IndexQuery indexQuery = new IndexQuery();
indexQuery.setId(result.getId());
indexQuery.setObject(result);
return indexQuery;
}
}

View File

@ -16,10 +16,22 @@
package org.springframework.data.elasticsearch.core.facet; package org.springframework.data.elasticsearch.core.facet;
import static org.assertj.core.api.Assertions.*;
import static org.elasticsearch.index.query.QueryBuilders.*;
import java.util.ArrayList;
import java.util.List;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import org.springframework.data.elasticsearch.annotations.InnerField;
import org.springframework.data.elasticsearch.annotations.MultiField;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.FacetedPage; import org.springframework.data.elasticsearch.core.FacetedPage;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage; import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
@ -38,19 +50,17 @@ import org.springframework.data.elasticsearch.core.facet.result.TermResult;
import org.springframework.data.elasticsearch.core.query.IndexQuery; import org.springframework.data.elasticsearch.core.query.IndexQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.query.SearchQuery; import org.springframework.data.elasticsearch.core.query.SearchQuery;
import org.springframework.data.elasticsearch.utils.IndexInitializer;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import static org.elasticsearch.index.query.QueryBuilders.*;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
/** /**
* @author Rizwan Idrees * @author Rizwan Idrees
* @author Mohsin Husen * @author Mohsin Husen
* @author Jonathan Yan * @author Jonathan Yan
* @author Artur Konczak * @author Artur Konczak
* @author Peter-Josef Meisch
*/ */
@RunWith(SpringJUnit4ClassRunner.class) @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:elasticsearch-template-test.xml") @ContextConfiguration("classpath:elasticsearch-template-test.xml")
public class ElasticsearchTemplateFacetTests { public class ElasticsearchTemplateFacetTests {
@ -63,20 +73,22 @@ public class ElasticsearchTemplateFacetTests {
private static final int YEAR_2001 = 2001; private static final int YEAR_2001 = 2001;
private static final int YEAR_2000 = 2000; private static final int YEAR_2000 = 2000;
private static final String PUBLISHED_YEARS = "publishedYears"; private static final String PUBLISHED_YEARS = "publishedYears";
@Autowired
private ElasticsearchTemplate elasticsearchTemplate; @Autowired private ElasticsearchTemplate elasticsearchTemplate;
@Before @Before
public void before() { public void before() {
elasticsearchTemplate.deleteIndex(ArticleEntity.class);
elasticsearchTemplate.createIndex(ArticleEntity.class);
elasticsearchTemplate.putMapping(ArticleEntity.class);
elasticsearchTemplate.refresh(ArticleEntity.class);
IndexQuery article1 = new ArticleEntityBuilder("1").title("article four").addAuthor(RIZWAN_IDREES).addAuthor(ARTUR_KONCZAK).addAuthor(MOHSIN_HUSEN).addAuthor(JONATHAN_YAN).score(10).buildIndex(); IndexInitializer.init(elasticsearchTemplate, ArticleEntity.class);
IndexQuery article2 = new ArticleEntityBuilder("2").title("article three").addAuthor(RIZWAN_IDREES).addAuthor(ARTUR_KONCZAK).addAuthor(MOHSIN_HUSEN).addPublishedYear(YEAR_2000).score(20).buildIndex();
IndexQuery article3 = new ArticleEntityBuilder("3").title("article two").addAuthor(RIZWAN_IDREES).addAuthor(ARTUR_KONCZAK).addPublishedYear(YEAR_2001).addPublishedYear(YEAR_2000).score(30).buildIndex(); IndexQuery article1 = new ArticleEntityBuilder("1").title("article four").addAuthor(RIZWAN_IDREES)
IndexQuery article4 = new ArticleEntityBuilder("4").title("article one").addAuthor(RIZWAN_IDREES).addPublishedYear(YEAR_2002).addPublishedYear(YEAR_2001).addPublishedYear(YEAR_2000).score(40).buildIndex(); .addAuthor(ARTUR_KONCZAK).addAuthor(MOHSIN_HUSEN).addAuthor(JONATHAN_YAN).score(10).buildIndex();
IndexQuery article2 = new ArticleEntityBuilder("2").title("article three").addAuthor(RIZWAN_IDREES)
.addAuthor(ARTUR_KONCZAK).addAuthor(MOHSIN_HUSEN).addPublishedYear(YEAR_2000).score(20).buildIndex();
IndexQuery article3 = new ArticleEntityBuilder("3").title("article two").addAuthor(RIZWAN_IDREES)
.addAuthor(ARTUR_KONCZAK).addPublishedYear(YEAR_2001).addPublishedYear(YEAR_2000).score(30).buildIndex();
IndexQuery article4 = new ArticleEntityBuilder("4").title("article one").addAuthor(RIZWAN_IDREES)
.addPublishedYear(YEAR_2002).addPublishedYear(YEAR_2001).addPublishedYear(YEAR_2000).score(40).buildIndex();
elasticsearchTemplate.index(article1); elasticsearchTemplate.index(article1);
elasticsearchTemplate.index(article2); elasticsearchTemplate.index(article2);
@ -90,32 +102,34 @@ public class ElasticsearchTemplateFacetTests {
// given // given
String facetName = "fauthors"; String facetName = "fauthors";
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withFacet(new TermFacetRequestBuilder(facetName).fields("authors.untouched").build()).build(); SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery())
.withFacet(new TermFacetRequestBuilder(facetName).fields("authors.untouched").build()).build();
// when // when
FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class);
// then // then
assertThat(result.getNumberOfElements(), is(equalTo(4))); assertThat(result.getNumberOfElements()).isEqualTo(4);
TermResult facet = (TermResult) result.getFacet(facetName); TermResult facet = (TermResult) result.getFacet(facetName);
Term term = facet.getTerms().get(0); Term term = facet.getTerms().get(0);
assertThat(term.getTerm(), is(RIZWAN_IDREES)); assertThat(term.getTerm()).isEqualTo(RIZWAN_IDREES);
assertThat(term.getCount(), is(4l)); assertThat(term.getCount()).isEqualTo(4);
term = facet.getTerms().get(1); term = facet.getTerms().get(1);
assertThat(term.getTerm(), is(ARTUR_KONCZAK)); assertThat(term.getTerm()).isEqualTo(ARTUR_KONCZAK);
assertThat(term.getCount(), is(3l)); assertThat(term.getCount()).isEqualTo(3);
term = facet.getTerms().get(2); term = facet.getTerms().get(2);
assertThat(term.getTerm(), is(MOHSIN_HUSEN)); assertThat(term.getTerm()).isEqualTo(MOHSIN_HUSEN);
assertThat(term.getCount(), is(2l)); assertThat(term.getCount()).isEqualTo(2);
term = facet.getTerms().get(3); term = facet.getTerms().get(3);
assertThat(term.getTerm(), is(JONATHAN_YAN)); assertThat(term.getTerm()).isEqualTo(JONATHAN_YAN);
assertThat(term.getCount(), is(1l)); assertThat(term.getCount()).isEqualTo(1);
assertThat(facet.getTotal(), is(4l)); assertThat(facet.getTotal()).isEqualTo(4);
assertThat(facet.getOther(), is(0l)); assertThat(facet.getOther()).isEqualTo(0);
assertThat(facet.getMissing(), is(0l)); assertThat(facet.getMissing()).isEqualTo(0);
} }
@Test @Test
@ -124,56 +138,63 @@ public class ElasticsearchTemplateFacetTests {
// given // given
String facetName = "fauthors"; String facetName = "fauthors";
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery())
.withFacet(new TermFacetRequestBuilder(facetName).applyQueryFilter().fields("authors.untouched").build()).build(); .withFacet(new TermFacetRequestBuilder(facetName).applyQueryFilter().fields("authors.untouched").build())
.build();
// when // when
FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class);
// then // then
assertThat(result.getNumberOfElements(), is(equalTo(4))); assertThat(result.getNumberOfElements()).isEqualTo(4);
TermResult facet = (TermResult) result.getFacet(facetName); TermResult facet = (TermResult) result.getFacet(facetName);
Term term = facet.getTerms().get(0); Term term = facet.getTerms().get(0);
assertThat(term.getTerm(), is(RIZWAN_IDREES)); assertThat(term.getTerm()).isEqualTo(RIZWAN_IDREES);
assertThat(term.getCount(), is(4l)); assertThat(term.getCount()).isEqualTo(4);
term = facet.getTerms().get(1); term = facet.getTerms().get(1);
assertThat(term.getTerm(), is(ARTUR_KONCZAK)); assertThat(term.getTerm()).isEqualTo(ARTUR_KONCZAK);
assertThat(term.getCount(), is(3l)); assertThat(term.getCount()).isEqualTo(3);
term = facet.getTerms().get(2); term = facet.getTerms().get(2);
assertThat(term.getTerm(), is(MOHSIN_HUSEN)); assertThat(term.getTerm()).isEqualTo(MOHSIN_HUSEN);
assertThat(term.getCount(), is(2l)); assertThat(term.getCount()).isEqualTo(2);
assertThat(facet.getTotal(), is(4l)); assertThat(facet.getTotal()).isEqualTo(4);
assertThat(facet.getOther(), is(0l)); assertThat(facet.getOther()).isEqualTo(0);
assertThat(facet.getMissing(), is(0l)); assertThat(facet.getMissing()).isEqualTo(0);
} }
@Test @Test
public void shouldExcludeTermsFromFacetedAuthorsForGivenQuery() { public void shouldExcludeTermsFromFacetedAuthorsForGivenQuery() {
// given // given
String facetName = "fauthors"; String facetName = "fauthors";
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery())
.withFacet(new TermFacetRequestBuilder(facetName).applyQueryFilter().fields("authors.untouched").excludeTerms(RIZWAN_IDREES, ARTUR_KONCZAK).build()).build(); .withFacet(new TermFacetRequestBuilder(facetName).applyQueryFilter().fields("authors.untouched")
.excludeTerms(RIZWAN_IDREES, ARTUR_KONCZAK).build())
.build();
// when // when
FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class);
// then // then
assertThat(result.getNumberOfElements(), is(equalTo(4))); assertThat(result.getNumberOfElements()).isEqualTo(4);
TermResult facet = (TermResult) result.getFacet(facetName); TermResult facet = (TermResult) result.getFacet(facetName);
assertThat(facet.getTerms().size(), is(2)); assertThat(facet.getTerms()).hasSize(2);
Term term = facet.getTerms().get(0); Term term = facet.getTerms().get(0);
assertThat(term.getTerm(), is(MOHSIN_HUSEN)); assertThat(term.getTerm()).isEqualTo(MOHSIN_HUSEN);
assertThat(term.getCount(), is(2l)); assertThat(term.getCount()).isEqualTo(2);
Term term1 = facet.getTerms().get(1); Term term1 = facet.getTerms().get(1);
assertThat(term1.getTerm(), is(JONATHAN_YAN)); assertThat(term1.getTerm()).isEqualTo(JONATHAN_YAN);
assertThat(term1.getCount(), is(1l)); assertThat(term1.getCount()).isEqualTo(1);
assertThat(facet.getTotal(), is(2l)); assertThat(facet.getTotal()).isEqualTo(2);
assertThat(facet.getOther(), is(0l)); assertThat(facet.getOther()).isEqualTo(0);
assertThat(facet.getMissing(), is(0l)); assertThat(facet.getMissing()).isEqualTo(0);
} }
@Test @Test
@ -183,31 +204,33 @@ public class ElasticsearchTemplateFacetTests {
String facetName = "fauthors"; String facetName = "fauthors";
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery())
.withFacet(new TermFacetRequestBuilder(facetName).fields("authors.untouched").ascTerm().build()).build(); .withFacet(new TermFacetRequestBuilder(facetName).fields("authors.untouched").ascTerm().build()).build();
// when // when
FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class);
// then // then
assertThat(result.getNumberOfElements(), is(equalTo(4))); assertThat(result.getNumberOfElements()).isEqualTo(4);
TermResult facet = (TermResult) result.getFacet(facetName); TermResult facet = (TermResult) result.getFacet(facetName);
Term term = facet.getTerms().get(0); Term term = facet.getTerms().get(0);
assertThat(term.getTerm(), is(ARTUR_KONCZAK)); assertThat(term.getTerm()).isEqualTo(ARTUR_KONCZAK);
assertThat(term.getCount(), is(3l)); assertThat(term.getCount()).isEqualTo(3);
term = facet.getTerms().get(1); term = facet.getTerms().get(1);
assertThat(term.getTerm(), is(JONATHAN_YAN)); assertThat(term.getTerm()).isEqualTo(JONATHAN_YAN);
assertThat(term.getCount(), is(1l)); assertThat(term.getCount()).isEqualTo(1);
term = facet.getTerms().get(2); term = facet.getTerms().get(2);
assertThat(term.getTerm(), is(MOHSIN_HUSEN)); assertThat(term.getTerm()).isEqualTo(MOHSIN_HUSEN);
assertThat(term.getCount(), is(2l)); assertThat(term.getCount()).isEqualTo(2);
term = facet.getTerms().get(3); term = facet.getTerms().get(3);
assertThat(term.getTerm(), is(RIZWAN_IDREES)); assertThat(term.getTerm()).isEqualTo(RIZWAN_IDREES);
assertThat(term.getCount(), is(4l)); assertThat(term.getCount()).isEqualTo(4);
assertThat(facet.getTotal(), is(4l)); assertThat(facet.getTotal()).isEqualTo(4);
assertThat(facet.getOther(), is(0l)); assertThat(facet.getOther()).isEqualTo(0);
assertThat(facet.getMissing(), is(0l)); assertThat(facet.getMissing()).isEqualTo(0);
} }
@Test @Test
@ -217,31 +240,33 @@ public class ElasticsearchTemplateFacetTests {
String facetName = "fauthors"; String facetName = "fauthors";
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery())
.withFacet(new TermFacetRequestBuilder(facetName).fields("authors.untouched").ascCount().build()).build(); .withFacet(new TermFacetRequestBuilder(facetName).fields("authors.untouched").ascCount().build()).build();
// when // when
FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class);
// then // then
assertThat(result.getNumberOfElements(), is(equalTo(4))); assertThat(result.getNumberOfElements()).isEqualTo(4);
TermResult facet = (TermResult) result.getFacet(facetName); TermResult facet = (TermResult) result.getFacet(facetName);
Term term = facet.getTerms().get(0); Term term = facet.getTerms().get(0);
assertThat(term.getTerm(), is(JONATHAN_YAN)); assertThat(term.getTerm()).isEqualTo(JONATHAN_YAN);
assertThat(term.getCount(), is(1l)); assertThat(term.getCount()).isEqualTo(1);
term = facet.getTerms().get(1); term = facet.getTerms().get(1);
assertThat(term.getTerm(), is(MOHSIN_HUSEN)); assertThat(term.getTerm()).isEqualTo(MOHSIN_HUSEN);
assertThat(term.getCount(), is(2l)); assertThat(term.getCount()).isEqualTo(2);
term = facet.getTerms().get(2); term = facet.getTerms().get(2);
assertThat(term.getTerm(), is(ARTUR_KONCZAK)); assertThat(term.getTerm()).isEqualTo(ARTUR_KONCZAK);
assertThat(term.getCount(), is(3l)); assertThat(term.getCount()).isEqualTo(3);
term = facet.getTerms().get(3); term = facet.getTerms().get(3);
assertThat(term.getTerm(), is(RIZWAN_IDREES)); assertThat(term.getTerm()).isEqualTo(RIZWAN_IDREES);
assertThat(term.getCount(), is(4l)); assertThat(term.getCount()).isEqualTo(4);
assertThat(facet.getTotal(), is(4l)); assertThat(facet.getTotal()).isEqualTo(4);
assertThat(facet.getOther(), is(0l)); assertThat(facet.getOther()).isEqualTo(0);
assertThat(facet.getMissing(), is(0l)); assertThat(facet.getMissing()).isEqualTo(0);
} }
@Test @Test
@ -251,29 +276,31 @@ public class ElasticsearchTemplateFacetTests {
String facetName = "fyears"; String facetName = "fyears";
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery())
.withFacet(new TermFacetRequestBuilder(facetName).fields("publishedYears").descCount().build()).build(); .withFacet(new TermFacetRequestBuilder(facetName).fields("publishedYears").descCount().build()).build();
// when // when
FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class);
// then // then
assertThat(result.getNumberOfElements(), is(equalTo(4))); assertThat(result.getNumberOfElements()).isEqualTo(4);
TermResult facet = (TermResult) result.getFacet(facetName); TermResult facet = (TermResult) result.getFacet(facetName);
assertThat(facet.getTerms().size(), is(equalTo(3))); assertThat(facet.getTerms()).hasSize(3);
Term term = facet.getTerms().get(0); Term term = facet.getTerms().get(0);
assertThat(term.getTerm(), is(Long.toString(YEAR_2000))); assertThat(term.getTerm()).isEqualTo(Long.toString(YEAR_2000));
assertThat(term.getCount(), is(3l)); assertThat(term.getCount()).isEqualTo(3);
term = facet.getTerms().get(1); term = facet.getTerms().get(1);
assertThat(term.getTerm(), is(Long.toString(YEAR_2001))); assertThat(term.getTerm()).isEqualTo(Long.toString(YEAR_2001));
assertThat(term.getCount(), is(2l)); assertThat(term.getCount()).isEqualTo(2);
term = facet.getTerms().get(2); term = facet.getTerms().get(2);
assertThat(term.getTerm(), is(Long.toString(YEAR_2002))); assertThat(term.getTerm()).isEqualTo(Long.toString(YEAR_2002));
assertThat(term.getCount(), is(1l)); assertThat(term.getCount()).isEqualTo(1);
assertThat(facet.getTotal(), is(3l)); assertThat(facet.getTotal()).isEqualTo(3);
assertThat(facet.getOther(), is(0l)); assertThat(facet.getOther()).isEqualTo(0);
assertThat(facet.getMissing(), is(0l)); assertThat(facet.getMissing()).isEqualTo(0);
} }
@Test @Test
@ -282,79 +309,86 @@ public class ElasticsearchTemplateFacetTests {
// given // given
String facetName = "fyears"; String facetName = "fyears";
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery())
.withFacet(new TermFacetRequestBuilder(facetName).applyQueryFilter().fields("publishedYears").descCount().build()).build(); .withFacet(
new TermFacetRequestBuilder(facetName).applyQueryFilter().fields("publishedYears").descCount().build())
.build();
// when // when
FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class);
// then // then
assertThat(result.getNumberOfElements(), is(equalTo(4))); assertThat(result.getNumberOfElements()).isEqualTo(4);
TermResult facet = (TermResult) result.getFacet(facetName); TermResult facet = (TermResult) result.getFacet(facetName);
assertThat(facet.getTerms().size(), is(equalTo(3))); assertThat(facet.getTerms()).hasSize(3);
Term term = facet.getTerms().get(0); Term term = facet.getTerms().get(0);
assertThat(term.getTerm(), is(Long.toString(YEAR_2000))); assertThat(term.getTerm()).isEqualTo(Long.toString(YEAR_2000));
assertThat(term.getCount(), is(3l)); assertThat(term.getCount()).isEqualTo(3);
term = facet.getTerms().get(1); term = facet.getTerms().get(1);
assertThat(term.getTerm(), is(Long.toString(YEAR_2001))); assertThat(term.getTerm()).isEqualTo(Long.toString(YEAR_2001));
assertThat(term.getCount(), is(2l)); assertThat(term.getCount()).isEqualTo(2);
term = facet.getTerms().get(2); term = facet.getTerms().get(2);
assertThat(term.getTerm(), is(Long.toString(YEAR_2002))); assertThat(term.getTerm()).isEqualTo(Long.toString(YEAR_2002));
assertThat(term.getCount(), is(1l)); assertThat(term.getCount()).isEqualTo(1);
assertThat(facet.getTotal(), is(3l)); assertThat(facet.getTotal()).isEqualTo(3);
assertThat(facet.getOther(), is(0l)); assertThat(facet.getOther()).isEqualTo(0);
assertThat(facet.getMissing(), is(0l)); assertThat(facet.getMissing()).isEqualTo(0);
} }
@Test(expected = IllegalArgumentException.class) @Test(expected = IllegalArgumentException.class)
public void shouldThrowExeptionsForMultiFieldFacet() { public void shouldThrowExeptionsForMultiFieldFacet() {
// given // given
String facetName = "fyears"; String facetName = "fyears";
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery())
.withFacet(new TermFacetRequestBuilder(facetName).fields("publishedYears", "authors.untouched").ascTerm().build()).build(); .withFacet(
new TermFacetRequestBuilder(facetName).fields("publishedYears", "authors.untouched").ascTerm().build())
.build();
// when // when
FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class);
// then // then
assertThat(result.getNumberOfElements(), is(equalTo(4))); assertThat(result.getNumberOfElements()).isEqualTo(4);
TermResult facet = (TermResult) result.getFacet(facetName); TermResult facet = (TermResult) result.getFacet(facetName);
assertThat(facet.getTerms().size(), is(equalTo(7))); assertThat(facet.getTerms()).hasSize(7);
Term term = facet.getTerms().get(0); Term term = facet.getTerms().get(0);
assertThat(term.getTerm(), is(Long.toString(YEAR_2000))); assertThat(term.getTerm()).isEqualTo(Long.toString(YEAR_2000));
assertThat(term.getCount(), is(3l)); assertThat(term.getCount()).isEqualTo(3);
term = facet.getTerms().get(1); term = facet.getTerms().get(1);
assertThat(term.getTerm(), is(Long.toString(YEAR_2001))); assertThat(term.getTerm()).isEqualTo(Long.toString(YEAR_2001));
assertThat(term.getCount(), is(2l)); assertThat(term.getCount()).isEqualTo(2);
term = facet.getTerms().get(2); term = facet.getTerms().get(2);
assertThat(term.getTerm(), is(Long.toString(YEAR_2002))); assertThat(term.getTerm()).isEqualTo(Long.toString(YEAR_2002));
assertThat(term.getCount(), is(1l)); assertThat(term.getCount()).isEqualTo(1);
term = facet.getTerms().get(3); term = facet.getTerms().get(3);
assertThat(term.getTerm(), is(ARTUR_KONCZAK)); assertThat(term.getTerm()).isEqualTo(ARTUR_KONCZAK);
assertThat(term.getCount(), is(3l)); assertThat(term.getCount()).isEqualTo(3);
term = facet.getTerms().get(4); term = facet.getTerms().get(4);
assertThat(term.getTerm(), is(JONATHAN_YAN)); assertThat(term.getTerm()).isEqualTo(JONATHAN_YAN);
assertThat(term.getCount(), is(1l)); assertThat(term.getCount()).isEqualTo(1);
term = facet.getTerms().get(5); term = facet.getTerms().get(5);
assertThat(term.getTerm(), is(MOHSIN_HUSEN)); assertThat(term.getTerm()).isEqualTo(MOHSIN_HUSEN);
assertThat(term.getCount(), is(2l)); assertThat(term.getCount()).isEqualTo(2);
term = facet.getTerms().get(6); term = facet.getTerms().get(6);
assertThat(term.getTerm(), is(RIZWAN_IDREES)); assertThat(term.getTerm()).isEqualTo(RIZWAN_IDREES);
assertThat(term.getCount(), is(4l)); assertThat(term.getCount()).isEqualTo(4);
assertThat(facet.getTotal(), is(16l)); assertThat(facet.getTotal()).isEqualTo(16);
assertThat(facet.getOther(), is(0l)); assertThat(facet.getOther()).isEqualTo(0);
assertThat(facet.getMissing(), is(1l)); assertThat(facet.getMissing()).isEqualTo(1);
} }
@Test @Test
@ -365,51 +399,51 @@ public class ElasticsearchTemplateFacetTests {
String stringFacetName = "fyears"; String stringFacetName = "fyears";
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery())
.withFacet(new TermFacetRequestBuilder(numberFacetName).fields("publishedYears").ascTerm().build()) .withFacet(new TermFacetRequestBuilder(numberFacetName).fields("publishedYears").ascTerm().build())
.withFacet(new TermFacetRequestBuilder(stringFacetName).fields("authors.untouched").ascTerm().build()) .withFacet(new TermFacetRequestBuilder(stringFacetName).fields("authors.untouched").ascTerm().build()).build();
.build();
// when // when
FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class);
// then // then
assertThat(result.getNumberOfElements(), is(equalTo(4))); assertThat(result.getNumberOfElements()).isEqualTo(4);
TermResult numberFacet = (TermResult) result.getFacet(numberFacetName); TermResult numberFacet = (TermResult) result.getFacet(numberFacetName);
assertThat(numberFacet.getTerms().size(), is(equalTo(3))); assertThat(numberFacet.getTerms()).hasSize(3);
Term numberTerm = numberFacet.getTerms().get(0); Term numberTerm = numberFacet.getTerms().get(0);
assertThat(numberTerm.getTerm(), is(Long.toString(YEAR_2000))); assertThat(numberTerm.getTerm()).isEqualTo(Long.toString(YEAR_2000));
assertThat(numberTerm.getCount(), is(3l)); assertThat(numberTerm.getCount()).isEqualTo(3);
numberTerm = numberFacet.getTerms().get(1); numberTerm = numberFacet.getTerms().get(1);
assertThat(numberTerm.getTerm(), is(Long.toString(YEAR_2001))); assertThat(numberTerm.getTerm()).isEqualTo(Long.toString(YEAR_2001));
assertThat(numberTerm.getCount(), is(2l)); assertThat(numberTerm.getCount()).isEqualTo(2);
numberTerm = numberFacet.getTerms().get(2); numberTerm = numberFacet.getTerms().get(2);
assertThat(numberTerm.getTerm(), is(Long.toString(YEAR_2002))); assertThat(numberTerm.getTerm()).isEqualTo(Long.toString(YEAR_2002));
assertThat(numberTerm.getCount(), is(1l)); assertThat(numberTerm.getCount()).isEqualTo(1);
TermResult stringFacet = (TermResult) result.getFacet(stringFacetName); TermResult stringFacet = (TermResult) result.getFacet(stringFacetName);
Term stringTerm = stringFacet.getTerms().get(0); Term stringTerm = stringFacet.getTerms().get(0);
assertThat(stringTerm.getTerm(), is(ARTUR_KONCZAK)); assertThat(stringTerm.getTerm()).isEqualTo(ARTUR_KONCZAK);
assertThat(stringTerm.getCount(), is(3l)); assertThat(stringTerm.getCount()).isEqualTo(3);
stringTerm = stringFacet.getTerms().get(1); stringTerm = stringFacet.getTerms().get(1);
assertThat(stringTerm.getTerm(), is(JONATHAN_YAN)); assertThat(stringTerm.getTerm()).isEqualTo(JONATHAN_YAN);
assertThat(stringTerm.getCount(), is(1l)); assertThat(stringTerm.getCount()).isEqualTo(1);
stringTerm = stringFacet.getTerms().get(2); stringTerm = stringFacet.getTerms().get(2);
assertThat(stringTerm.getTerm(), is(MOHSIN_HUSEN)); assertThat(stringTerm.getTerm()).isEqualTo(MOHSIN_HUSEN);
assertThat(stringTerm.getCount(), is(2l)); assertThat(stringTerm.getCount()).isEqualTo(2);
stringTerm = stringFacet.getTerms().get(3); stringTerm = stringFacet.getTerms().get(3);
assertThat(stringTerm.getTerm(), is(RIZWAN_IDREES)); assertThat(stringTerm.getTerm()).isEqualTo(RIZWAN_IDREES);
assertThat(stringTerm.getCount(), is(4l)); assertThat(stringTerm.getCount()).isEqualTo(4);
assertThat(stringFacet.getTotal(), is(4l)); assertThat(stringFacet.getTotal()).isEqualTo(4);
assertThat(stringFacet.getOther(), is(0l)); assertThat(stringFacet.getOther()).isEqualTo(0);
assertThat(stringFacet.getMissing(), is(0l)); assertThat(stringFacet.getMissing()).isEqualTo(0);
} }
@Test(expected = UnsupportedOperationException.class) @Test(expected = UnsupportedOperationException.class)
public void shouldThrowExceptionForNativeFacets() { public void shouldThrowExceptionForNativeFacets() {
@ -417,202 +451,351 @@ public class ElasticsearchTemplateFacetTests {
String facetName = "fyears"; String facetName = "fyears";
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery())
.withFacet(new NativeFacetRequest()).build(); .withFacet(new NativeFacetRequest()).build();
// when // when
FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class);
// then // then
assertThat(result.getNumberOfElements(), is(equalTo(4))); assertThat(result.getNumberOfElements()).isEqualTo(4);
TermResult facet = (TermResult) result.getFacet(facetName); TermResult facet = (TermResult) result.getFacet(facetName);
assertThat(facet.getTerms().size(), is(equalTo(3))); assertThat(facet.getTerms()).hasSize(3);
Term term = facet.getTerms().get(0); Term term = facet.getTerms().get(0);
assertThat(term.getTerm(), is(Long.toString(YEAR_2000))); assertThat(term.getTerm()).isEqualTo(Long.toString(YEAR_2000));
assertThat(term.getCount(), is(3l)); assertThat(term.getCount()).isEqualTo(3);
term = facet.getTerms().get(1); term = facet.getTerms().get(1);
assertThat(term.getTerm(), is(Long.toString(YEAR_2001))); assertThat(term.getTerm()).isEqualTo(Long.toString(YEAR_2001));
assertThat(term.getCount(), is(2l)); assertThat(term.getCount()).isEqualTo(2);
term = facet.getTerms().get(2); term = facet.getTerms().get(2);
assertThat(term.getTerm(), is(Long.toString(YEAR_2002))); assertThat(term.getTerm()).isEqualTo(Long.toString(YEAR_2002));
assertThat(term.getCount(), is(1l)); assertThat(term.getCount()).isEqualTo(1);
assertThat(facet.getTotal(), is(6l)); assertThat(facet.getTotal()).isEqualTo(6);
assertThat(facet.getOther(), is(0l)); assertThat(facet.getOther()).isEqualTo(0);
assertThat(facet.getMissing(), is(1l)); assertThat(facet.getMissing()).isEqualTo(1);
} }
@Test @Test
public void shouldFilterResultByRegexForGivenQuery() { public void shouldFilterResultByRegexForGivenQuery() {
// given // given
String facetName = "regex_authors"; String facetName = "regex_authors";
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withFacet(
.withFacet(new TermFacetRequestBuilder(facetName).applyQueryFilter().fields("authors.untouched").regex("Art.*").build()).build(); new TermFacetRequestBuilder(facetName).applyQueryFilter().fields("authors.untouched").regex("Art.*").build())
.build();
// when // when
FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class);
// then // then
assertThat(result.getNumberOfElements(), is(equalTo(4))); assertThat(result.getNumberOfElements()).isEqualTo(4);
TermResult facet = (TermResult) result.getFacet(facetName); TermResult facet = (TermResult) result.getFacet(facetName);
assertThat(facet.getTerms().size(), is(1)); assertThat(facet.getTerms()).hasSize(1);
Term term = facet.getTerms().get(0); Term term = facet.getTerms().get(0);
assertThat(term.getTerm(), is(ARTUR_KONCZAK)); assertThat(term.getTerm()).isEqualTo(ARTUR_KONCZAK);
assertThat(term.getCount(), is(3l)); assertThat(term.getCount()).isEqualTo(3);
assertThat(facet.getTotal(), is(1l)); assertThat(facet.getTotal()).isEqualTo(1);
assertThat(facet.getOther(), is(0l)); assertThat(facet.getOther()).isEqualTo(0);
assertThat(facet.getMissing(), is(0l)); assertThat(facet.getMissing()).isEqualTo(0);
} }
@Test @Test
public void shouldReturnAllTermsForGivenQuery() { public void shouldReturnAllTermsForGivenQuery() {
// given
// given
String facetName = "all_authors"; String facetName = "all_authors";
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery())
.withFacet(new TermFacetRequestBuilder(facetName).applyQueryFilter().fields("authors.untouched").allTerms().build()).build(); .withFacet(
new TermFacetRequestBuilder(facetName).applyQueryFilter().fields("authors.untouched").allTerms().build())
.build();
// when // when
FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class);
// then // then
assertThat(result.getNumberOfElements(), is(equalTo(4))); assertThat(result.getNumberOfElements()).isEqualTo(4);
TermResult facet = (TermResult) result.getFacet(facetName); TermResult facet = (TermResult) result.getFacet(facetName);
assertThat(facet.getTerms().size(), is(4)); assertThat(facet.getTerms()).hasSize(4);
assertThat(facet.getTotal(), is(4l)); assertThat(facet.getTotal()).isEqualTo(4);
assertThat(facet.getOther(), is(0l)); assertThat(facet.getOther()).isEqualTo(0);
assertThat(facet.getMissing(), is(0l)); assertThat(facet.getMissing()).isEqualTo(0);
} }
@Test @Test
public void shouldReturnRangeFacetForGivenQuery() { public void shouldReturnRangeFacetForGivenQuery() {
// given // given
String facetName = "rangeYears"; String facetName = "rangeYears";
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery())
.withFacet( .withFacet(new RangeFacetRequestBuilder(facetName).field(PUBLISHED_YEARS).to(YEAR_2000)
new RangeFacetRequestBuilder(facetName).field(PUBLISHED_YEARS) .range(YEAR_2000, YEAR_2002).from(YEAR_2002).build())
.to(YEAR_2000).range(YEAR_2000, YEAR_2002).from(YEAR_2002).build() .build();
).build();
// when // when
FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class);
// then // then
assertThat(result.getNumberOfElements(), is(equalTo(4))); assertThat(result.getNumberOfElements()).isEqualTo(4);
RangeResult facet = (RangeResult) result.getFacet(facetName); RangeResult facet = (RangeResult) result.getFacet(facetName);
assertThat(facet.getRanges().size(), is(equalTo(3))); assertThat(facet.getRanges()).hasSize(3);
Range range = facet.getRanges().get(0); Range range = facet.getRanges().get(0);
assertThat(range.getFrom(), is(Double.NEGATIVE_INFINITY)); assertThat(range.getFrom()).isEqualTo(Double.NEGATIVE_INFINITY);
assertThat(range.getTo(), is((double) YEAR_2000)); assertThat(range.getTo()).isEqualTo((double) YEAR_2000);
assertThat(range.getCount(), is(0L)); assertThat(range.getCount()).isEqualTo(0);
assertThat(range.getTotal(), is(0.0)); assertThat(range.getTotal()).isEqualTo(0.0);
range = facet.getRanges().get(1); range = facet.getRanges().get(1);
assertThat(range.getFrom(), is((double) YEAR_2000)); assertThat(range.getFrom()).isEqualTo((double) YEAR_2000);
assertThat(range.getTo(), is((double) YEAR_2002)); assertThat(range.getTo()).isEqualTo((double) YEAR_2002);
assertThat(range.getCount(), is(3L)); assertThat(range.getCount()).isEqualTo(3);
assertThat(range.getTotal(), is(12004.0)); assertThat(range.getTotal()).isEqualTo(12004.0);
range = facet.getRanges().get(2); range = facet.getRanges().get(2);
assertThat(range.getFrom(), is((double) YEAR_2002)); assertThat(range.getFrom()).isEqualTo((double) YEAR_2002);
assertThat(range.getTo(), is(Double.POSITIVE_INFINITY)); assertThat(range.getTo()).isEqualTo(Double.POSITIVE_INFINITY);
assertThat(range.getCount(), is(1L)); assertThat(range.getCount()).isEqualTo(1);
assertThat(range.getTotal(), is(6003.0)); assertThat(range.getTotal()).isEqualTo(6003.0);
} }
@Test @Test
public void shouldReturnKeyValueRangeFacetForStringValuesInGivenQuery() { public void shouldReturnKeyValueRangeFacetForStringValuesInGivenQuery() {
// given // given
String facetName = "rangeScoreOverYears"; String facetName = "rangeScoreOverYears";
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery())
.withFacet( .withFacet(new RangeFacetRequestBuilder(facetName).fields(PUBLISHED_YEARS, "score").to(YEAR_2000)
new RangeFacetRequestBuilder(facetName).fields(PUBLISHED_YEARS, "score") .range(YEAR_2000, YEAR_2002).from(YEAR_2002).build())
.to(YEAR_2000).range(YEAR_2000, YEAR_2002).from(YEAR_2002).build() .build();
).build();
// when // when
FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class);
// then // then
assertThat(result.getNumberOfElements(), is(equalTo(4))); assertThat(result.getNumberOfElements()).isEqualTo(4);
RangeResult facet = (RangeResult) result.getFacet(facetName); RangeResult facet = (RangeResult) result.getFacet(facetName);
assertThat(facet.getRanges().size(), is(equalTo(3))); assertThat(facet.getRanges()).hasSize(3);
Range range = facet.getRanges().get(0); Range range = facet.getRanges().get(0);
assertThat(range.getFrom(), is(Double.NEGATIVE_INFINITY)); assertThat(range.getFrom()).isEqualTo(Double.NEGATIVE_INFINITY);
assertThat(range.getTo(), is((double) YEAR_2000)); assertThat(range.getTo()).isEqualTo((double) YEAR_2000);
assertThat(range.getCount(), is(0L)); assertThat(range.getCount()).isEqualTo(0);
assertThat(range.getTotal(), is(0.0)); assertThat(range.getTotal()).isEqualTo(0.0);
range = facet.getRanges().get(1); range = facet.getRanges().get(1);
assertThat(range.getFrom(), is((double) YEAR_2000)); assertThat(range.getFrom()).isEqualTo((double) YEAR_2000);
assertThat(range.getTo(), is((double) YEAR_2002)); assertThat(range.getTo()).isEqualTo((double) YEAR_2002);
assertThat(range.getCount(), is(3L)); assertThat(range.getCount()).isEqualTo(3);
assertThat(range.getTotal(), is(90.0)); assertThat(range.getTotal()).isEqualTo(90.0);
range = facet.getRanges().get(2); range = facet.getRanges().get(2);
assertThat(range.getFrom(), is((double) YEAR_2002)); assertThat(range.getFrom()).isEqualTo((double) YEAR_2002);
assertThat(range.getTo(), is(Double.POSITIVE_INFINITY)); assertThat(range.getTo()).isEqualTo(Double.POSITIVE_INFINITY);
assertThat(range.getCount(), is(1L)); assertThat(range.getCount()).isEqualTo(1);
assertThat(range.getTotal(), is(40.0)); assertThat(range.getTotal()).isEqualTo(40.0);
} }
@Test @Test
public void shouldReturnStatisticalFacetForGivenQuery() { public void shouldReturnStatisticalFacetForGivenQuery() {
// given // given
String facetName = "statPublishedYear"; String facetName = "statPublishedYear";
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery())
.withFacet(new StatisticalFacetRequestBuilder(facetName).field(PUBLISHED_YEARS).build() .withFacet(new StatisticalFacetRequestBuilder(facetName).field(PUBLISHED_YEARS).build()).build();
).build();
// when // when
FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class);
// then // then
assertThat(result.getNumberOfElements(), is(equalTo(4))); assertThat(result.getNumberOfElements()).isEqualTo(4);
StatisticalResult facet = (StatisticalResult) result.getFacet(facetName); StatisticalResult facet = (StatisticalResult) result.getFacet(facetName);
assertThat(facet.getCount(), is(equalTo(6L))); assertThat(facet.getCount()).isEqualTo(6);
assertThat(facet.getMax(), is(equalTo(2002.0))); assertThat(facet.getMax()).isEqualTo(2002.0);
assertThat(facet.getMin(), is(equalTo(2000.0))); assertThat(facet.getMin()).isEqualTo(2000.0);
} }
@Test @Test
public void shouldReturnHistogramFacetForGivenQuery() { public void shouldReturnHistogramFacetForGivenQuery() {
// given // given
String facetName = "numberPublicationPerYear"; String facetName = "numberPublicationPerYear";
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()) SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery())
.withFacet(new HistogramFacetRequestBuilder(facetName).field(PUBLISHED_YEARS).interval(1).build() .withFacet(new HistogramFacetRequestBuilder(facetName).field(PUBLISHED_YEARS).interval(1).build()).build();
).build();
// when // when
FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); FacetedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class);
// then // then
assertThat(result.getNumberOfElements(), is(equalTo(4))); assertThat(result.getNumberOfElements()).isEqualTo(4);
HistogramResult facet = (HistogramResult) result.getFacet(facetName); HistogramResult facet = (HistogramResult) result.getFacet(facetName);
assertThat(facet.getIntervalUnit().size(), is(equalTo(3))); assertThat(facet.getIntervalUnit()).hasSize(3);
IntervalUnit unit = facet.getIntervalUnit().get(0); IntervalUnit unit = facet.getIntervalUnit().get(0);
assertThat(unit.getKey(), is(Long.valueOf(YEAR_2000))); assertThat(unit.getKey()).isEqualTo(Long.valueOf(YEAR_2000));
assertThat(unit.getCount(), is(3L)); assertThat(unit.getCount()).isEqualTo(3);
unit = facet.getIntervalUnit().get(1); unit = facet.getIntervalUnit().get(1);
assertThat(unit.getKey(), is(Long.valueOf(YEAR_2001))); assertThat(unit.getKey()).isEqualTo(Long.valueOf(YEAR_2001));
assertThat(unit.getCount(), is(2L)); assertThat(unit.getCount()).isEqualTo(2);
unit = facet.getIntervalUnit().get(2); unit = facet.getIntervalUnit().get(2);
assertThat(unit.getKey(), is(Long.valueOf(YEAR_2002))); assertThat(unit.getKey()).isEqualTo(Long.valueOf(YEAR_2002));
assertThat(unit.getCount(), is(1L)); assertThat(unit.getCount()).isEqualTo(1);
} }
@Test @Test
public void shouldNotThrowExceptionForNoFacets() public void shouldNotThrowExceptionForNoFacets() {
{
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build(); SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).build();
AggregatedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class); AggregatedPage<ArticleEntity> result = elasticsearchTemplate.queryForPage(searchQuery, ArticleEntity.class);
assertThat(result.hasFacets(), is(false)); assertThat(result.hasFacets()).isEqualTo(false);
} }
}
/**
* Simple type to test facets
*
* @author Artur Konczak
* @author Mohsin Husen
*/
@Document(indexName = "test-index-articles-core-facet", type = "article", shards = 1, replicas = 0, refreshInterval = "-1")
static class ArticleEntity {
@Id private String id;
private String title;
@Field(type = FieldType.Text, fielddata = true) private String subject;
@MultiField(mainField = @Field(type = FieldType.Text),
otherFields = {
@InnerField(suffix = "untouched", type = FieldType.Text, store = true, fielddata = true,
analyzer = "keyword"),
@InnerField(suffix = "sort", type = FieldType.Text, store = true,
analyzer = "keyword") }) private List<String> authors = new ArrayList<>();
@Field(type = FieldType.Integer, store = true) private List<Integer> publishedYears = new ArrayList<>();
private int score;
private ArticleEntity() {
}
public ArticleEntity(String id) {
this.id = id;
}
public void setId(String id) {
this.id = id;
}
public String getId() {
return id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public List<String> getAuthors() {
return authors;
}
public void setAuthors(List<String> authors) {
this.authors = authors;
}
public List<Integer> getPublishedYears() {
return publishedYears;
}
public void setPublishedYears(List<Integer> publishedYears) {
this.publishedYears = publishedYears;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
}
/**
* Simple type to test facets
*
* @author Artur Konczak
* @author Mohsin Husen
*/
static class ArticleEntityBuilder {
private ArticleEntity result;
public ArticleEntityBuilder(String id) {
result = new ArticleEntity(id);
}
public ArticleEntityBuilder title(String title) {
result.setTitle(title);
return this;
}
public ArticleEntityBuilder subject(String subject) {
result.setSubject(subject);
return this;
}
public ArticleEntityBuilder addAuthor(String author) {
result.getAuthors().add(author);
return this;
}
public ArticleEntityBuilder addPublishedYear(Integer year) {
result.getPublishedYears().add(year);
return this;
}
public ArticleEntityBuilder score(int score) {
result.setScore(score);
return this;
}
public ArticleEntity build() {
return result;
}
public IndexQuery buildIndex() {
IndexQuery indexQuery = new IndexQuery();
indexQuery.setId(result.getId());
indexQuery.setObject(result);
return indexQuery;
}
}
}

View File

@ -1,102 +0,0 @@
/*
* Copyright 2014-2019 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
*
* https://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.core.facet;
import static org.springframework.data.elasticsearch.annotations.FieldType.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
/**
* Simple type to test facets
*
* @author Artur Konczak
* @author Mohsin Husen
*/
@Document(indexName = "test-index-log", type = "test-log-type", shards = 1, replicas = 0, refreshInterval = "-1")
public class LogEntity {
private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
@Id
private String id;
private String action;
private long sequenceCode;
@Field(type = Ip)
private String ip;
@Field(type = Date)
private Date date;
private LogEntity() {
}
public LogEntity(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getAction() {
return action;
}
public String toString() {
return new StringBuffer().append("{id:").append(id).append(",action:").append(action).append(",code:").append(sequenceCode).append(",date:").append(format.format(date)).append("}").toString();
}
public void setAction(String action) {
this.action = action;
}
public long getSequenceCode() {
return sequenceCode;
}
public void setSequenceCode(long sequenceCode) {
this.sequenceCode = sequenceCode;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}

View File

@ -1,67 +0,0 @@
/*
* Copyright 2014-2019 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
*
* https://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.core.facet;
import java.util.Date;
import org.springframework.data.elasticsearch.core.query.IndexQuery;
/**
* Simple type to test facets
*
* @author Artur Konczak
* @author Mohsin Husen
*/
public class LogEntityBuilder {
private LogEntity result;
public LogEntityBuilder(String id) {
result = new LogEntity(id);
}
public LogEntityBuilder action(String action) {
result.setAction(action);
return this;
}
public LogEntityBuilder code(long sequenceCode) {
result.setSequenceCode(sequenceCode);
return this;
}
public LogEntityBuilder date(Date date) {
result.setDate(date);
return this;
}
public LogEntityBuilder ip(String ip) {
result.setIp(ip);
return this;
}
public LogEntity build() {
return result;
}
public IndexQuery buildIndex() {
IndexQuery indexQuery = new IndexQuery();
indexQuery.setId(result.getId());
indexQuery.setObject(result);
return indexQuery;
}
}

View File

@ -1,64 +0,0 @@
/*
* Copyright 2013-2019 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
*
* https://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.core.geo;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
/**
* @author Franck Marchand
* @author Mohsin Husen
*/
@Document(indexName = "test-index-author-marker", type = "geo-class-point-type", shards = 1, replicas = 0, refreshInterval = "-1")
public class AuthorMarkerEntity {
@Id
private String id;
private String name;
private GeoPoint location;
private AuthorMarkerEntity() {
}
public AuthorMarkerEntity(String id) {
this.id = id;
}
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 GeoPoint getLocation() {
return location;
}
public void setLocation(GeoPoint location) {
this.location = location;
}
}

View File

@ -1,53 +0,0 @@
/*
* Copyright 2013-2019 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
*
* https://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.core.geo;
import org.springframework.data.elasticsearch.core.query.IndexQuery;
/**
* @author Franck Marchand
* @author Mohsin Husen
*/
public class AuthorMarkerEntityBuilder {
private AuthorMarkerEntity result;
public AuthorMarkerEntityBuilder(String id) {
result = new AuthorMarkerEntity(id);
}
public AuthorMarkerEntityBuilder name(String name) {
result.setName(name);
return this;
}
public AuthorMarkerEntityBuilder location(double latitude, double longitude) {
result.setLocation(new GeoPoint(latitude, longitude));
return this;
}
public AuthorMarkerEntity build() {
return result;
}
public IndexQuery buildIndex() {
IndexQuery indexQuery = new IndexQuery();
indexQuery.setId(result.getId());
indexQuery.setObject(result);
return indexQuery;
}
}

View File

@ -15,55 +15,66 @@
*/ */
package org.springframework.data.elasticsearch.core.geo; package org.springframework.data.elasticsearch.core.geo;
import static org.assertj.core.api.Assertions.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.elasticsearch.common.geo.GeoHashUtils; import org.elasticsearch.common.geo.GeoHashUtils;
import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.QueryBuilders;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
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.ElasticsearchTemplate; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.Criteria; import org.springframework.data.elasticsearch.core.query.Criteria;
import org.springframework.data.elasticsearch.core.query.CriteriaQuery; import org.springframework.data.elasticsearch.core.query.CriteriaQuery;
import org.springframework.data.elasticsearch.core.query.IndexQuery; import org.springframework.data.elasticsearch.core.query.IndexQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.utils.IndexInitializer;
import org.springframework.data.geo.Point; import org.springframework.data.geo.Point;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
/** /**
* @author Rizwan Idrees * @author Rizwan Idrees
* @author Mohsin Husen * @author Mohsin Husen
* @author Franck Marchand * @author Franck Marchand
* @author Artur Konczak * @author Artur Konczak
* @author Peter-Josef Meisch
* *
* Basic info: * Basic info: latitude - horizontal lines (equator = 0.0, values -90.0 to 90.0) longitude -
* latitude - horizontal lines (equator = 0.0, values -90.0 to 90.0) * vertical lines (Greenwich = 0.0, values -180 to 180) London [lat,lon] = [51.50985,-0.118082] - geohash =
* longitude - vertical lines (Greenwich = 0.0, values -180 to 180) * gcpvj3448 Bouding Box for London = (bbox=-0.489,51.28,0.236,51.686) bbox = left,bottom,right,top bbox = min
* London [lat,lon] = [51.50985,-0.118082] - geohash = gcpvj3448 * Longitude , min Latitude , max Longitude , max Latitude
* Bouding Box for London = (bbox=-0.489,51.28,0.236,51.686)
* bbox = left,bottom,right,top
* bbox = min Longitude , min Latitude , max Longitude , max Latitude
*
*/ */
@RunWith(SpringJUnit4ClassRunner.class) @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:elasticsearch-template-test.xml") @ContextConfiguration("classpath:elasticsearch-template-test.xml")
public class ElasticsearchTemplateGeoTests { public class ElasticsearchTemplateGeoTests {
@Autowired @Autowired private ElasticsearchTemplate elasticsearchTemplate;
private ElasticsearchTemplate elasticsearchTemplate;
@Before
public void before() {
IndexInitializer.init(elasticsearchTemplate, AuthorMarkerEntity.class);
IndexInitializer.init(elasticsearchTemplate, LocationMarkerEntity.class);
}
private void loadClassBaseEntities() { private void loadClassBaseEntities() {
elasticsearchTemplate.deleteIndex(AuthorMarkerEntity.class);
elasticsearchTemplate.createIndex(AuthorMarkerEntity.class);
elasticsearchTemplate.putMapping(AuthorMarkerEntity.class);
elasticsearchTemplate.refresh(AuthorMarkerEntity.class);
List<IndexQuery> indexQueries = new ArrayList<>(); List<IndexQuery> indexQueries = new ArrayList<>();
indexQueries.add(new AuthorMarkerEntityBuilder("1").name("Franck Marchand").location(45.7806d, 3.0875d).buildIndex()); indexQueries
.add(new AuthorMarkerEntityBuilder("1").name("Franck Marchand").location(45.7806d, 3.0875d).buildIndex());
indexQueries.add(new AuthorMarkerEntityBuilder("2").name("Mohsin Husen").location(51.5171d, 0.1062d).buildIndex()); indexQueries.add(new AuthorMarkerEntityBuilder("2").name("Mohsin Husen").location(51.5171d, 0.1062d).buildIndex());
indexQueries.add(new AuthorMarkerEntityBuilder("3").name("Rizwan Idrees").location(51.5171d, 0.1062d).buildIndex()); indexQueries.add(new AuthorMarkerEntityBuilder("3").name("Rizwan Idrees").location(51.5171d, 0.1062d).buildIndex());
elasticsearchTemplate.bulkIndex(indexQueries); elasticsearchTemplate.bulkIndex(indexQueries);
@ -71,33 +82,29 @@ public class ElasticsearchTemplateGeoTests {
} }
private void loadAnnotationBaseEntities() { private void loadAnnotationBaseEntities() {
elasticsearchTemplate.deleteIndex(LocationMarkerEntity.class);
elasticsearchTemplate.createIndex(LocationMarkerEntity.class);
elasticsearchTemplate.putMapping(LocationMarkerEntity.class);
elasticsearchTemplate.refresh(LocationMarkerEntity.class);
List<IndexQuery> indexQueries = new ArrayList<>(); List<IndexQuery> indexQueries = new ArrayList<>();
double[] lonLatArray = {0.100000, 51.000000}; double[] lonLatArray = { 0.100000, 51.000000 };
String latLonString = "51.000000, 0.100000"; String latLonString = "51.000000, 0.100000";
String geohash = "u10j46mkfekr"; String geohash = "u10j46mkfekr";
GeoHashUtils.stringEncode(0.100000,51.000000); GeoHashUtils.stringEncode(0.100000, 51.000000);
LocationMarkerEntity location1 = LocationMarkerEntity.builder() LocationMarkerEntity location1 = LocationMarkerEntity.builder() //
.id("1").name("Artur Konczak") .id("1").name("Artur Konczak") //
.locationAsString(latLonString) .locationAsString(latLonString) //
.locationAsArray(lonLatArray) .locationAsArray(lonLatArray) //
.locationAsGeoHash(geohash) .locationAsGeoHash(geohash)
.build(); .build();
LocationMarkerEntity location2 = LocationMarkerEntity.builder() LocationMarkerEntity location2 = LocationMarkerEntity.builder() //
.id("2").name("Mohsin Husen") .id("2").name("Mohsin Husen") //
.locationAsString(geohash.substring(0, 8)) .locationAsString(geohash.substring(0, 8)) //
.locationAsArray(lonLatArray) .locationAsArray(lonLatArray) //
.locationAsGeoHash(geohash.substring(0, 8)) .locationAsGeoHash(geohash.substring(0, 8)) //
.build(); .build();
LocationMarkerEntity location3 = LocationMarkerEntity.builder() LocationMarkerEntity location3 = LocationMarkerEntity.builder() //
.id("3").name("Rizwan Idrees") .id("3").name("Rizwan Idrees") //
.locationAsString(geohash) .locationAsString(geohash) //
.locationAsArray(lonLatArray) .locationAsArray(lonLatArray) //
.locationAsGeoHash(geohash) .locationAsGeoHash(geohash) //
.build(); .build();
indexQueries.add(buildIndex(location1)); indexQueries.add(buildIndex(location1));
indexQueries.add(buildIndex(location2)); indexQueries.add(buildIndex(location2));
@ -109,197 +116,237 @@ public class ElasticsearchTemplateGeoTests {
@Test @Test
public void shouldPutMappingForGivenEntityWithGeoLocation() throws Exception { public void shouldPutMappingForGivenEntityWithGeoLocation() throws Exception {
//given
Class entity = AuthorMarkerEntity.class; // given
Class<?> entity = AuthorMarkerEntity.class;
elasticsearchTemplate.createIndex(entity); elasticsearchTemplate.createIndex(entity);
//when
assertThat(elasticsearchTemplate.putMapping(entity), is(true)); // when
assertThat(elasticsearchTemplate.putMapping(entity)).isTrue();
} }
@Test @Test
public void shouldFindAuthorMarkersInRangeForGivenCriteriaQuery() { public void shouldFindAuthorMarkersInRangeForGivenCriteriaQuery() {
//given
// given
loadClassBaseEntities(); loadClassBaseEntities();
CriteriaQuery geoLocationCriteriaQuery = new CriteriaQuery( CriteriaQuery geoLocationCriteriaQuery = new CriteriaQuery(
new Criteria("location").within(new GeoPoint(45.7806d, 3.0875d), "20km")); new Criteria("location").within(new GeoPoint(45.7806d, 3.0875d), "20km"));
//when
List<AuthorMarkerEntity> geoAuthorsForGeoCriteria = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery, AuthorMarkerEntity.class);
//then // when
assertThat(geoAuthorsForGeoCriteria.size(), is(1)); List<AuthorMarkerEntity> geoAuthorsForGeoCriteria = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery,
assertEquals("Franck Marchand", geoAuthorsForGeoCriteria.get(0).getName()); AuthorMarkerEntity.class);
// then
assertThat(geoAuthorsForGeoCriteria).hasSize(1);
assertThat(geoAuthorsForGeoCriteria.get(0).getName()).isEqualTo("Franck Marchand");
} }
@Test @Test
public void shouldFindSelectedAuthorMarkerInRangeForGivenCriteriaQuery() { public void shouldFindSelectedAuthorMarkerInRangeForGivenCriteriaQuery() {
//given
// given
loadClassBaseEntities(); loadClassBaseEntities();
CriteriaQuery geoLocationCriteriaQuery2 = new CriteriaQuery( CriteriaQuery geoLocationCriteriaQuery2 = new CriteriaQuery(
new Criteria("name").is("Mohsin Husen").and("location").within(new GeoPoint(51.5171d, 0.1062d), "20km")); new Criteria("name").is("Mohsin Husen").and("location").within(new GeoPoint(51.5171d, 0.1062d), "20km"));
//when
List<AuthorMarkerEntity> geoAuthorsForGeoCriteria2 = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery2, AuthorMarkerEntity.class);
//then // when
assertThat(geoAuthorsForGeoCriteria2.size(), is(1)); List<AuthorMarkerEntity> geoAuthorsForGeoCriteria2 = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery2,
assertEquals("Mohsin Husen", geoAuthorsForGeoCriteria2.get(0).getName()); AuthorMarkerEntity.class);
// then
assertThat(geoAuthorsForGeoCriteria2).hasSize(1);
assertThat(geoAuthorsForGeoCriteria2.get(0).getName()).isEqualTo("Mohsin Husen");
} }
@Test @Test
public void shouldFindStringAnnotatedGeoMarkersInRangeForGivenCriteriaQuery() { public void shouldFindStringAnnotatedGeoMarkersInRangeForGivenCriteriaQuery() {
//given
// given
loadAnnotationBaseEntities(); loadAnnotationBaseEntities();
CriteriaQuery geoLocationCriteriaQuery = new CriteriaQuery( CriteriaQuery geoLocationCriteriaQuery = new CriteriaQuery(
new Criteria("locationAsString").within(new GeoPoint(51.000000, 0.100000), "1km")); new Criteria("locationAsString").within(new GeoPoint(51.000000, 0.100000), "1km"));
//when // when
List<LocationMarkerEntity> geoAuthorsForGeoCriteria = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery, LocationMarkerEntity.class); List<LocationMarkerEntity> geoAuthorsForGeoCriteria = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery,
LocationMarkerEntity.class);
//then // then
assertThat(geoAuthorsForGeoCriteria.size(), is(1)); assertThat(geoAuthorsForGeoCriteria).hasSize(1);
} }
@Test @Test
public void shouldFindDoubleAnnotatedGeoMarkersInRangeForGivenCriteriaQuery() { public void shouldFindDoubleAnnotatedGeoMarkersInRangeForGivenCriteriaQuery() {
//given
// given
loadAnnotationBaseEntities(); loadAnnotationBaseEntities();
CriteriaQuery geoLocationCriteriaQuery = new CriteriaQuery( CriteriaQuery geoLocationCriteriaQuery = new CriteriaQuery(
new Criteria("locationAsArray").within(new GeoPoint(51.001000, 0.10100), "1km")); new Criteria("locationAsArray").within(new GeoPoint(51.001000, 0.10100), "1km"));
//when
List<LocationMarkerEntity> geoAuthorsForGeoCriteria = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery, LocationMarkerEntity.class);
//then // when
assertThat(geoAuthorsForGeoCriteria.size(), is(3)); List<LocationMarkerEntity> geoAuthorsForGeoCriteria = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery,
LocationMarkerEntity.class);
// then
assertThat(geoAuthorsForGeoCriteria).hasSize(3);
} }
@Test @Test
public void shouldFindAnnotatedGeoMarkersInRangeForGivenCriteriaQuery() { public void shouldFindAnnotatedGeoMarkersInRangeForGivenCriteriaQuery() {
//given
// given
loadAnnotationBaseEntities(); loadAnnotationBaseEntities();
CriteriaQuery geoLocationCriteriaQuery = new CriteriaQuery( CriteriaQuery geoLocationCriteriaQuery = new CriteriaQuery(
new Criteria("locationAsArray").within("51.001000, 0.10100", "1km")); new Criteria("locationAsArray").within("51.001000, 0.10100", "1km"));
//when // when
List<LocationMarkerEntity> geoAuthorsForGeoCriteria = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery, LocationMarkerEntity.class); List<LocationMarkerEntity> geoAuthorsForGeoCriteria = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery,
LocationMarkerEntity.class);
//then // then
assertThat(geoAuthorsForGeoCriteria.size(), is(3)); assertThat(geoAuthorsForGeoCriteria).hasSize(3);
} }
@Test @Test
public void shouldFindAnnotatedGeoMarkersInRangeForGivenCriteriaQueryUsingGeohashLocation() { public void shouldFindAnnotatedGeoMarkersInRangeForGivenCriteriaQueryUsingGeohashLocation() {
//given
loadAnnotationBaseEntities();
CriteriaQuery geoLocationCriteriaQuery = new CriteriaQuery(
new Criteria("locationAsArray").within("u1044", "3km"));
//when
List<LocationMarkerEntity> geoAuthorsForGeoCriteria = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery, LocationMarkerEntity.class);
//then // given
assertThat(geoAuthorsForGeoCriteria.size(), is(3)); loadAnnotationBaseEntities();
CriteriaQuery geoLocationCriteriaQuery = new CriteriaQuery(new Criteria("locationAsArray").within("u1044", "3km"));
// when
List<LocationMarkerEntity> geoAuthorsForGeoCriteria = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery,
LocationMarkerEntity.class);
// then
assertThat(geoAuthorsForGeoCriteria).hasSize(3);
} }
@Test @Test
public void shouldFindAllMarkersForNativeSearchQuery() { public void shouldFindAllMarkersForNativeSearchQuery() {
//Given
// given
loadAnnotationBaseEntities(); loadAnnotationBaseEntities();
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder().withFilter(QueryBuilders.geoBoundingBoxQuery("locationAsArray").setCorners(52, -1, 50, 1)); NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder()
//When .withFilter(QueryBuilders.geoBoundingBoxQuery("locationAsArray").setCorners(52, -1, 50, 1));
List<LocationMarkerEntity> geoAuthorsForGeoCriteria = elasticsearchTemplate.queryForList(queryBuilder.build(), LocationMarkerEntity.class);
//Then // when
assertThat(geoAuthorsForGeoCriteria.size(), is(3)); List<LocationMarkerEntity> geoAuthorsForGeoCriteria = elasticsearchTemplate.queryForList(queryBuilder.build(),
LocationMarkerEntity.class);
// then
assertThat(geoAuthorsForGeoCriteria).hasSize(3);
} }
@Test @Test
public void shouldFindAuthorMarkersInBoxForGivenCriteriaQueryUsingGeoBox() { public void shouldFindAuthorMarkersInBoxForGivenCriteriaQueryUsingGeoBox() {
//given
// given
loadClassBaseEntities(); loadClassBaseEntities();
CriteriaQuery geoLocationCriteriaQuery3 = new CriteriaQuery( CriteriaQuery geoLocationCriteriaQuery3 = new CriteriaQuery(
new Criteria("location").boundedBy( new Criteria("location").boundedBy(new GeoBox(new GeoPoint(53.5171d, 0), new GeoPoint(49.5171d, 0.2062d))));
new GeoBox(new GeoPoint(53.5171d, 0),
new GeoPoint(49.5171d, 0.2062d))
)
);
//when
List<AuthorMarkerEntity> geoAuthorsForGeoCriteria3 = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery3, AuthorMarkerEntity.class);
//then // when
assertThat(geoAuthorsForGeoCriteria3.size(), is(2)); List<AuthorMarkerEntity> geoAuthorsForGeoCriteria3 = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery3,
assertThat(geoAuthorsForGeoCriteria3, containsInAnyOrder(hasProperty("name", equalTo("Mohsin Husen")), hasProperty("name", equalTo("Rizwan Idrees")))); AuthorMarkerEntity.class);
// then
assertThat(geoAuthorsForGeoCriteria3).hasSize(2);
assertThat(geoAuthorsForGeoCriteria3.stream().map(AuthorMarkerEntity::getName))
.containsExactlyInAnyOrder("Mohsin Husen", "Rizwan Idrees");
} }
@Test @Test
public void shouldFindAuthorMarkersInBoxForGivenCriteriaQueryUsingGeohash() { public void shouldFindAuthorMarkersInBoxForGivenCriteriaQueryUsingGeohash() {
//given
loadClassBaseEntities();
CriteriaQuery geoLocationCriteriaQuery3 = new CriteriaQuery(
new Criteria("location").boundedBy(GeoHashUtils.stringEncode(0, 53.5171d), GeoHashUtils.stringEncode(0.2062d, 49.5171d)));
//when
List<AuthorMarkerEntity> geoAuthorsForGeoCriteria3 = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery3, AuthorMarkerEntity.class);
//then // given
assertThat(geoAuthorsForGeoCriteria3.size(), is(2)); loadClassBaseEntities();
assertThat(geoAuthorsForGeoCriteria3, containsInAnyOrder(hasProperty("name", equalTo("Mohsin Husen")), hasProperty("name", equalTo("Rizwan Idrees")))); CriteriaQuery geoLocationCriteriaQuery3 = new CriteriaQuery(new Criteria("location")
.boundedBy(GeoHashUtils.stringEncode(0, 53.5171d), GeoHashUtils.stringEncode(0.2062d, 49.5171d)));
// when
List<AuthorMarkerEntity> geoAuthorsForGeoCriteria3 = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery3,
AuthorMarkerEntity.class);
// then
assertThat(geoAuthorsForGeoCriteria3).hasSize(2);
assertThat(geoAuthorsForGeoCriteria3.stream().map(AuthorMarkerEntity::getName))
.containsExactlyInAnyOrder("Mohsin Husen", "Rizwan Idrees");
} }
@Test @Test
public void shouldFindAuthorMarkersInBoxForGivenCriteriaQueryUsingGeoPoints() { public void shouldFindAuthorMarkersInBoxForGivenCriteriaQueryUsingGeoPoints() {
//given
// given
loadClassBaseEntities(); loadClassBaseEntities();
CriteriaQuery geoLocationCriteriaQuery3 = new CriteriaQuery( CriteriaQuery geoLocationCriteriaQuery3 = new CriteriaQuery(
new Criteria("location").boundedBy( new Criteria("location").boundedBy(new GeoPoint(53.5171d, 0), new GeoPoint(49.5171d, 0.2062d)));
new GeoPoint(53.5171d, 0),
new GeoPoint(49.5171d, 0.2062d))
);
//when
List<AuthorMarkerEntity> geoAuthorsForGeoCriteria3 = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery3, AuthorMarkerEntity.class);
//then // when
assertThat(geoAuthorsForGeoCriteria3.size(), is(2)); List<AuthorMarkerEntity> geoAuthorsForGeoCriteria3 = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery3,
assertThat(geoAuthorsForGeoCriteria3, containsInAnyOrder(hasProperty("name", equalTo("Mohsin Husen")), hasProperty("name", equalTo("Rizwan Idrees")))); AuthorMarkerEntity.class);
// then
assertThat(geoAuthorsForGeoCriteria3).hasSize(2);
assertThat(geoAuthorsForGeoCriteria3.stream().map(AuthorMarkerEntity::getName))
.containsExactlyInAnyOrder("Mohsin Husen", "Rizwan Idrees");
} }
@Test @Test
public void shouldFindAuthorMarkersInBoxForGivenCriteriaQueryUsingPoints() { public void shouldFindAuthorMarkersInBoxForGivenCriteriaQueryUsingPoints() {
//given
// given
loadClassBaseEntities(); loadClassBaseEntities();
CriteriaQuery geoLocationCriteriaQuery3 = new CriteriaQuery( CriteriaQuery geoLocationCriteriaQuery3 = new CriteriaQuery(
new Criteria("location").boundedBy( new Criteria("location").boundedBy(new Point(53.5171d, 0), new Point(49.5171d, 0.2062d)));
new Point(53.5171d, 0),
new Point(49.5171d, 0.2062d ))
);
//when
List<AuthorMarkerEntity> geoAuthorsForGeoCriteria3 = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery3, AuthorMarkerEntity.class);
//then // when
assertThat(geoAuthorsForGeoCriteria3.size(), is(2)); List<AuthorMarkerEntity> geoAuthorsForGeoCriteria3 = elasticsearchTemplate.queryForList(geoLocationCriteriaQuery3,
assertThat(geoAuthorsForGeoCriteria3, containsInAnyOrder(hasProperty("name", equalTo("Mohsin Husen")), hasProperty("name", equalTo("Rizwan Idrees")))); AuthorMarkerEntity.class);
// then
assertThat(geoAuthorsForGeoCriteria3).hasSize(2);
assertThat(geoAuthorsForGeoCriteria3.stream().map(AuthorMarkerEntity::getName))
.containsExactlyInAnyOrder("Mohsin Husen", "Rizwan Idrees");
} }
@Test @Test
public void shouldFindLocationWithGeoHashPrefix() { public void shouldFindLocationWithGeoHashPrefix() {
//given // given
loadAnnotationBaseEntities(); loadAnnotationBaseEntities();
NativeSearchQueryBuilder location1 = new NativeSearchQueryBuilder().withFilter(QueryBuilders.geoBoundingBoxQuery("locationAsGeoHash").setCorners("u")); NativeSearchQueryBuilder location1 = new NativeSearchQueryBuilder()
NativeSearchQueryBuilder location2 = new NativeSearchQueryBuilder().withFilter(QueryBuilders.geoBoundingBoxQuery("locationAsGeoHash").setCorners("u1")); .withFilter(QueryBuilders.geoBoundingBoxQuery("locationAsGeoHash").setCorners("u"));
NativeSearchQueryBuilder location3 = new NativeSearchQueryBuilder().withFilter(QueryBuilders.geoBoundingBoxQuery("locationAsGeoHash").setCorners("u10")); NativeSearchQueryBuilder location2 = new NativeSearchQueryBuilder()
NativeSearchQueryBuilder location4 = new NativeSearchQueryBuilder().withFilter(QueryBuilders.geoBoundingBoxQuery("locationAsGeoHash").setCorners("u10j")); .withFilter(QueryBuilders.geoBoundingBoxQuery("locationAsGeoHash").setCorners("u1"));
NativeSearchQueryBuilder location5 = new NativeSearchQueryBuilder().withFilter(QueryBuilders.geoBoundingBoxQuery("locationAsGeoHash").setCorners("u10j4")); NativeSearchQueryBuilder location3 = new NativeSearchQueryBuilder()
NativeSearchQueryBuilder location11 = new NativeSearchQueryBuilder().withFilter(QueryBuilders.geoBoundingBoxQuery("locationAsGeoHash").setCorners("u10j46mkfek")); .withFilter(QueryBuilders.geoBoundingBoxQuery("locationAsGeoHash").setCorners("u10"));
NativeSearchQueryBuilder location4 = new NativeSearchQueryBuilder()
.withFilter(QueryBuilders.geoBoundingBoxQuery("locationAsGeoHash").setCorners("u10j"));
NativeSearchQueryBuilder location5 = new NativeSearchQueryBuilder()
.withFilter(QueryBuilders.geoBoundingBoxQuery("locationAsGeoHash").setCorners("u10j4"));
NativeSearchQueryBuilder location11 = new NativeSearchQueryBuilder()
.withFilter(QueryBuilders.geoBoundingBoxQuery("locationAsGeoHash").setCorners("u10j46mkfek"));
//when // when
List<LocationMarkerEntity> result1 = elasticsearchTemplate.queryForList(location1.build(), LocationMarkerEntity.class); List<LocationMarkerEntity> result1 = elasticsearchTemplate.queryForList(location1.build(),
List<LocationMarkerEntity> result2 = elasticsearchTemplate.queryForList(location2.build(), LocationMarkerEntity.class); LocationMarkerEntity.class);
List<LocationMarkerEntity> result3 = elasticsearchTemplate.queryForList(location3.build(), LocationMarkerEntity.class); List<LocationMarkerEntity> result2 = elasticsearchTemplate.queryForList(location2.build(),
List<LocationMarkerEntity> result4 = elasticsearchTemplate.queryForList(location4.build(), LocationMarkerEntity.class); LocationMarkerEntity.class);
List<LocationMarkerEntity> result5 = elasticsearchTemplate.queryForList(location5.build(), LocationMarkerEntity.class); List<LocationMarkerEntity> result3 = elasticsearchTemplate.queryForList(location3.build(),
List<LocationMarkerEntity> result11 = elasticsearchTemplate.queryForList(location11.build(), LocationMarkerEntity.class); LocationMarkerEntity.class);
List<LocationMarkerEntity> result4 = elasticsearchTemplate.queryForList(location4.build(),
LocationMarkerEntity.class);
List<LocationMarkerEntity> result5 = elasticsearchTemplate.queryForList(location5.build(),
LocationMarkerEntity.class);
List<LocationMarkerEntity> result11 = elasticsearchTemplate.queryForList(location11.build(),
LocationMarkerEntity.class);
//then // then
assertThat(result1.size(), is(3)); assertThat(result1).hasSize(3);
assertThat(result2.size(), is(3)); assertThat(result2).hasSize(3);
assertThat(result3.size(), is(3)); assertThat(result3).hasSize(3);
assertThat(result4.size(), is(3)); assertThat(result4).hasSize(3);
assertThat(result5.size(), is(3)); assertThat(result5).hasSize(3);
assertThat(result11.size(), is(2)); assertThat(result11).hasSize(2);
} }
private IndexQuery buildIndex(LocationMarkerEntity result) { private IndexQuery buildIndex(LocationMarkerEntity result) {
@ -308,4 +355,106 @@ public class ElasticsearchTemplateGeoTests {
indexQuery.setObject(result); indexQuery.setObject(result);
return indexQuery; return indexQuery;
} }
/**
* @author Franck Marchand
* @author Mohsin Husen
*/
@Document(indexName = "test-index-author-marker-core-geo", type = "geo-class-point-type", shards = 1, replicas = 0,
refreshInterval = "-1")
static class AuthorMarkerEntity {
@Id private String id;
private String name;
private GeoPoint location;
private AuthorMarkerEntity() {}
public AuthorMarkerEntity(String id) {
this.id = id;
}
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 GeoPoint getLocation() {
return location;
}
public void setLocation(GeoPoint location) {
this.location = location;
}
}
/**
* @author Franck Marchand
* @author Mohsin Husen
*/
static class AuthorMarkerEntityBuilder {
private AuthorMarkerEntity result;
public AuthorMarkerEntityBuilder(String id) {
result = new AuthorMarkerEntity(id);
}
public AuthorMarkerEntityBuilder name(String name) {
result.setName(name);
return this;
}
public AuthorMarkerEntityBuilder location(double latitude, double longitude) {
result.setLocation(new GeoPoint(latitude, longitude));
return this;
}
public AuthorMarkerEntity build() {
return result;
}
public IndexQuery buildIndex() {
IndexQuery indexQuery = new IndexQuery();
indexQuery.setId(result.getId());
indexQuery.setObject(result);
return indexQuery;
}
}
/**
* @author Franck Marchand
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Document(indexName = "test-index-location-marker-core-geo", type = "geo-annotation-point-type", shards = 1, replicas = 0,
refreshInterval = "-1")
static class LocationMarkerEntity {
@Id private String id;
private String name;
@GeoPointField private String locationAsString;
@GeoPointField private double[] locationAsArray;
@GeoPointField private String locationAsGeoHash;
}
} }

View File

@ -1,51 +0,0 @@
/*
* Copyright 2013-2019 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
*
* https://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.core.geo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.GeoPointField;
/**
* @author Franck Marchand
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Document(indexName = "test-index-location-marker", type = "geo-annotation-point-type", shards = 1, replicas = 0, refreshInterval = "-1")
public class LocationMarkerEntity {
@Id
private String id;
private String name;
@GeoPointField
private String locationAsString;
@GeoPointField
private double[] locationAsArray;
@GeoPointField
private String locationAsGeoHash;
}

View File

@ -16,37 +16,51 @@
package org.springframework.data.elasticsearch.core.query; package org.springframework.data.elasticsearch.core.query;
import static org.apache.commons.lang.RandomStringUtils.*; import static org.apache.commons.lang.RandomStringUtils.*;
import static org.hamcrest.Matchers.*; import static org.assertj.core.api.Assertions.*;
import static org.junit.Assert.*; import static org.springframework.data.elasticsearch.annotations.FieldType.*;
import static org.springframework.data.elasticsearch.utils.IndexBuilder.*; import static org.springframework.data.elasticsearch.utils.IndexBuilder.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.lang.Double;
import java.lang.Long;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.junit.Before; import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Version;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.Score;
import org.springframework.data.elasticsearch.annotations.ScriptedField;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.entities.SampleEntity; import org.springframework.data.elasticsearch.core.geo.GeoPoint;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/** /**
* @author Rizwan Idrees * @author Rizwan Idrees
* @author Mohsin Husen * @author Mohsin Husen
* @author Peter-Josef Meisch
*/ */
@RunWith(SpringJUnit4ClassRunner.class) @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:elasticsearch-template-test.xml") @ContextConfiguration("classpath:elasticsearch-template-test.xml")
public class CriteriaQueryTests { public class CriteriaQueryTests {
@Autowired @Autowired private ElasticsearchTemplate elasticsearchTemplate;
private ElasticsearchTemplate elasticsearchTemplate;
@Before @Before
public void before() { public void before() {
elasticsearchTemplate.deleteIndex(SampleEntity.class); elasticsearchTemplate.deleteIndex(SampleEntity.class);
elasticsearchTemplate.createIndex(SampleEntity.class); elasticsearchTemplate.createIndex(SampleEntity.class);
elasticsearchTemplate.putMapping(SampleEntity.class); elasticsearchTemplate.putMapping(SampleEntity.class);
@ -55,6 +69,7 @@ public class CriteriaQueryTests {
@Test @Test
public void shouldPerformAndOperation() { public void shouldPerformAndOperation() {
// given // given
String documentId = randomNumeric(5); String documentId = randomNumeric(5);
SampleEntity sampleEntity = new SampleEntity(); SampleEntity sampleEntity = new SampleEntity();
@ -67,19 +82,23 @@ public class CriteriaQueryTests {
indexQuery.setObject(sampleEntity); indexQuery.setObject(sampleEntity);
elasticsearchTemplate.index(indexQuery); elasticsearchTemplate.index(indexQuery);
elasticsearchTemplate.refresh(SampleEntity.class); elasticsearchTemplate.refresh(SampleEntity.class);
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").contains("test").and("message") CriteriaQuery criteriaQuery = new CriteriaQuery(
.contains("some")); new Criteria("message").contains("test").and("message").contains("some"));
// when // when
SampleEntity sampleEntity1 = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); SampleEntity sampleEntity1 = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class);
// then // then
assertThat(sampleEntity1, is(notNullValue())); assertThat(sampleEntity1).isNotNull();
} }
@Ignore("DATAES-30") // @Ignore("DATAES-30")
@Test @Test
public void shouldPerformOrOperation() { public void shouldPerformOrOperation() {
// given // given
List<IndexQuery> indexQueries = new ArrayList<>(); List<IndexQuery> indexQueries = new ArrayList<>();
// first document // first document
String documentId = randomNumeric(5); String documentId = randomNumeric(5);
SampleEntity sampleEntity1 = new SampleEntity(); SampleEntity sampleEntity1 = new SampleEntity();
@ -106,19 +125,23 @@ public class CriteriaQueryTests {
indexQueries.add(indexQuery2); indexQueries.add(indexQuery2);
elasticsearchTemplate.bulkIndex(indexQueries); elasticsearchTemplate.bulkIndex(indexQueries);
elasticsearchTemplate.refresh(SampleEntity.class); elasticsearchTemplate.refresh(SampleEntity.class);
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").contains("some").or("message") CriteriaQuery criteriaQuery = new CriteriaQuery(
.contains("test")); new Criteria("message").contains("some").or("message").contains("test"));
// when // when
Page<SampleEntity> page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); Page<SampleEntity> page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class);
// then // then
assertThat(page, is(notNullValue())); assertThat(page).isNotNull();
assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); assertThat(page.getTotalElements()).isGreaterThanOrEqualTo(1);
} }
@Test @Test
public void shouldPerformAndOperationWithinCriteria() { public void shouldPerformAndOperationWithinCriteria() {
// given // given
List<IndexQuery> indexQueries = new ArrayList<>(); List<IndexQuery> indexQueries = new ArrayList<>();
// first document // first document
String documentId = randomNumeric(5); String documentId = randomNumeric(5);
SampleEntity sampleEntity = new SampleEntity(); SampleEntity sampleEntity = new SampleEntity();
@ -134,18 +157,23 @@ public class CriteriaQueryTests {
elasticsearchTemplate.bulkIndex(indexQueries); elasticsearchTemplate.bulkIndex(indexQueries);
elasticsearchTemplate.refresh(SampleEntity.class); elasticsearchTemplate.refresh(SampleEntity.class);
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria().and(new Criteria("message").contains("some"))); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria().and(new Criteria("message").contains("some")));
// when // when
Page<SampleEntity> page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); Page<SampleEntity> page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class);
// then // then
assertThat(page, is(notNullValue())); assertThat(page).isNotNull();
assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); assertThat(page.getTotalElements()).isGreaterThanOrEqualTo(1);
} }
@Ignore("DATAES-30") // @Ignore("DATAES-30")
@Test @Test
public void shouldPerformOrOperationWithinCriteria() { public void shouldPerformOrOperationWithinCriteria() {
// given // given
List<IndexQuery> indexQueries = new ArrayList<>(); List<IndexQuery> indexQueries = new ArrayList<>();
// first document // first document
String documentId = randomNumeric(5); String documentId = randomNumeric(5);
SampleEntity sampleEntity = new SampleEntity(); SampleEntity sampleEntity = new SampleEntity();
@ -161,15 +189,18 @@ public class CriteriaQueryTests {
elasticsearchTemplate.bulkIndex(indexQueries); elasticsearchTemplate.bulkIndex(indexQueries);
elasticsearchTemplate.refresh(SampleEntity.class); elasticsearchTemplate.refresh(SampleEntity.class);
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria().or(new Criteria("message").contains("some"))); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria().or(new Criteria("message").contains("some")));
// when // when
Page<SampleEntity> page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); Page<SampleEntity> page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class);
// then // then
assertThat(page, is(notNullValue())); assertThat(page).isNotNull();
assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); assertThat(page.getTotalElements()).isGreaterThanOrEqualTo(1);
} }
@Test @Test
public void shouldPerformIsOperation() { public void shouldPerformIsOperation() {
// given // given
List<IndexQuery> indexQueries = new ArrayList<>(); List<IndexQuery> indexQueries = new ArrayList<>();
// first document // first document
@ -187,17 +218,21 @@ public class CriteriaQueryTests {
elasticsearchTemplate.bulkIndex(indexQueries); elasticsearchTemplate.bulkIndex(indexQueries);
elasticsearchTemplate.refresh(SampleEntity.class); elasticsearchTemplate.refresh(SampleEntity.class);
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").is("some message")); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").is("some message"));
// when // when
Page<SampleEntity> page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); Page<SampleEntity> page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class);
// then // then
assertThat("message", is(criteriaQuery.getCriteria().getField().getName())); assertThat(criteriaQuery.getCriteria().getField().getName()).isEqualTo("message");
assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); assertThat(page.getTotalElements()).isGreaterThanOrEqualTo(1);
} }
@Test @Test
public void shouldPerformMultipleIsOperations() { public void shouldPerformMultipleIsOperations() {
// given // given
List<IndexQuery> indexQueries = new ArrayList<>(); List<IndexQuery> indexQueries = new ArrayList<>();
// first document // first document
String documentId = randomNumeric(5); String documentId = randomNumeric(5);
SampleEntity sampleEntity1 = new SampleEntity(); SampleEntity sampleEntity1 = new SampleEntity();
@ -225,17 +260,21 @@ public class CriteriaQueryTests {
elasticsearchTemplate.bulkIndex(indexQueries); elasticsearchTemplate.bulkIndex(indexQueries);
elasticsearchTemplate.refresh(SampleEntity.class); elasticsearchTemplate.refresh(SampleEntity.class);
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").is("some message")); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").is("some message"));
// when // when
Page<SampleEntity> page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); Page<SampleEntity> page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class);
// then // then
assertThat("message", is(criteriaQuery.getCriteria().getField().getName())); assertThat(criteriaQuery.getCriteria().getField().getName()).isEqualTo("message");
assertThat(page.getTotalElements(), is(equalTo(1L))); assertThat(page.getTotalElements()).isEqualTo(1);
} }
@Test @Test
public void shouldPerformEndsWithOperation() { public void shouldPerformEndsWithOperation() {
// given // given
List<IndexQuery> indexQueries = new ArrayList<>(); List<IndexQuery> indexQueries = new ArrayList<>();
// first document // first document
String documentId = randomNumeric(5); String documentId = randomNumeric(5);
SampleEntity sampleEntity1 = new SampleEntity(); SampleEntity sampleEntity1 = new SampleEntity();
@ -264,15 +303,18 @@ public class CriteriaQueryTests {
elasticsearchTemplate.refresh(SampleEntity.class); elasticsearchTemplate.refresh(SampleEntity.class);
Criteria criteria = new Criteria("message").endsWith("end"); Criteria criteria = new Criteria("message").endsWith("end");
CriteriaQuery criteriaQuery = new CriteriaQuery(criteria); CriteriaQuery criteriaQuery = new CriteriaQuery(criteria);
// when // when
SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class);
// then // then
assertThat("message", is(criteriaQuery.getCriteria().getField().getName())); assertThat(criteriaQuery.getCriteria().getField().getName()).isEqualTo("message");
assertThat(sampleEntity, is(notNullValue())); assertThat(sampleEntity).isNotNull();
} }
@Test @Test
public void shouldPerformStartsWithOperation() { public void shouldPerformStartsWithOperation() {
// given // given
List<IndexQuery> indexQueries = new ArrayList<>(); List<IndexQuery> indexQueries = new ArrayList<>();
// first document // first document
@ -303,15 +345,18 @@ public class CriteriaQueryTests {
elasticsearchTemplate.refresh(SampleEntity.class); elasticsearchTemplate.refresh(SampleEntity.class);
Criteria criteria = new Criteria("message").startsWith("start"); Criteria criteria = new Criteria("message").startsWith("start");
CriteriaQuery criteriaQuery = new CriteriaQuery(criteria); CriteriaQuery criteriaQuery = new CriteriaQuery(criteria);
// when // when
SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class);
// then // then
assertThat("message", is(criteriaQuery.getCriteria().getField().getName())); assertThat(criteriaQuery.getCriteria().getField().getName()).isEqualTo("message");
assertThat(sampleEntity, is(notNullValue())); assertThat(sampleEntity).isNotNull();
} }
@Test @Test
public void shouldPerformContainsOperation() { public void shouldPerformContainsOperation() {
// given // given
List<IndexQuery> indexQueries = new ArrayList<>(); List<IndexQuery> indexQueries = new ArrayList<>();
// first document // first document
@ -341,15 +386,18 @@ public class CriteriaQueryTests {
elasticsearchTemplate.bulkIndex(indexQueries); elasticsearchTemplate.bulkIndex(indexQueries);
elasticsearchTemplate.refresh(SampleEntity.class); elasticsearchTemplate.refresh(SampleEntity.class);
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").contains("contains")); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").contains("contains"));
// when // when
SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class);
// then // then
assertThat("message", is(criteriaQuery.getCriteria().getField().getName())); assertThat(criteriaQuery.getCriteria().getField().getName()).isEqualTo("message");
assertThat(sampleEntity, is(notNullValue())); assertThat(sampleEntity).isNotNull();
} }
@Test @Test
public void shouldExecuteExpression() { public void shouldExecuteExpression() {
// given // given
List<IndexQuery> indexQueries = new ArrayList<>(); List<IndexQuery> indexQueries = new ArrayList<>();
// first document // first document
@ -379,15 +427,18 @@ public class CriteriaQueryTests {
elasticsearchTemplate.bulkIndex(indexQueries); elasticsearchTemplate.bulkIndex(indexQueries);
elasticsearchTemplate.refresh(SampleEntity.class); elasticsearchTemplate.refresh(SampleEntity.class);
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").expression("+elasticsearch || test")); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").expression("+elasticsearch || test"));
// when // when
SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class);
// then // then
assertThat("message", is(criteriaQuery.getCriteria().getField().getName())); assertThat(criteriaQuery.getCriteria().getField().getName()).isEqualTo("message");
assertThat(sampleEntity, is(notNullValue())); assertThat(sampleEntity).isNotNull();
} }
@Test @Test
public void shouldExecuteCriteriaChain() { public void shouldExecuteCriteriaChain() {
// given // given
List<IndexQuery> indexQueries = new ArrayList<>(); List<IndexQuery> indexQueries = new ArrayList<>();
// first document // first document
@ -416,17 +467,20 @@ public class CriteriaQueryTests {
elasticsearchTemplate.bulkIndex(indexQueries); elasticsearchTemplate.bulkIndex(indexQueries);
elasticsearchTemplate.refresh(SampleEntity.class); elasticsearchTemplate.refresh(SampleEntity.class);
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").startsWith("some").endsWith("search") CriteriaQuery criteriaQuery = new CriteriaQuery(
.contains("message").is("some message search")); new Criteria("message").startsWith("some").endsWith("search").contains("message").is("some message search"));
// when // when
SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class);
// then // then
assertThat("message", is(criteriaQuery.getCriteria().getField().getName())); assertThat(criteriaQuery.getCriteria().getField().getName()).isEqualTo("message");
assertThat(sampleEntity, is(notNullValue())); assertThat(sampleEntity).isNotNull();
} }
@Test @Test
public void shouldPerformIsNotOperation() { public void shouldPerformIsNotOperation() {
// given // given
List<IndexQuery> indexQueries = new ArrayList<>(); List<IndexQuery> indexQueries = new ArrayList<>();
// first document // first document
@ -456,16 +510,19 @@ public class CriteriaQueryTests {
elasticsearchTemplate.bulkIndex(indexQueries); elasticsearchTemplate.bulkIndex(indexQueries);
elasticsearchTemplate.refresh(SampleEntity.class); elasticsearchTemplate.refresh(SampleEntity.class);
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").is("foo").not()); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").is("foo").not());
// when // when
Page<SampleEntity> page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); Page<SampleEntity> page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class);
// then // then
assertTrue(criteriaQuery.getCriteria().isNegating()); assertThat(criteriaQuery.getCriteria().isNegating()).isTrue();
assertThat(page, is(notNullValue())); assertThat(page).isNotNull();
assertFalse(page.iterator().next().getMessage().contains("foo")); assertThat(page.iterator().next().getMessage()).doesNotContain("foo");
} }
@Test @Test
public void shouldPerformBetweenOperation() { public void shouldPerformBetweenOperation() {
// given // given
List<IndexQuery> indexQueries = new ArrayList<>(); List<IndexQuery> indexQueries = new ArrayList<>();
// first document // first document
@ -497,14 +554,17 @@ public class CriteriaQueryTests {
elasticsearchTemplate.bulkIndex(indexQueries); elasticsearchTemplate.bulkIndex(indexQueries);
elasticsearchTemplate.refresh(SampleEntity.class); elasticsearchTemplate.refresh(SampleEntity.class);
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").between(100, 150)); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").between(100, 150));
// when // when
SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class); SampleEntity sampleEntity = elasticsearchTemplate.queryForObject(criteriaQuery, SampleEntity.class);
// then // then
assertThat(sampleEntity, is(notNullValue())); assertThat(sampleEntity).isNotNull();
} }
@Test @Test
public void shouldPerformBetweenOperationWithoutUpperBound() { public void shouldPerformBetweenOperationWithoutUpperBound() {
// given // given
List<IndexQuery> indexQueries = new ArrayList<>(); List<IndexQuery> indexQueries = new ArrayList<>();
// first document // first document
@ -536,15 +596,18 @@ public class CriteriaQueryTests {
elasticsearchTemplate.bulkIndex(indexQueries); elasticsearchTemplate.bulkIndex(indexQueries);
elasticsearchTemplate.refresh(SampleEntity.class); elasticsearchTemplate.refresh(SampleEntity.class);
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").between(350, null)); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").between(350, null));
// when // when
Page<SampleEntity> page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); Page<SampleEntity> page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class);
// then // then
assertThat(page, is(notNullValue())); assertThat(page).isNotNull();
assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); assertThat(page.getTotalElements()).isGreaterThanOrEqualTo(1);
} }
@Test @Test
public void shouldPerformBetweenOperationWithoutLowerBound() { public void shouldPerformBetweenOperationWithoutLowerBound() {
// given // given
List<IndexQuery> indexQueries = new ArrayList<>(); List<IndexQuery> indexQueries = new ArrayList<>();
// first document // first document
@ -576,15 +639,18 @@ public class CriteriaQueryTests {
elasticsearchTemplate.bulkIndex(indexQueries); elasticsearchTemplate.bulkIndex(indexQueries);
elasticsearchTemplate.refresh(SampleEntity.class); elasticsearchTemplate.refresh(SampleEntity.class);
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").between(null, 550)); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").between(null, 550));
// when // when
Page<SampleEntity> page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); Page<SampleEntity> page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class);
// then // then
assertThat(page, is(notNullValue())); assertThat(page).isNotNull();
assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); assertThat(page.getTotalElements()).isGreaterThanOrEqualTo(1);
} }
@Test @Test
public void shouldPerformLessThanEqualOperation() { public void shouldPerformLessThanEqualOperation() {
// given // given
List<IndexQuery> indexQueries = new ArrayList<>(); List<IndexQuery> indexQueries = new ArrayList<>();
// first document // first document
@ -616,15 +682,18 @@ public class CriteriaQueryTests {
elasticsearchTemplate.bulkIndex(indexQueries); elasticsearchTemplate.bulkIndex(indexQueries);
elasticsearchTemplate.refresh(SampleEntity.class); elasticsearchTemplate.refresh(SampleEntity.class);
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").lessThanEqual(750)); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").lessThanEqual(750));
// when // when
Page<SampleEntity> page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); Page<SampleEntity> page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class);
// then // then
assertThat(page, is(notNullValue())); assertThat(page).isNotNull();
assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); assertThat(page.getTotalElements()).isGreaterThanOrEqualTo(1);
} }
@Test @Test
public void shouldPerformGreaterThanEquals() { public void shouldPerformGreaterThanEquals() {
// given // given
List<IndexQuery> indexQueries = new ArrayList<>(); List<IndexQuery> indexQueries = new ArrayList<>();
// first document // first document
@ -656,15 +725,18 @@ public class CriteriaQueryTests {
elasticsearchTemplate.bulkIndex(indexQueries); elasticsearchTemplate.bulkIndex(indexQueries);
elasticsearchTemplate.refresh(SampleEntity.class); elasticsearchTemplate.refresh(SampleEntity.class);
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").greaterThanEqual(950)); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("rate").greaterThanEqual(950));
// when // when
Page<SampleEntity> page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); Page<SampleEntity> page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class);
// then // then
assertThat(page, is(notNullValue())); assertThat(page).isNotNull();
assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); assertThat(page.getTotalElements()).isGreaterThanOrEqualTo(1);
} }
@Test @Test
public void shouldPerformBoostOperation() { public void shouldPerformBoostOperation() {
// given // given
List<IndexQuery> indexQueries = new ArrayList<>(); List<IndexQuery> indexQueries = new ArrayList<>();
// first document // first document
@ -696,14 +768,17 @@ public class CriteriaQueryTests {
elasticsearchTemplate.bulkIndex(indexQueries); elasticsearchTemplate.bulkIndex(indexQueries);
elasticsearchTemplate.refresh(SampleEntity.class); elasticsearchTemplate.refresh(SampleEntity.class);
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").contains("foo").boost(1)); CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").contains("foo").boost(1));
// when // when
Page<SampleEntity> page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); Page<SampleEntity> page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class);
// then // then
assertThat(page.getTotalElements(), is(greaterThanOrEqualTo(1L))); assertThat(page.getTotalElements()).isGreaterThanOrEqualTo(1);
} }
@Test @Test
public void shouldReturnDocumentAboveMinimalScoreGivenCriteria() { public void shouldReturnDocumentAboveMinimalScoreGivenCriteria() {
// given // given
List<IndexQuery> indexQueries = new ArrayList<>(); List<IndexQuery> indexQueries = new ArrayList<>();
@ -715,11 +790,34 @@ public class CriteriaQueryTests {
elasticsearchTemplate.refresh(SampleEntity.class); elasticsearchTemplate.refresh(SampleEntity.class);
// when // when
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria("message").contains("a").or(new Criteria("message").contains("b"))); CriteriaQuery criteriaQuery = new CriteriaQuery(
new Criteria("message").contains("a").or(new Criteria("message").contains("b")));
criteriaQuery.setMinScore(2.0F); criteriaQuery.setMinScore(2.0F);
Page<SampleEntity> page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class); Page<SampleEntity> page = elasticsearchTemplate.queryForPage(criteriaQuery, SampleEntity.class);
// then // then
assertThat(page.getTotalElements(), is(1L)); assertThat(page.getTotalElements()).isEqualTo(1);
assertThat(page.getContent().get(0).getMessage(), is("ab")); assertThat(page.getContent().get(0).getMessage()).isEqualTo("ab");
}
@Builder
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "test-index-sample-core-query", type = "test-type", shards = 1, replicas = 0, refreshInterval = "-1")
static class SampleEntity {
@Id private String id;
@org.springframework.data.elasticsearch.annotations.Field(type = Text, store = true,
fielddata = true) private String type;
@Field(type = Text, store = true, fielddata = true) private String message;
private int rate;
@ScriptedField private Double scriptedRate;
private boolean available;
private String highlightedMessage;
private GeoPoint location;
@Version private Long version;
@Score private float score;
} }
} }

View File

@ -1,50 +0,0 @@
/*
* Copyright 2014-2019 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
*
* https://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.entities;
import java.util.Date;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
/**
* @author Kevin Letur
*/
public class AbstractInheritedEntity {
@Id
private String id;
@Field(type = FieldType.Date, index = false)
private Date createdDate;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Date getCreatedDate() {
return createdDate;
}
public void setCreatedDate(Date createdDate) {
this.createdDate = createdDate;
}
}

View File

@ -1,42 +0,0 @@
/*
* Copyright 2013-2019 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
*
* https://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.entities;
/**
* @author Rizwan Idrees
* @author Mohsin Husen
*/
public class Author {
private String id;
private String name;
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;
}
}

View File

@ -1,62 +0,0 @@
/*
* Copyright 2013-2019 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
*
* https://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.entities;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import org.springframework.data.elasticsearch.annotations.InnerField;
import org.springframework.data.elasticsearch.annotations.MultiField;
/**
* @author Rizwan Idrees
* @author Mohsin Husen
* @author Nordine Bittich
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Document(indexName = "test-index-book", type = "book", shards = 1, replicas = 0, refreshInterval = "-1")
public class Book {
@Id
private String id;
private String name;
@Field(type = FieldType.Object)
private Author author;
@Field(type = FieldType.Nested)
private Map<Integer, Collection<String>> buckets = new HashMap<>();
@MultiField(
mainField = @Field(type = FieldType.Text, analyzer = "whitespace"),
otherFields = {
@InnerField(suffix = "prefix", type = FieldType.Text, analyzer = "stop", searchAnalyzer = "standard")
}
)
private String description;
}

View File

@ -1,54 +0,0 @@
/*
* Copyright 2013-2019 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
*
* https://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.entities;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
/**
* @author Rizwan Idrees
* @author Mohsin Husen
* @author Artur Konczak
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Car {
private String name;
private String model;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
}

View File

@ -1,47 +0,0 @@
/*
* Copyright 2018-2019 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
*
* https://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.entities;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
/**
* @author Sascha Woo
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Document(indexName = "test-copy-to", type = "test", shards = 1, replicas = 0, refreshInterval = "-1")
public class CopyToEntity {
@Id private String id;
@Field(type = FieldType.Keyword, copyTo = "name") private String firstName;
@Field(type = FieldType.Keyword, copyTo = "name") private String lastName;
@Field(type = FieldType.Keyword) private String name;
}

View File

@ -1,70 +0,0 @@
/*
* Copyright 2013-2019 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
*
* https://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.entities;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Version;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
/**
* @author Rizwan Idrees
* @author Mohsin Husen
*/
@Document(indexName = "test-index-double-keyed-entity", type = "double-keyed-entity", shards = 1, replicas = 0, refreshInterval = "-1")
public class DoubleIDEntity {
@Id
private Double id;
private String type;
private String message;
@Version
private Long version;
public Double getId() {
return id;
}
public void setId(Double 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 Long getVersion() {
return version;
}
public void setVersion(Long version) {
this.version = version;
}
}

View File

@ -1,61 +0,0 @@
/*
* Copyright 2014-2019 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
*
* https://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.entities;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Mapping;
import org.springframework.data.elasticsearch.annotations.Setting;
/**
* Sample DynamicSettingAndMappingEntity for test out dynamic setting using @Setting Annotation
*
* @author Mohsin Husen
*/
@Document(indexName = "test-index-dynamic-setting-and-mapping", type = "test-setting-type")
@Setting(settingPath = "/settings/test-settings.json")
@Mapping(mappingPath = "/mappings/test-mappings.json")
public class DynamicSettingAndMappingEntity {
@Id
private String id;
private String name;
private String email;
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 String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}

View File

@ -1,51 +0,0 @@
/*
* Copyright 2014-2019 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
*
* https://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.entities;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Mapping;
/**
* Sample FieldDynamicMappingEntity for test dynamic mapping using @Mapping Annotation at field level
*
* @author Ted Liang
*/
@Document(indexName = "test-index-field-dynamic-mapping", type = "test-field-mapping-type")
public class FieldDynamicMappingEntity {
@Id
private String id;
@Mapping(mappingPath = "/mappings/test-field-mappings.json")
private byte[] file;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public byte[] getFile() {
return file;
}
public void setFile(byte[] file) {
this.file = file;
}
}

View File

@ -1,49 +0,0 @@
/*
* Copyright 2018-2019 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
*
* https://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.entities;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.elasticsearch.index.VersionType;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Version;
import org.springframework.data.elasticsearch.annotations.Document;
/**
* @author Ivan Greene
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Builder
@Document(indexName = "test-index-sample", type = "test-type", shards = 1, replicas = 0,
refreshInterval = "-1", versionType = VersionType.EXTERNAL_GTE)
public class GTEVersionEntity {
@Version
private Long version;
@Id
private String id;
private String name;
}

View File

@ -1,48 +0,0 @@
package org.springframework.data.elasticsearch.entities;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
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.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 = "test-index-geo", type = "geo-test-index", 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;
}

View File

@ -1,59 +0,0 @@
/*
* Copyright 2014-2019 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
*
* https://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.entities;
import java.util.List;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
/**
* @author Mohsin Husen
*/
public class GirlFriend {
private String name;
private String type;
@Field(type = FieldType.Nested)
private List<Car> cars;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public List<Car> getCars() {
return cars;
}
public void setCars(List<Car> cars) {
this.cars = cars;
}
}

View File

@ -1,37 +0,0 @@
/*
* Copyright 2017-2019 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
*
* https://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.entities;
import java.util.HashSet;
import java.util.Set;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
/**
* Created by akonczak on 21/08/2016.
*/
@Document(indexName = "test-index-group", type = "group")
public class Group {
@Id
String id;
@Field(type = FieldType.Nested, ignoreFields ={"groups"})
private Set<User> users = new HashSet<>();
}

View File

@ -1,83 +0,0 @@
/*
* Copyright 2014-2019 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
*
* https://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.entities;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Version;
import org.springframework.data.elasticsearch.annotations.Document;
/**
* @author Abdul Waheed
* @author Mohsin Husen
*/
@Document(indexName = "test-index-1", type = "hetro", replicas = 0, shards = 1)
public class HetroEntity1 {
@Id
private String id;
private String firstName;
@Version
private Long version;
public HetroEntity1(String id, String firstName) {
this.id = id;
this.firstName = firstName;
this.version = System.currentTimeMillis();
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public Long getVersion() {
return version;
}
public void setVersion(Long version) {
this.version = version;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof SampleEntity)) {
return false;
}
if (this == obj) {
return true;
}
HetroEntity1 rhs = (HetroEntity1) obj;
return new EqualsBuilder().append(this.id, rhs.id).append(this.firstName, rhs.firstName).append(this.version, rhs.version).isEquals();
}
@Override
public int hashCode() {
return new HashCodeBuilder().append(id).append(firstName).append(version).toHashCode();
}
}

View File

@ -1,83 +0,0 @@
/*
* Copyright 2014-2019 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
*
* https://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.entities;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Version;
import org.springframework.data.elasticsearch.annotations.Document;
/**
* @author Abdul Waheed
* @author Mohsin Husen
*/
@Document(indexName = "test-index-2", type = "hetro", replicas = 0, shards = 1)
public class HetroEntity2 {
@Id
private String id;
private String lastName;
@Version
private Long version;
public HetroEntity2(String id, String lastName) {
this.id = id;
this.lastName = lastName;
this.version = System.currentTimeMillis();
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Long getVersion() {
return version;
}
public void setVersion(Long version) {
this.version = version;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof SampleEntity)) {
return false;
}
if (this == obj) {
return true;
}
HetroEntity2 rhs = (HetroEntity2) obj;
return new EqualsBuilder().append(this.id, rhs.id).append(this.lastName, rhs.lastName).append(this.version, rhs.version).isEquals();
}
@Override
public int hashCode() {
return new HashCodeBuilder().append(id).append(lastName).append(version).toHashCode();
}
}

View File

@ -1,70 +0,0 @@
/*
* Copyright 2013-2019 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
*
* https://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.entities;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Version;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
/**
* @author Rizwan Idrees
* @author Mohsin Husen
*/
@Document(indexName = "test-index-integer-keyed-entity", type = "integer-keyed-entity", shards = 1, replicas = 0, refreshInterval = "-1")
public class IntegerIDEntity {
@Id
private Integer id;
private String type;
private String message;
@Version
private Long version;
public Integer getId() {
return id;
}
public void setId(Integer 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 Long getVersion() {
return version;
}
public void setVersion(Long version) {
this.version = version;
}
}

View File

@ -1,31 +0,0 @@
/*
* Copyright 2014-2019 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
*
* https://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.entities;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
/**
* MinimalEntity
*
* @author Philipp Jardas
*/
@Document(indexName = "test-index-minimal", type = "type")
public class MinimalEntity {
@Id
private String id;
}

View File

@ -1,46 +0,0 @@
/*
* Copyright 2013-2019 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
*
* https://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.entities;
import org.springframework.data.annotation.Id;
/**
* @author Rizwan Idrees
* @author Mohsin Husen
*/
public class NonDocumentEntity {
@Id
private String someId;
private String someField1;
private String someField2;
public String getSomeField1() {
return someField1;
}
public void setSomeField1(String someField1) {
this.someField1 = someField1;
}
public String getSomeField2() {
return someField2;
}
public void setSomeField2(String someField2) {
this.someField2 = someField2;
}
}

View File

@ -1,52 +0,0 @@
/*
* Copyright 2018-2019 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
*
* https://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.entities;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import org.springframework.data.elasticsearch.annotations.InnerField;
import org.springframework.data.elasticsearch.annotations.MultiField;
import org.springframework.data.elasticsearch.annotations.Setting;
/**
* @author Sascha Woo
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Document(indexName = "test-index-normalizer", type = "test", shards = 1, replicas = 0, refreshInterval = "-1")
@Setting(settingPath = "/settings/test-normalizer.json")
public class NormalizerEntity {
@Id private String id;
@Field(type = FieldType.Keyword, normalizer = "lower_case_normalizer")
private String name;
@MultiField(mainField = @Field(type = FieldType.Text), otherFields = { @InnerField(suffix = "lower_case",
type = FieldType.Keyword, normalizer = "lower_case_normalizer") })
private String description;
}

View File

@ -1,101 +0,0 @@
/*
* Copyright 2014-2019 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
*
* https://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.entities;
import org.springframework.core.style.ToStringCreator;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import org.springframework.data.elasticsearch.annotations.Parent;
/**
* ParentEntity
*
* @author Philipp Jardas
* @author Mohsin Husen
*/
@Document(indexName = ParentEntity.INDEX, type = ParentEntity.PARENT_TYPE, shards = 1, replicas = 0, refreshInterval = "-1")
public class ParentEntity {
public static final String INDEX = "parent-child";
public static final String PARENT_TYPE = "parent-entity";
public static final String CHILD_TYPE = "child-entity";
@Id
private String id;
@Field(type = FieldType.Text, store = true)
private String name;
public ParentEntity() {
}
public ParentEntity(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
@Override
public String toString() {
return new ToStringCreator(this).append("id", id).append("name", name).toString();
}
@Document(indexName = INDEX, type = CHILD_TYPE, shards = 1, replicas = 0, refreshInterval = "-1")
public static class ChildEntity {
@Id
private String id;
@Field(type = FieldType.Text, store = true)
@Parent(type = PARENT_TYPE)
private String parentId;
@Field(type = FieldType.Text, store = true)
private String name;
public ChildEntity() {
}
public ChildEntity(String id, String parentId, String name) {
this.id = id;
this.parentId = parentId;
this.name = name;
}
public String getId() {
return id;
}
public String getParentId() {
return parentId;
}
public String getName() {
return name;
}
@Override
public String toString() {
return new ToStringCreator(this).append("id", id).append("parentId", parentId).append("name", name).toString();
}
}
}

View File

@ -1,77 +0,0 @@
/*
* Copyright 2013-2019 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
*
* https://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.entities;
import java.util.List;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
/**
* @author Rizwan Idrees
* @author Mohsin Husen
* @author Artur Konczak
*/
@Document(indexName = "test-index-person", type = "user", shards = 1, replicas = 0, refreshInterval = "-1")
public class Person {
@Id
private String id;
private String name;
@Field(type = FieldType.Nested)
private List<Car> car;
@Field(type = FieldType.Nested, includeInParent = true)
private List<Book> books;
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 List<Car> getCar() {
return car;
}
public void setCar(List<Car> car) {
this.car = car;
}
public List<Book> getBooks() {
return books;
}
public void setBooks(List<Book> books) {
this.books = books;
}
}

View File

@ -1,88 +0,0 @@
/*
* Copyright 2014-2019 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
*
* https://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.entities;
import java.util.List;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
/**
* @author Rizwan Idrees
* @author Mohsin Husen
* @author Artur Konczak
*/
@Document(indexName = "test-index-person-multiple-level-nested", type = "user", shards = 1, replicas = 0, refreshInterval = "-1")
public class PersonMultipleLevelNested {
@Id
private String id;
private String name;
@Field(type = FieldType.Nested)
private List<GirlFriend> girlFriends;
@Field(type = FieldType.Nested)
private List<Car> cars;
@Field(type = FieldType.Nested, includeInParent = true)
private List<Car> bestCars;
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 List<GirlFriend> getGirlFriends() {
return girlFriends;
}
public void setGirlFriends(List<GirlFriend> girlFriends) {
this.girlFriends = girlFriends;
}
public List<Car> getCars() {
return cars;
}
public void setCars(List<Car> cars) {
this.cars = cars;
}
public List<Car> getBestCars() {
return bestCars;
}
public void setBestCars(List<Car> bestCars) {
this.bestCars = bestCars;
}
}

View File

@ -1,97 +0,0 @@
/*
* Copyright 2014-2019 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
*
* https://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.entities;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.Date;
import java.util.List;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
/**
* @author Mohsin Husen
* @author Artur Konczak
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Document(indexName = "test-index-product", type = "test-product-type", shards = 1, replicas = 0, refreshInterval = "-1")
public class Product {
@Id
private String id;
private List<String> title;
private String name;
private String description;
private String text;
private List<String> categories;
private Float weight;
@Field(type = FieldType.Float)
private Float price;
private Integer popularity;
private boolean available;
private String location;
private Date lastModified;
@Override
public int hashCode() {
return id.hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Product other = (Product) obj;
if (id == null) {
if (other.id != null) {
return false;
}
} else if (!id.equals(other.id)) {
return false;
}
return true;
}
}

View File

@ -1,73 +0,0 @@
package org.springframework.data.elasticsearch.entities;
import static org.springframework.data.elasticsearch.annotations.FieldType.*;
import static org.springframework.data.elasticsearch.annotations.FieldType.Text;
import java.util.Date;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
/**
* @author Jakub Vavrik
*/
@Document(indexName = "test-index-date-mapping", type = "mapping", shards = 1, replicas = 0, refreshInterval = "-1")
public class SampleDateMappingEntity {
@Id
private String id;
@Field(type = Text, index = false, store = true, analyzer = "standard")
private String message;
@Field(type = Date, format = DateFormat.custom, pattern = "dd.MM.yyyy hh:mm")
private Date customFormatDate;
@Field(type = Date)
private Date defaultFormatDate;
@Field(type = Date, format = DateFormat.basic_date)
private Date basicFormatDate;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Date getCustomFormatDate() {
return customFormatDate;
}
public void setCustomFormatDate(Date customFormatDate) {
this.customFormatDate = customFormatDate;
}
public Date getDefaultFormatDate() {
return defaultFormatDate;
}
public void setDefaultFormatDate(Date defaultFormatDate) {
this.defaultFormatDate = defaultFormatDate;
}
public Date getBasicFormatDate() {
return basicFormatDate;
}
public void setBasicFormatDate(Date basicFormatDate) {
this.basicFormatDate = basicFormatDate;
}
}

View File

@ -1,25 +0,0 @@
package org.springframework.data.elasticsearch.entities;
import java.util.HashMap;
import java.util.Map;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.DynamicTemplates;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
/**
* @author Petr Kukral
*/
@Document(indexName = "test-dynamictemplates", type = "test-dynamictemplatestype", indexStoreType = "memory", shards = 1,
replicas = 0, refreshInterval = "-1")
@DynamicTemplates(mappingPath = "/mappings/test-dynamic_templates_mappings.json")
public class SampleDynamicTemplatesEntity {
@Id
private String id;
@Field(type = FieldType.Object)
private Map<String, String> names = new HashMap<String, String>();
}

View File

@ -1,25 +0,0 @@
package org.springframework.data.elasticsearch.entities;
import java.util.HashMap;
import java.util.Map;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.DynamicTemplates;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
/**
* @author Petr Kukral
*/
@Document(indexName = "test-dynamictemplates", type = "test-dynamictemplatestype", indexStoreType = "memory", shards = 1,
replicas = 0, refreshInterval = "-1")
@DynamicTemplates(mappingPath = "/mappings/test-dynamic_templates_mappings_two.json")
public class SampleDynamicTemplatesEntityTwo {
@Id
private String id;
@Field(type = FieldType.Object)
private Map<String, String> names = new HashMap<String, String>();
}

View File

@ -1,99 +0,0 @@
/*
* Copyright 2013-2019 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
*
* https://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.entities;
import static org.springframework.data.elasticsearch.annotations.FieldType.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Version;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.Score;
import org.springframework.data.elasticsearch.annotations.ScriptedField;
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
/**
* @author Rizwan Idrees
* @author Mohsin Husen
* @author Chris White
* @author Sascha Woo
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Builder
@Document(indexName = "test-index-sample", type = "test-type", shards = 1, replicas = 0, refreshInterval = "-1")
public class SampleEntity {
@Id
private String id;
@Field(type = Text, store = true, fielddata = true)
private String type;
@Field(type = Text, store = true, fielddata = true)
private String message;
private int rate;
@ScriptedField
private Double scriptedRate;
private boolean available;
private String highlightedMessage;
private GeoPoint location;
@Version
private Long version;
@Score
private float score;
@Override
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 (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() {
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;
}
}

View File

@ -1,96 +0,0 @@
/*
* Copyright 2013-2019 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
*
* https://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.entities;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.UUID;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Version;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import org.springframework.data.elasticsearch.annotations.ScriptedField;
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
/**
* @author Gad Akuka
* @author Rizwan Idrees
* @author Mohsin Husen
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Document(indexName = "test-index-uuid-keyed", type = "test-type-uuid-keyed", shards = 1, replicas = 0, refreshInterval = "-1")
public class SampleEntityUUIDKeyed {
@Id
private UUID id;
private String type;
@Field(type = FieldType.Text, fielddata = true)
private String message;
private int rate;
@ScriptedField
private Long scriptedRate;
private boolean available;
private String highlightedMessage;
private GeoPoint location;
@Version
private Long version;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SampleEntityUUIDKeyed that = (SampleEntityUUIDKeyed) 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 (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() {
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;
}
}

View File

@ -1,39 +0,0 @@
/*
* Copyright 2014-2019 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
*
* https://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.entities;
import static org.springframework.data.elasticsearch.annotations.FieldType.Text;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
/**
* @author Kevin Leturc
*/
@Document(indexName = "test-index-sample-inherited", type = "mapping", shards = 1, replicas = 0, refreshInterval = "-1")
public class SampleInheritedEntity extends AbstractInheritedEntity {
@Field(type = Text, index = false, store = true, analyzer = "standard")
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}

View File

@ -1,68 +0,0 @@
/*
* Copyright 2013-2019 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
*
* https://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.entities;
import static org.springframework.data.elasticsearch.annotations.FieldType.Text;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
/**
* @author Rizwan Idrees
* @author Mohsin Husen
*/
@Document(indexName = "test-index-sample-mapping", type = "mapping", shards = 1, replicas = 0, refreshInterval = "-1")
public class SampleMappingEntity {
@Id
private String id;
@Field(type = Text, index = false, store = true, analyzer = "standard")
private String message;
private NestedEntity nested;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
static class NestedEntity {
@Field(type = Text)
private String someField;
public String getSomeField() {
return someField;
}
public void setSomeField(String someField) {
this.someField = someField;
}
}
}

View File

@ -1,79 +0,0 @@
/*
* Copyright 2013-2019 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
*
* https://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.entities;
import static org.springframework.data.elasticsearch.annotations.FieldType.Text;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Transient;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
/**
* @author Jakub Vavrik
*/
@Document(indexName = "test-index-recursive-mapping", type = "mapping", shards = 1, replicas = 0, refreshInterval = "-1")
public class SampleTransientEntity {
@Id
private String id;
@Field(type = Text, index = false, store = true, analyzer = "standard")
private String message;
@Transient
private NestedEntity nested;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
static class NestedEntity {
@Field
private static NestedEntity someField = new NestedEntity();
@Field
private Boolean something;
public NestedEntity getSomeField() {
return someField;
}
public void setSomeField(NestedEntity someField) {
this.someField = someField;
}
public Boolean getSomething() {
return something;
}
public void setSomething(Boolean something) {
this.something = something;
}
}
}

View File

@ -1,34 +0,0 @@
/*
* Copyright 2013-2019 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
*
* https://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.entities;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
/**
* @author Stuart Stevenson
* @author Mohsin Husen
*/
@Document(indexName = "test-index-simple-recursive", type = "circular-object", shards = 1, replicas = 0, refreshInterval = "-1")
public class SimpleRecursiveEntity {
@Id
private String id;
@Field(type = FieldType.Object, ignoreFields = {"circularObject"})
private SimpleRecursiveEntity circularObject;
}

View File

@ -1,39 +0,0 @@
/*
* Copyright 2014-2019 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
*
* https://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.entities;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
/**
* SpELEntity
*
* @author Artur Konczak
*/
@Document(indexName = "#{'test-index-abz'+'-'+'entity'}", type = "#{'my'+'Type'}", shards = 1,
replicas = 0, refreshInterval = "-1")
public class SpELEntity {
@Id private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}

View File

@ -1,50 +0,0 @@
/*
* Copyright 2013-2019 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
*
* https://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.entities;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.math.BigDecimal;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
/**
* @author Artur Konczak
* @author Mohsin Husen
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Document(indexName = "test-index-stock", type = "price", shards = 1, replicas = 0, refreshInterval = "-1")
public class StockPrice {
@Id
private String id;
private String symbol;
@Field(type = FieldType.Double)
private BigDecimal price;
}

View File

@ -1,52 +0,0 @@
/*
* Copyright 2014-2019 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
*
* https://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.entities;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Mapping;
import org.springframework.data.elasticsearch.annotations.Setting;
/**
* Sample DynamicSettingAndMappingEntity for test out dynamic setting using @Setting Annotation
*
* @author Mohsin Husen
*/
@Document(indexName = "test-index-synonym", type = "synonym-type")
@Setting(settingPath = "/synonyms/settings.json")
@Mapping(mappingPath = "/synonyms/mappings.json")
public class SynonymEntity {
@Id
private String id;
private String text;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}

View File

@ -1,28 +0,0 @@
package org.springframework.data.elasticsearch.entities;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
/**
* Created by akonczak on 12/12/2015.
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Document(indexName = "test-index-server-configuration", type = "test-type", useServerConfiguration = true, shards = 10, replicas = 10, refreshInterval = "-1")
public class UseServerConfigurationEntity {
@Id
private String id;
private String val;
}

View File

@ -1,36 +0,0 @@
/*
* Copyright 2017-2019 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
*
* https://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.entities;
import java.util.HashSet;
import java.util.Set;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
/**
* Created by akonczak on 21/08/2016.
*/
@Document(indexName = "test-index-user", type = "user")
public class User {
@Id
private String id;
@Field(type= FieldType.Nested,ignoreFields={"users"})
private Set<Group> groups = new HashSet<>();
}

View File

@ -15,17 +15,20 @@
*/ */
package org.springframework.data.elasticsearch.immutable; package org.springframework.data.elasticsearch.immutable;
import static org.hamcrest.Matchers.*; import static org.assertj.core.api.Assertions.*;
import static org.junit.Assert.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import java.util.Optional; import java.util.Optional;
import org.junit.Before; import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.repository.CrudRepository;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@ -34,6 +37,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
* @author Oliver Gierke * @author Oliver Gierke
* @author Mark Paluch * @author Mark Paluch
* @author Christoph Strobl * @author Christoph Strobl
* @author Peter-Josef Meisch
*/ */
@RunWith(SpringJUnit4ClassRunner.class) @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:immutable-repository-test.xml") @ContextConfiguration("classpath:immutable-repository-test.xml")
@ -50,27 +54,46 @@ public class ImmutableElasticsearchRepositoryTests {
operations.refresh(ImmutableEntity.class); operations.refresh(ImmutableEntity.class);
} }
/** @Test // DATAES-281
* @see DATAES-281
*/
@Test
@Ignore("fix me - UnsupportedOperation")
public void shouldSaveAndFindImmutableDocument() { public void shouldSaveAndFindImmutableDocument() {
// when // when
ImmutableEntity entity = repository.save(new ImmutableEntity("test name")); ImmutableEntity entity = repository.save(new ImmutableEntity("test name"));
assertThat(entity.getId(), is(notNullValue())); assertThat(entity.getId()).isNotNull();
// then // then
Optional<ImmutableEntity> entityFromElasticSearch = repository.findById(entity.getId()); Optional<ImmutableEntity> entityFromElasticSearch = repository.findById(entity.getId());
assertThat(entityFromElasticSearch.isPresent(), is(true)); assertThat(entityFromElasticSearch).isPresent();
entityFromElasticSearch.ifPresent(immutableEntity -> { entityFromElasticSearch.ifPresent(immutableEntity -> {
assertThat(immutableEntity.getName(), is("test name")); assertThat(immutableEntity.getName()).isEqualTo("test name");
assertThat(immutableEntity.getId(), is(entity.getId())); assertThat(immutableEntity.getId()).isEqualTo(entity.getId());
}); });
} }
/**
* @author Young Gu
* @author Oliver Gierke
*/
@Document(indexName = "test-index-immutable")
@NoArgsConstructor(force = true)
@Getter
static class ImmutableEntity {
private final String id, name;
public ImmutableEntity(String name) {
this.id = null;
this.name = name;
}
}
/**
* @author Young Gu
* @author Oliver Gierke
*/
public interface ImmutableElasticsearchRepository extends CrudRepository<ImmutableEntity, String> {}
} }

View File

@ -1,27 +0,0 @@
/*
* Copyright 2013-2019 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
*
* https://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.repositories.book;
import org.springframework.data.elasticsearch.entities.Book;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
/**
* @author Rizwan Idrees
* @author Mohsin Husen
*/
public interface SampleElasticSearchBookRepository extends ElasticsearchRepository<Book, String> {
}

View File

@ -17,7 +17,6 @@ package org.springframework.data.elasticsearch.repositories.cdi;
import java.util.Optional; import java.util.Optional;
import org.springframework.data.elasticsearch.entities.Product;
import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.CrudRepository;
/** /**
@ -26,7 +25,7 @@ import org.springframework.data.repository.CrudRepository;
* @author Mark Paluch * @author Mark Paluch
* @author Christoph Strobl * @author Christoph Strobl
*/ */
public interface CdiProductRepository extends CrudRepository<Product, String> { public interface CdiProductRepository extends CrudRepository<CdiRepositoryTests.Product, String> {
Optional<Product> findById(String id); Optional<CdiRepositoryTests.Product> findById(String id);
} }

View File

@ -15,9 +15,19 @@
*/ */
package org.springframework.data.elasticsearch.repositories.cdi; package org.springframework.data.elasticsearch.repositories.cdi;
import static org.hamcrest.CoreMatchers.*; import static org.assertj.core.api.Assertions.*;
import static org.junit.Assert.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional; import java.util.Optional;
import org.apache.webbeans.cditest.CdiTestContainer; import org.apache.webbeans.cditest.CdiTestContainer;
@ -26,12 +36,18 @@ import org.junit.AfterClass;
import org.junit.Before; import org.junit.Before;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import org.junit.Test; import org.junit.Test;
import org.springframework.data.elasticsearch.entities.Product; import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import org.springframework.data.elasticsearch.annotations.InnerField;
import org.springframework.data.elasticsearch.annotations.MultiField;
/** /**
* @author Mohsin Husen * @author Mohsin Husen
* @author Mark Paluch * @author Mark Paluch
* @author Christoph Strobl * @author Christoph Strobl
* @author Peter-Josef Meisch
*/ */
public class CdiRepositoryTests { public class CdiRepositoryTests {
@ -63,12 +79,13 @@ public class CdiRepositoryTests {
personRepository = client.getSamplePersonRepository(); personRepository = client.getSamplePersonRepository();
repository.deleteAll(); repository.deleteAll();
qualifiedProductRepository = client.getQualifiedProductRepository(); qualifiedProductRepository = client.getQualifiedProductRepository();
qualifiedProductRepository.deleteAll();
} }
@Test @Test
public void testCdiRepository() { public void testCdiRepository() {
assertNotNull(repository); assertThat(repository).isNotNull();
Product bean = new Product(); Product bean = new Product();
bean.setId("id-1"); bean.setId("id-1");
@ -76,33 +93,30 @@ public class CdiRepositoryTests {
repository.save(bean); repository.save(bean);
assertTrue(repository.existsById(bean.getId())); assertThat(repository.existsById(bean.getId())).isTrue();
Optional<Product> retrieved = repository.findById(bean.getId()); Optional<Product> retrieved = repository.findById(bean.getId());
assertTrue(retrieved.isPresent()); assertThat(retrieved).isPresent();
retrieved.ifPresent(product -> { retrieved.ifPresent(product -> {
assertEquals(bean.getId(), product.getId()); assertThat(bean.getId()).isEqualTo(product.getId());
assertEquals(bean.getName(), product.getName()); assertThat(bean.getName()).isEqualTo(product.getName());
}); });
assertEquals(1, repository.count()); assertThat(repository.count()).isEqualTo(1);
assertTrue(repository.existsById(bean.getId())); assertThat(repository.existsById(bean.getId())).isTrue();
repository.delete(bean); repository.delete(bean);
assertEquals(0, repository.count()); assertThat(repository.count()).isEqualTo(0);
retrieved = repository.findById(bean.getId()); retrieved = repository.findById(bean.getId());
assertFalse(retrieved.isPresent()); assertThat(retrieved).isNotPresent();
} }
/** @Test // DATAES-234
* @see DATAES-234
*/
@Test
public void testQualifiedCdiRepository() { public void testQualifiedCdiRepository() {
assertNotNull(qualifiedProductRepository); assertThat(qualifiedProductRepository).isNotNull();
Product bean = new Product(); Product bean = new Product();
bean.setId("id-1"); bean.setId("id-1");
@ -110,32 +124,226 @@ public class CdiRepositoryTests {
qualifiedProductRepository.save(bean); qualifiedProductRepository.save(bean);
assertTrue(qualifiedProductRepository.existsById(bean.getId())); assertThat(qualifiedProductRepository.existsById(bean.getId())).isTrue();
Optional<Product> retrieved = qualifiedProductRepository.findById(bean.getId()); Optional<Product> retrieved = qualifiedProductRepository.findById(bean.getId());
assertTrue(retrieved.isPresent()); assertThat(retrieved).isPresent();
retrieved.ifPresent(product -> { retrieved.ifPresent(product -> {
assertEquals(bean.getId(), product.getId()); assertThat(bean.getId()).isEqualTo(product.getId());
assertEquals(bean.getName(), product.getName()); assertThat(bean.getName()).isEqualTo(product.getName());
}); });
assertEquals(1, qualifiedProductRepository.count()); assertThat(qualifiedProductRepository.count()).isEqualTo(1);
assertTrue(qualifiedProductRepository.existsById(bean.getId())); assertThat(qualifiedProductRepository.existsById(bean.getId())).isTrue();
qualifiedProductRepository.delete(bean); qualifiedProductRepository.delete(bean);
assertEquals(0, qualifiedProductRepository.count()); assertThat(qualifiedProductRepository.count()).isEqualTo(0);
retrieved = qualifiedProductRepository.findById(bean.getId()); retrieved = qualifiedProductRepository.findById(bean.getId());
assertFalse(retrieved.isPresent()); assertThat(retrieved).isNotPresent();
}
@Test // DATAES-113
public void returnOneFromCustomImpl() {
assertThat(personRepository.returnOne()).isEqualTo(1);
} }
/** /**
* @see DATAES-113 * @author Mohsin Husen
* @author Artur Konczak
*/ */
@Test @Setter
public void returnOneFromCustomImpl() { @Getter
assertThat(personRepository.returnOne(), is(1)); @NoArgsConstructor
@AllArgsConstructor
@Builder
@Document(indexName = "test-index-product-cdi-repository", type = "test-product-type", shards = 1, replicas = 0,
refreshInterval = "-1")
static class Product {
@Id private String id;
private List<String> title;
private String name;
private String description;
private String text;
private List<String> categories;
private Float weight;
@Field(type = FieldType.Float) private Float price;
private Integer popularity;
private boolean available;
private String location;
private Date lastModified;
@Override
public int hashCode() {
return id.hashCode();
} }
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Product other = (Product) obj;
if (id == null) {
if (other.id != null) {
return false;
}
} else if (!id.equals(other.id)) {
return false;
}
return true;
}
}
/**
* @author Rizwan Idrees
* @author Mohsin Husen
* @author Artur Konczak
*/
@Document(indexName = "test-index-person-cdi-repository", type = "user", shards = 1, replicas = 0, refreshInterval = "-1")
static class Person {
@Id private String id;
private String name;
@Field(type = FieldType.Nested) private List<Car> car;
@Field(type = FieldType.Nested, includeInParent = true) private List<Book> books;
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 List<Car> getCar() {
return car;
}
public void setCar(List<Car> car) {
this.car = car;
}
public List<Book> getBooks() {
return books;
}
public void setBooks(List<Book> books) {
this.books = books;
}
}
/**
* @author Rizwan Idrees
* @author Mohsin Husen
* @author Nordine Bittich
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Document(indexName = "test-index-book-cdi-repository", type = "book", shards = 1, replicas = 0, refreshInterval = "-1")
static class Book {
@Id private String id;
private String name;
@Field(type = FieldType.Object) private Author author;
@Field(type = FieldType.Nested) private Map<Integer, Collection<String>> buckets = new HashMap<>();
@MultiField(mainField = @Field(type = FieldType.Text, analyzer = "whitespace"),
otherFields = { @InnerField(suffix = "prefix", type = FieldType.Text, analyzer = "stop",
searchAnalyzer = "standard") }) private String description;
}
/**
* @author Rizwan Idrees
* @author Mohsin Husen
* @author Artur Konczak
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
static class Car {
private String name;
private String model;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
}
/**
* @author Rizwan Idrees
* @author Mohsin Husen
*/
static class Author {
private String id;
private String name;
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;
}
}
} }

View File

@ -15,7 +15,6 @@
*/ */
package org.springframework.data.elasticsearch.repositories.cdi; package org.springframework.data.elasticsearch.repositories.cdi;
import org.springframework.data.elasticsearch.entities.Product;
import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.CrudRepository;
/** /**
@ -24,6 +23,6 @@ import org.springframework.data.repository.CrudRepository;
*/ */
@PersonDB @PersonDB
@OtherQualifier @OtherQualifier
public interface QualifiedProductRepository extends CrudRepository<Product, String> { public interface QualifiedProductRepository extends CrudRepository<CdiRepositoryTests.Product, String> {
} }

View File

@ -15,13 +15,12 @@
*/ */
package org.springframework.data.elasticsearch.repositories.cdi; package org.springframework.data.elasticsearch.repositories.cdi;
import org.springframework.data.elasticsearch.entities.Person;
import org.springframework.data.repository.Repository; import org.springframework.data.repository.Repository;
/** /**
* @author Mark Paluch * @author Mark Paluch
* @see DATAES-113 * @see DATAES-113
*/ */
public interface SamplePersonRepository extends Repository<Person, Long>, SamplePersonRepositoryCustom { public interface SamplePersonRepository extends Repository<CdiRepositoryTests.Person, Long>, SamplePersonRepositoryCustom {
} }

View File

@ -0,0 +1,105 @@
/*
* Copyright 2013-2019 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
*
* https://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.repositories.complex.custommethod.autowiring;
import static org.assertj.core.api.Assertions.*;
import static org.springframework.data.elasticsearch.annotations.FieldType.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import java.lang.Double;
import java.lang.Long;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Version;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.Score;
import org.springframework.data.elasticsearch.annotations.ScriptedField;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
import org.springframework.data.elasticsearch.utils.IndexInitializer;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @author Artur Konczak
* @author Mohsin Husen
* @author Peter-Josef Meisch
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:complex-custom-method-repository-test.xml")
public class ComplexCustomMethodRepositoryTests {
@Autowired private ComplexElasticsearchRepository complexRepository;
@Autowired private ElasticsearchTemplate elasticsearchTemplate;
@Before
public void before() {
IndexInitializer.init(elasticsearchTemplate, SampleEntity.class);
}
@Test
public void shouldExecuteComplexCustomMethod() {
// given
// when
String result = complexRepository.doSomethingSpecial();
// then
assertThat(result).isEqualTo("2+2=4");
}
/**
* @author Rizwan Idrees
* @author Mohsin Husen
* @author Chris White
* @author Sascha Woo
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Builder
@Document(indexName = "test-index-sample-repositories-complex-custommethod-autowiring", type = "test-type", shards = 1, replicas = 0, refreshInterval = "-1")
static class SampleEntity {
@Id private String id;
@Field(type = Text, store = true, fielddata = true) private String type;
@Field(type = Text, store = true, fielddata = true) private String message;
private int rate;
@ScriptedField private Double scriptedRate;
private boolean available;
private String highlightedMessage;
private GeoPoint location;
@Version private Long version;
@Score private float score;
}
}

View File

@ -13,14 +13,13 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.data.elasticsearch.repository.complex; package org.springframework.data.elasticsearch.repositories.complex.custommethod.autowiring;
import org.springframework.data.elasticsearch.entities.SampleEntity;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
/** /**
* @author Artur Konczak * @author Artur Konczak
*/ */
public interface ComplexElasticsearchRepository extends ElasticsearchRepository<SampleEntity, String>, ComplexElasticsearchRepositoryCustom { public interface ComplexElasticsearchRepository extends ElasticsearchRepository<ComplexCustomMethodRepositoryTests.SampleEntity, String>, ComplexElasticsearchRepositoryCustom {
} }

View File

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.data.elasticsearch.repository.complex; package org.springframework.data.elasticsearch.repositories.complex.custommethod.autowiring;
/** /**
* @author Artur Konczak * @author Artur Konczak

Some files were not shown because too many files have changed in this diff Show More