mirror of
https://github.com/spring-projects/spring-data-elasticsearch.git
synced 2025-06-14 08:02:11 +00:00
DATAES-143 added support for turning off auto index creation based on Document annotation.
This commit is contained in:
parent
485f0e7252
commit
751302d6f0
@ -24,6 +24,7 @@ import org.springframework.data.annotation.Persistent;
|
|||||||
*
|
*
|
||||||
* @author Rizwan Idrees
|
* @author Rizwan Idrees
|
||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
|
* @author Mason Chan
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@Persistent
|
@Persistent
|
||||||
@ -45,4 +46,6 @@ public @interface Document {
|
|||||||
String refreshInterval() default "1s";
|
String refreshInterval() default "1s";
|
||||||
|
|
||||||
String indexStoreType() default "fs";
|
String indexStoreType() default "fs";
|
||||||
|
|
||||||
|
boolean createIndex() default true;
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@ package org.springframework.data.elasticsearch.core;
|
|||||||
import org.elasticsearch.action.update.UpdateResponse;
|
import org.elasticsearch.action.update.UpdateResponse;
|
||||||
import org.springframework.data.domain.Page;
|
import org.springframework.data.domain.Page;
|
||||||
import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter;
|
import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter;
|
||||||
|
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentEntity;
|
||||||
import org.springframework.data.elasticsearch.core.query.*;
|
import org.springframework.data.elasticsearch.core.query.*;
|
||||||
import org.springframework.data.util.CloseableIterator;
|
import org.springframework.data.util.CloseableIterator;
|
||||||
|
|
||||||
@ -558,4 +559,7 @@ public interface ElasticsearchOperations {
|
|||||||
|
|
||||||
|
|
||||||
<T> T query(SearchQuery query, ResultsExtractor<T> resultsExtractor);
|
<T> T query(SearchQuery query, ResultsExtractor<T> resultsExtractor);
|
||||||
|
|
||||||
|
|
||||||
|
ElasticsearchPersistentEntity getPersistentEntityFor(Class clazz);
|
||||||
}
|
}
|
||||||
|
@ -104,6 +104,7 @@ import org.springframework.util.Assert;
|
|||||||
* @author Mohsin Husen
|
* @author Mohsin Husen
|
||||||
* @author Artur Konczak
|
* @author Artur Konczak
|
||||||
* @author Kevin Leturc
|
* @author Kevin Leturc
|
||||||
|
* @author Mason Chan
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class ElasticsearchTemplate implements ElasticsearchOperations, ApplicationContextAware {
|
public class ElasticsearchTemplate implements ElasticsearchOperations, ApplicationContextAware {
|
||||||
@ -1026,7 +1027,8 @@ public class ElasticsearchTemplate implements ElasticsearchOperations, Applicati
|
|||||||
return newHashSet(iterator);
|
return newHashSet(iterator);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ElasticsearchPersistentEntity getPersistentEntityFor(Class clazz) {
|
@Override
|
||||||
|
public ElasticsearchPersistentEntity getPersistentEntityFor(Class clazz) {
|
||||||
Assert.isTrue(clazz.isAnnotationPresent(Document.class), "Unable to identify index name. " + clazz.getSimpleName()
|
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\")");
|
+ " is not a Document. Make sure the document class is annotated with @Document(indexName=\"foo\")");
|
||||||
return elasticsearchConverter.getMappingContext().getPersistentEntity(clazz);
|
return elasticsearchConverter.getMappingContext().getPersistentEntity(clazz);
|
||||||
|
@ -47,4 +47,6 @@ public interface ElasticsearchPersistentEntity<T> extends PersistentEntity<T, El
|
|||||||
ElasticsearchPersistentProperty getParentIdProperty();
|
ElasticsearchPersistentProperty getParentIdProperty();
|
||||||
|
|
||||||
String settingPath();
|
String settingPath();
|
||||||
|
|
||||||
|
boolean isCreateIndexAndMapping();
|
||||||
}
|
}
|
||||||
|
@ -58,6 +58,7 @@ public class SimpleElasticsearchPersistentEntity<T> extends BasicPersistentEntit
|
|||||||
private String parentType;
|
private String parentType;
|
||||||
private ElasticsearchPersistentProperty parentIdProperty;
|
private ElasticsearchPersistentProperty parentIdProperty;
|
||||||
private String settingPath;
|
private String settingPath;
|
||||||
|
private boolean createIndexAndMapping;
|
||||||
|
|
||||||
public SimpleElasticsearchPersistentEntity(TypeInformation<T> typeInformation) {
|
public SimpleElasticsearchPersistentEntity(TypeInformation<T> typeInformation) {
|
||||||
super(typeInformation);
|
super(typeInformation);
|
||||||
@ -76,6 +77,7 @@ public class SimpleElasticsearchPersistentEntity<T> extends BasicPersistentEntit
|
|||||||
this.replicas = document.replicas();
|
this.replicas = document.replicas();
|
||||||
this.refreshInterval = document.refreshInterval();
|
this.refreshInterval = document.refreshInterval();
|
||||||
this.indexStoreType = document.indexStoreType();
|
this.indexStoreType = document.indexStoreType();
|
||||||
|
this.createIndexAndMapping = document.createIndex();
|
||||||
}
|
}
|
||||||
if (clazz.isAnnotationPresent(Setting.class)) {
|
if (clazz.isAnnotationPresent(Setting.class)) {
|
||||||
this.settingPath = typeInformation.getType().getAnnotation(Setting.class).settingPath();
|
this.settingPath = typeInformation.getType().getAnnotation(Setting.class).settingPath();
|
||||||
@ -141,6 +143,11 @@ public class SimpleElasticsearchPersistentEntity<T> extends BasicPersistentEntit
|
|||||||
return settingPath;
|
return settingPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isCreateIndexAndMapping() {
|
||||||
|
return createIndexAndMapping;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addPersistentProperty(ElasticsearchPersistentProperty property) {
|
public void addPersistentProperty(ElasticsearchPersistentProperty property) {
|
||||||
super.addPersistentProperty(property);
|
super.addPersistentProperty(property);
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.repository.support;
|
package org.springframework.data.elasticsearch.repository.support;
|
||||||
|
|
||||||
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
|
import static org.elasticsearch.index.query.QueryBuilders.*;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.lang.reflect.ParameterizedType;
|
import java.lang.reflect.ParameterizedType;
|
||||||
@ -30,19 +30,10 @@ import org.elasticsearch.index.query.QueryBuilder;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.dao.InvalidDataAccessApiUsageException;
|
import org.springframework.dao.InvalidDataAccessApiUsageException;
|
||||||
import org.springframework.data.domain.Page;
|
import org.springframework.data.domain.*;
|
||||||
import org.springframework.data.domain.PageImpl;
|
|
||||||
import org.springframework.data.domain.PageRequest;
|
|
||||||
import org.springframework.data.domain.Pageable;
|
|
||||||
import org.springframework.data.domain.Sort;
|
|
||||||
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
|
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
|
||||||
import org.springframework.data.elasticsearch.core.FacetedPage;
|
import org.springframework.data.elasticsearch.core.FacetedPage;
|
||||||
import org.springframework.data.elasticsearch.core.query.DeleteQuery;
|
import org.springframework.data.elasticsearch.core.query.*;
|
||||||
import org.springframework.data.elasticsearch.core.query.GetQuery;
|
|
||||||
import org.springframework.data.elasticsearch.core.query.IndexQuery;
|
|
||||||
import org.springframework.data.elasticsearch.core.query.MoreLikeThisQuery;
|
|
||||||
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
|
|
||||||
import org.springframework.data.elasticsearch.core.query.SearchQuery;
|
|
||||||
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
|
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
@ -78,8 +69,10 @@ public abstract class AbstractElasticsearchRepository<T, ID extends Serializable
|
|||||||
this.entityInformation = metadata;
|
this.entityInformation = metadata;
|
||||||
setEntityClass(this.entityInformation.getJavaType());
|
setEntityClass(this.entityInformation.getJavaType());
|
||||||
try {
|
try {
|
||||||
createIndex();
|
if (createIndexAndMapping()) {
|
||||||
putMapping();
|
createIndex();
|
||||||
|
putMapping();
|
||||||
|
}
|
||||||
} catch (ElasticsearchException exception) {
|
} catch (ElasticsearchException exception) {
|
||||||
LOGGER.error("failed to load elasticsearch nodes : " + exception.getDetailedMessage());
|
LOGGER.error("failed to load elasticsearch nodes : " + exception.getDetailedMessage());
|
||||||
}
|
}
|
||||||
@ -93,6 +86,10 @@ public abstract class AbstractElasticsearchRepository<T, ID extends Serializable
|
|||||||
elasticsearchOperations.putMapping(getEntityClass());
|
elasticsearchOperations.putMapping(getEntityClass());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean createIndexAndMapping() {
|
||||||
|
return elasticsearchOperations.getPersistentEntityFor(getEntityClass()).isCreateIndexAndMapping();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public T findOne(ID id) {
|
public T findOne(ID id) {
|
||||||
GetQuery query = new GetQuery();
|
GetQuery query = new GetQuery();
|
||||||
@ -311,14 +308,14 @@ public abstract class AbstractElasticsearchRepository<T, ID extends Serializable
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<String> stringIdsRepresentation(Iterable<ID> ids) {
|
private List<String> stringIdsRepresentation(Iterable<ID> ids) {
|
||||||
Assert.notNull(ids, "ids can't be null.");
|
Assert.notNull(ids, "ids can't be null.");
|
||||||
List<String> stringIds = new ArrayList<String>();
|
List<String> stringIds = new ArrayList<String>();
|
||||||
for (ID id : ids) {
|
for (ID id : ids) {
|
||||||
stringIds.add(stringIdRepresentation(id));
|
stringIds.add(stringIdRepresentation(id));
|
||||||
}
|
}
|
||||||
return stringIds;
|
return stringIds;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract String stringIdRepresentation(ID id);
|
protected abstract String stringIdRepresentation(ID id);
|
||||||
|
|
||||||
|
@ -48,6 +48,7 @@ import org.springframework.data.elasticsearch.ElasticsearchException;
|
|||||||
import org.springframework.data.elasticsearch.annotations.Document;
|
import org.springframework.data.elasticsearch.annotations.Document;
|
||||||
import org.springframework.data.elasticsearch.core.query.*;
|
import org.springframework.data.elasticsearch.core.query.*;
|
||||||
import org.springframework.data.elasticsearch.entities.*;
|
import org.springframework.data.elasticsearch.entities.*;
|
||||||
|
import org.springframework.data.elasticsearch.repositories.existing.index.CreateIndexFalseEntity;
|
||||||
import org.springframework.data.util.CloseableIterator;
|
import org.springframework.data.util.CloseableIterator;
|
||||||
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;
|
||||||
@ -58,6 +59,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
|||||||
* @author Franck Marchand
|
* @author Franck Marchand
|
||||||
* @author Abdul Mohammed
|
* @author Abdul Mohammed
|
||||||
* @author Kevin Leturc
|
* @author Kevin Leturc
|
||||||
|
* @author Mason Chan
|
||||||
*/
|
*/
|
||||||
@RunWith(SpringJUnit4ClassRunner.class)
|
@RunWith(SpringJUnit4ClassRunner.class)
|
||||||
@ContextConfiguration("classpath:elasticsearch-template-test.xml")
|
@ContextConfiguration("classpath:elasticsearch-template-test.xml")
|
||||||
|
@ -0,0 +1,17 @@
|
|||||||
|
package org.springframework.data.elasticsearch.repositories.existing.index;
|
||||||
|
|
||||||
|
import org.springframework.data.annotation.Id;
|
||||||
|
import org.springframework.data.elasticsearch.annotations.Document;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CreateIndexFalseEntity
|
||||||
|
*
|
||||||
|
* @author Mason Chan
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Document(indexName = "test-index", type = "test-type", createIndex = false)
|
||||||
|
public class CreateIndexFalseEntity {
|
||||||
|
@Id
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
package org.springframework.data.elasticsearch.repositories.existing.index;
|
||||||
|
|
||||||
|
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by akonczak on 16/12/2015.
|
||||||
|
*/
|
||||||
|
public interface CreateIndexFalseRepository extends ElasticsearchRepository<CreateIndexFalseEntity, String> {
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
package org.springframework.data.elasticsearch.repositories.existing.index;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
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.test.context.ContextConfiguration;
|
||||||
|
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||||
|
|
||||||
|
@RunWith(SpringJUnit4ClassRunner.class)
|
||||||
|
@ContextConfiguration("classpath:/existing-index-repository-test.xml")
|
||||||
|
public class CreateIndexFalseRepositoryTest {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private CreateIndexFalseRepository repository;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ElasticsearchTemplate elasticsearchTemplate;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
DATAES-143
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void shouldNotCreateIndex() {
|
||||||
|
//given
|
||||||
|
|
||||||
|
//when
|
||||||
|
//then
|
||||||
|
assertFalse(elasticsearchTemplate.indexExists(CreateIndexFalseEntity.class));
|
||||||
|
}
|
||||||
|
}
|
19
src/test/resources/existing-index-repository-test.xml
Normal file
19
src/test/resources/existing-index-repository-test.xml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
|
||||||
|
xsi:schemaLocation="http://www.springframework.org/schema/data/elasticsearch http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd
|
||||||
|
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
|
||||||
|
|
||||||
|
<import resource="infrastructure.xml"/>
|
||||||
|
|
||||||
|
<bean name="elasticsearchTemplate"
|
||||||
|
class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
|
||||||
|
<constructor-arg name="client" ref="client"/>
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
|
||||||
|
<elasticsearch:repositories
|
||||||
|
base-package="org.springframework.data.elasticsearch.repositories.existing.index"/>
|
||||||
|
|
||||||
|
</beans>
|
Loading…
x
Reference in New Issue
Block a user