From 92a18bd0fb768ffec18866fba438a92ef8d8d656 Mon Sep 17 00:00:00 2001 From: Mohsin Husen Date: Fri, 1 Feb 2013 12:37:03 +0000 Subject: [PATCH] Fixed issue related to nested objects --- .../core/CriteriaQueryProcessor.java | 2 +- .../core/ElasticsearchTemplate.java | 3 ++ .../SimpleElasticsearchPersistentEntity.java | 12 +++--- .../data/elasticsearch/Author.java | 22 ++++++++++ .../data/elasticsearch/Book.java | 34 +++++++++++++++ .../data/elasticsearch/NestedObjectTest.java | 43 +++++++++++++++++++ .../data/elasticsearch/NonDocumentEntity.java | 5 ++- .../elasticsearch/NonDocumentEntityTest.java | 24 +++++++++++ .../core/ElasticsearchTemplateTest.java | 2 - .../CustomMethodRepositoryTest.java | 1 - .../NonDocumentEntityRepository.java | 8 ++++ .../SampleElasticSearchBookRepository.java | 7 +++ .../repository-non-document-entity.xml | 16 +++++++ .../repository-test-nested-object.xml | 17 ++++++++ 14 files changed, 184 insertions(+), 12 deletions(-) create mode 100644 src/test/java/org/springframework/data/elasticsearch/Author.java create mode 100644 src/test/java/org/springframework/data/elasticsearch/Book.java create mode 100644 src/test/java/org/springframework/data/elasticsearch/NestedObjectTest.java create mode 100644 src/test/java/org/springframework/data/elasticsearch/NonDocumentEntityTest.java create mode 100644 src/test/java/org/springframework/data/elasticsearch/repositories/NonDocumentEntityRepository.java create mode 100644 src/test/java/org/springframework/data/elasticsearch/repositories/SampleElasticSearchBookRepository.java create mode 100644 src/test/resources/repository-non-document-entity.xml create mode 100644 src/test/resources/repository-test-nested-object.xml diff --git a/src/main/java/org/springframework/data/elasticsearch/core/CriteriaQueryProcessor.java b/src/main/java/org/springframework/data/elasticsearch/core/CriteriaQueryProcessor.java index 81c3e4a8f..e8d4ead9d 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/CriteriaQueryProcessor.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/CriteriaQueryProcessor.java @@ -101,7 +101,7 @@ class CriteriaQueryProcessor { ((BoolQueryBuilder) query).should(fieldQuery(fieldName, item)); } break; - } + } return query; } diff --git a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java index 90595f81f..8f26ff48f 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.java @@ -21,6 +21,7 @@ import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.elasticsearch.ElasticsearchException; +import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter; import org.springframework.data.elasticsearch.core.convert.MappingElasticsearchConverter; import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity; @@ -234,6 +235,8 @@ public class ElasticsearchTemplate implements ElasticsearchOperations { } private ElasticsearchPersistentEntity getPersistentEntityFor(Class clazz){ + Assert.isTrue(clazz.isAnnotationPresent(Document.class), "Unable to identify index name. " + + clazz.getSimpleName() + " is not a Document. Make sure the document class is annotated with @Document(indexName=\"foo\")"); return elasticsearchConverter.getMappingContext().getPersistentEntity(clazz); } diff --git a/src/main/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchPersistentEntity.java b/src/main/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchPersistentEntity.java index 7da297396..82d8c1820 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchPersistentEntity.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/mapping/SimpleElasticsearchPersistentEntity.java @@ -46,12 +46,12 @@ public class SimpleElasticsearchPersistentEntity extends BasicPersistentEntit super(typeInformation); this.context = new StandardEvaluationContext(); Class clazz = typeInformation.getType(); - Assert.isTrue(clazz.isAnnotationPresent(Document.class), - clazz.getSimpleName() + " is not a Document. Make sure the document class is annotated with @Document(indexName=\"foo\")"); - Document document = clazz.getAnnotation(Document.class); - Assert.hasText(document.indexName(), " Unknown indexName. Make sure the indexName is defined. e.g @Document(indexName=\"foo\")"); - this.indexName = typeInformation.getType().getAnnotation(Document.class).indexName(); - this.indexType = hasText(document.type())? document.type() : clazz.getSimpleName().toLowerCase(Locale.ENGLISH); + if(clazz.isAnnotationPresent(Document.class)){ + Document document = clazz.getAnnotation(Document.class); + Assert.hasText(document.indexName(), " Unknown indexName. Make sure the indexName is defined. e.g @Document(indexName=\"foo\")"); + this.indexName = typeInformation.getType().getAnnotation(Document.class).indexName(); + this.indexType = hasText(document.type())? document.type() : clazz.getSimpleName().toLowerCase(Locale.ENGLISH); + } } @Override diff --git a/src/test/java/org/springframework/data/elasticsearch/Author.java b/src/test/java/org/springframework/data/elasticsearch/Author.java new file mode 100644 index 000000000..fc3b66d70 --- /dev/null +++ b/src/test/java/org/springframework/data/elasticsearch/Author.java @@ -0,0 +1,22 @@ +package org.springframework.data.elasticsearch; + +public class Author { + private String name; + private String id; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } +} diff --git a/src/test/java/org/springframework/data/elasticsearch/Book.java b/src/test/java/org/springframework/data/elasticsearch/Book.java new file mode 100644 index 000000000..eb4b28716 --- /dev/null +++ b/src/test/java/org/springframework/data/elasticsearch/Book.java @@ -0,0 +1,34 @@ +package org.springframework.data.elasticsearch; + +import org.springframework.data.elasticsearch.annotations.Document; + +@Document(indexName = "book",type = "book") +public class Book { + private String id; + private String name; + private Author author; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Author getAuthor() { + return author; + } + + public void setAuthor(Author author) { + this.author = author; + } +} diff --git a/src/test/java/org/springframework/data/elasticsearch/NestedObjectTest.java b/src/test/java/org/springframework/data/elasticsearch/NestedObjectTest.java new file mode 100644 index 000000000..1a47c914a --- /dev/null +++ b/src/test/java/org/springframework/data/elasticsearch/NestedObjectTest.java @@ -0,0 +1,43 @@ +package org.springframework.data.elasticsearch; + + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.data.elasticsearch.repositories.SampleElasticSearchBookRepository; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import javax.annotation.Resource; + + +import static org.apache.commons.lang.RandomStringUtils.randomAlphanumeric; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.junit.Assert.assertThat; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("classpath:/repository-test-nested-object.xml") +public class NestedObjectTest{ + + @Resource + private SampleElasticSearchBookRepository repository; + + + @Test + public void shouldIndexNestedObject(){ + //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 + repository.save(book); + //then + assertThat(repository.findOne(id), is(notNullValue())); + } +} + diff --git a/src/test/java/org/springframework/data/elasticsearch/NonDocumentEntity.java b/src/test/java/org/springframework/data/elasticsearch/NonDocumentEntity.java index ddcb94cd0..133cdc626 100644 --- a/src/test/java/org/springframework/data/elasticsearch/NonDocumentEntity.java +++ b/src/test/java/org/springframework/data/elasticsearch/NonDocumentEntity.java @@ -1,11 +1,12 @@ package org.springframework.data.elasticsearch; -import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.annotation.Id; -@Document(indexName = "Foo") public class NonDocumentEntity { + @Id + private String someId; private String someField1; private String someField2; diff --git a/src/test/java/org/springframework/data/elasticsearch/NonDocumentEntityTest.java b/src/test/java/org/springframework/data/elasticsearch/NonDocumentEntityTest.java new file mode 100644 index 000000000..c900f419b --- /dev/null +++ b/src/test/java/org/springframework/data/elasticsearch/NonDocumentEntityTest.java @@ -0,0 +1,24 @@ +package org.springframework.data.elasticsearch; + + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.data.elasticsearch.repositories.NonDocumentEntityRepository; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import javax.annotation.Resource; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("classpath:/repository-non-document-entity.xml") +public class NonDocumentEntityTest { + + @Resource + private NonDocumentEntityRepository nonDocumentEntityRepository; + + @Test(expected = IllegalArgumentException.class) + public void shouldNotIndexEntitiesWhichAreNotADocument(){ + //when + nonDocumentEntityRepository.save(new NonDocumentEntity()); + } +} diff --git a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTest.java b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTest.java index 2032d2a05..2f153e8d9 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTest.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTest.java @@ -333,6 +333,4 @@ public class ElasticsearchTemplateTest { assertThat(sampleEntity1, is(notNullValue())); } - - } diff --git a/src/test/java/org/springframework/data/elasticsearch/repositories/CustomMethodRepositoryTest.java b/src/test/java/org/springframework/data/elasticsearch/repositories/CustomMethodRepositoryTest.java index 8cc73340e..3d7006d18 100644 --- a/src/test/java/org/springframework/data/elasticsearch/repositories/CustomMethodRepositoryTest.java +++ b/src/test/java/org/springframework/data/elasticsearch/repositories/CustomMethodRepositoryTest.java @@ -16,7 +16,6 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import javax.annotation.Resource; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; diff --git a/src/test/java/org/springframework/data/elasticsearch/repositories/NonDocumentEntityRepository.java b/src/test/java/org/springframework/data/elasticsearch/repositories/NonDocumentEntityRepository.java new file mode 100644 index 000000000..5a5dccd15 --- /dev/null +++ b/src/test/java/org/springframework/data/elasticsearch/repositories/NonDocumentEntityRepository.java @@ -0,0 +1,8 @@ +package org.springframework.data.elasticsearch.repositories; + +import org.springframework.data.elasticsearch.NonDocumentEntity; +import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; + + +public interface NonDocumentEntityRepository extends ElasticsearchRepository { +} diff --git a/src/test/java/org/springframework/data/elasticsearch/repositories/SampleElasticSearchBookRepository.java b/src/test/java/org/springframework/data/elasticsearch/repositories/SampleElasticSearchBookRepository.java new file mode 100644 index 000000000..201c873ba --- /dev/null +++ b/src/test/java/org/springframework/data/elasticsearch/repositories/SampleElasticSearchBookRepository.java @@ -0,0 +1,7 @@ +package org.springframework.data.elasticsearch.repositories; + +import org.springframework.data.elasticsearch.Book; +import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; + +public interface SampleElasticSearchBookRepository extends ElasticsearchRepository { +} diff --git a/src/test/resources/repository-non-document-entity.xml b/src/test/resources/repository-non-document-entity.xml new file mode 100644 index 000000000..bfc5dc1e6 --- /dev/null +++ b/src/test/resources/repository-non-document-entity.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/repository-test-nested-object.xml b/src/test/resources/repository-test-nested-object.xml new file mode 100644 index 000000000..f766552dc --- /dev/null +++ b/src/test/resources/repository-test-nested-object.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + \ No newline at end of file