mirror of
https://github.com/spring-projects/spring-data-elasticsearch.git
synced 2025-06-13 07:32:11 +00:00
Fix NPE on IndexQuery with source and version.
Original Pull Request #1894 Closes #1893 (cherry picked from commit 36b449c3852fee3b4cdeb0760058c4265d8a176c) (cherry picked from commit c0781efbaad16bb4d9a943f9692bf6b356609bda)
This commit is contained in:
parent
b3da1786ca
commit
65aa371d64
@ -113,6 +113,7 @@ import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersiste
|
|||||||
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty;
|
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchPersistentProperty;
|
||||||
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
|
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
|
||||||
import org.springframework.data.elasticsearch.core.query.*;
|
import org.springframework.data.elasticsearch.core.query.*;
|
||||||
|
import org.springframework.data.mapping.context.MappingContext;
|
||||||
import org.springframework.lang.Nullable;
|
import org.springframework.lang.Nullable;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
@ -891,15 +892,17 @@ class RequestFactory {
|
|||||||
String indexName = index.getIndexName();
|
String indexName = index.getIndexName();
|
||||||
IndexRequest indexRequest;
|
IndexRequest indexRequest;
|
||||||
|
|
||||||
if (query.getObject() != null) {
|
Object queryObject = query.getObject();
|
||||||
String id = StringUtils.isEmpty(query.getId()) ? getPersistentEntityId(query.getObject()) : query.getId();
|
|
||||||
|
if (queryObject != null) {
|
||||||
|
String id = StringUtils.isEmpty(query.getId()) ? getPersistentEntityId(queryObject) : query.getId();
|
||||||
// If we have a query id and a document id, do not ask ES to generate one.
|
// If we have a query id and a document id, do not ask ES to generate one.
|
||||||
if (id != null) {
|
if (id != null) {
|
||||||
indexRequest = new IndexRequest(indexName).id(id);
|
indexRequest = new IndexRequest(indexName).id(id);
|
||||||
} else {
|
} else {
|
||||||
indexRequest = new IndexRequest(indexName);
|
indexRequest = new IndexRequest(indexName);
|
||||||
}
|
}
|
||||||
indexRequest.source(elasticsearchConverter.mapObject(query.getObject()).toJson(), Requests.INDEX_CONTENT_TYPE);
|
indexRequest.source(elasticsearchConverter.mapObject(queryObject).toJson(), Requests.INDEX_CONTENT_TYPE);
|
||||||
} else if (query.getSource() != null) {
|
} else if (query.getSource() != null) {
|
||||||
indexRequest = new IndexRequest(indexName).id(query.getId()).source(query.getSource(),
|
indexRequest = new IndexRequest(indexName).id(query.getId()).source(query.getSource(),
|
||||||
Requests.INDEX_CONTENT_TYPE);
|
Requests.INDEX_CONTENT_TYPE);
|
||||||
@ -910,7 +913,8 @@ class RequestFactory {
|
|||||||
|
|
||||||
if (query.getVersion() != null) {
|
if (query.getVersion() != null) {
|
||||||
indexRequest.version(query.getVersion());
|
indexRequest.version(query.getVersion());
|
||||||
VersionType versionType = retrieveVersionTypeFromPersistentEntity(query.getObject().getClass());
|
VersionType versionType = retrieveVersionTypeFromPersistentEntity(
|
||||||
|
queryObject != null ? queryObject.getClass() : null);
|
||||||
indexRequest.versionType(versionType);
|
indexRequest.versionType(versionType);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -935,15 +939,16 @@ class RequestFactory {
|
|||||||
|
|
||||||
IndexRequestBuilder indexRequestBuilder;
|
IndexRequestBuilder indexRequestBuilder;
|
||||||
|
|
||||||
if (query.getObject() != null) {
|
Object queryObject = query.getObject();
|
||||||
String id = StringUtils.isEmpty(query.getId()) ? getPersistentEntityId(query.getObject()) : query.getId();
|
if (queryObject != null) {
|
||||||
|
String id = StringUtils.isEmpty(query.getId()) ? getPersistentEntityId(queryObject) : query.getId();
|
||||||
// If we have a query id and a document id, do not ask ES to generate one.
|
// If we have a query id and a document id, do not ask ES to generate one.
|
||||||
if (id != null) {
|
if (id != null) {
|
||||||
indexRequestBuilder = client.prepareIndex(indexName, type, id);
|
indexRequestBuilder = client.prepareIndex(indexName, type, id);
|
||||||
} else {
|
} else {
|
||||||
indexRequestBuilder = client.prepareIndex(indexName, type);
|
indexRequestBuilder = client.prepareIndex(indexName, type);
|
||||||
}
|
}
|
||||||
indexRequestBuilder.setSource(elasticsearchConverter.mapObject(query.getObject()).toJson(),
|
indexRequestBuilder.setSource(elasticsearchConverter.mapObject(queryObject).toJson(),
|
||||||
Requests.INDEX_CONTENT_TYPE);
|
Requests.INDEX_CONTENT_TYPE);
|
||||||
} else if (query.getSource() != null) {
|
} else if (query.getSource() != null) {
|
||||||
indexRequestBuilder = client.prepareIndex(indexName, type, query.getId()).setSource(query.getSource(),
|
indexRequestBuilder = client.prepareIndex(indexName, type, query.getId()).setSource(query.getSource(),
|
||||||
@ -954,7 +959,8 @@ class RequestFactory {
|
|||||||
}
|
}
|
||||||
if (query.getVersion() != null) {
|
if (query.getVersion() != null) {
|
||||||
indexRequestBuilder.setVersion(query.getVersion());
|
indexRequestBuilder.setVersion(query.getVersion());
|
||||||
VersionType versionType = retrieveVersionTypeFromPersistentEntity(query.getObject().getClass());
|
VersionType versionType = retrieveVersionTypeFromPersistentEntity(
|
||||||
|
queryObject != null ? queryObject.getClass() : null);
|
||||||
indexRequestBuilder.setVersionType(versionType);
|
indexRequestBuilder.setVersionType(versionType);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1577,10 +1583,19 @@ class RequestFactory {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private VersionType retrieveVersionTypeFromPersistentEntity(Class<?> clazz) {
|
private VersionType retrieveVersionTypeFromPersistentEntity(@Nullable Class<?> clazz) {
|
||||||
|
|
||||||
VersionType versionType = elasticsearchConverter.getMappingContext().getRequiredPersistentEntity(clazz)
|
MappingContext<? extends ElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> mappingContext = elasticsearchConverter
|
||||||
.getVersionType();
|
.getMappingContext();
|
||||||
|
|
||||||
|
ElasticsearchPersistentEntity<?> persistentEntity = clazz != null ? mappingContext.getPersistentEntity(clazz)
|
||||||
|
: null;
|
||||||
|
|
||||||
|
VersionType versionType = null;
|
||||||
|
|
||||||
|
if (persistentEntity != null) {
|
||||||
|
versionType = persistentEntity.getVersionType();
|
||||||
|
}
|
||||||
|
|
||||||
return versionType != null ? versionType : VersionType.EXTERNAL;
|
return versionType != null ? versionType : VersionType.EXTERNAL;
|
||||||
}
|
}
|
||||||
@ -1606,25 +1621,25 @@ class RequestFactory {
|
|||||||
return entity.hasSeqNoPrimaryTermProperty();
|
return entity.hasSeqNoPrimaryTermProperty();
|
||||||
}
|
}
|
||||||
|
|
||||||
private FetchSourceContext getFetchSourceContext(Query searchQuery) {
|
private FetchSourceContext getFetchSourceContext(Query searchQuery) {
|
||||||
FetchSourceContext fetchSourceContext = null;
|
FetchSourceContext fetchSourceContext = null;
|
||||||
SourceFilter sourceFilter = searchQuery.getSourceFilter();
|
SourceFilter sourceFilter = searchQuery.getSourceFilter();
|
||||||
|
|
||||||
if (!isEmpty(searchQuery.getFields())) {
|
if (!isEmpty(searchQuery.getFields())) {
|
||||||
if (sourceFilter == null) {
|
if (sourceFilter == null) {
|
||||||
sourceFilter = new FetchSourceFilter(toArray(searchQuery.getFields()), null);
|
sourceFilter = new FetchSourceFilter(toArray(searchQuery.getFields()), null);
|
||||||
} else {
|
} else {
|
||||||
ArrayList<String> arrayList = new ArrayList<>();
|
ArrayList<String> arrayList = new ArrayList<>();
|
||||||
Collections.addAll(arrayList, sourceFilter.getIncludes());
|
Collections.addAll(arrayList, sourceFilter.getIncludes());
|
||||||
sourceFilter = new FetchSourceFilter(toArray(arrayList), null);
|
sourceFilter = new FetchSourceFilter(toArray(arrayList), null);
|
||||||
}
|
}
|
||||||
|
|
||||||
fetchSourceContext = new FetchSourceContext(true, sourceFilter.getIncludes(), sourceFilter.getExcludes());
|
fetchSourceContext = new FetchSourceContext(true, sourceFilter.getIncludes(), sourceFilter.getExcludes());
|
||||||
} else if (sourceFilter != null) {
|
} else if (sourceFilter != null) {
|
||||||
fetchSourceContext = new FetchSourceContext(true, sourceFilter.getIncludes(), sourceFilter.getExcludes());
|
fetchSourceContext = new FetchSourceContext(true, sourceFilter.getIncludes(), sourceFilter.getExcludes());
|
||||||
}
|
}
|
||||||
return fetchSourceContext;
|
return fetchSourceContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
|
@ -1108,7 +1108,8 @@ public abstract class ElasticsearchTemplateTests {
|
|||||||
Collection<String> ids = IntStream.rangeClosed(1, 10).mapToObj(i -> nextIdAsString()).collect(Collectors.toList());
|
Collection<String> ids = IntStream.rangeClosed(1, 10).mapToObj(i -> nextIdAsString()).collect(Collectors.toList());
|
||||||
ids.add(referenceId);
|
ids.add(referenceId);
|
||||||
ids.stream()
|
ids.stream()
|
||||||
.map(id -> getIndexQuery(SampleEntity.builder().id(id).message(sampleMessage).version(System.currentTimeMillis()).build()))
|
.map(id -> getIndexQuery(
|
||||||
|
SampleEntity.builder().id(id).message(sampleMessage).version(System.currentTimeMillis()).build()))
|
||||||
.forEach(indexQuery -> operations.index(indexQuery, index));
|
.forEach(indexQuery -> operations.index(indexQuery, index));
|
||||||
indexOperations.refresh();
|
indexOperations.refresh();
|
||||||
|
|
||||||
@ -1123,7 +1124,8 @@ public abstract class ElasticsearchTemplateTests {
|
|||||||
assertThat(searchHits.getTotalHits()).isEqualTo(10);
|
assertThat(searchHits.getTotalHits()).isEqualTo(10);
|
||||||
assertThat(searchHits.getSearchHits()).hasSize(5);
|
assertThat(searchHits.getSearchHits()).hasSize(5);
|
||||||
|
|
||||||
Collection<String> returnedIds = searchHits.getSearchHits().stream().map(SearchHit::getId).collect(Collectors.toList());
|
Collection<String> returnedIds = searchHits.getSearchHits().stream().map(SearchHit::getId)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
moreLikeThisQuery.setPageable(PageRequest.of(1, 5));
|
moreLikeThisQuery.setPageable(PageRequest.of(1, 5));
|
||||||
|
|
||||||
@ -3669,6 +3671,21 @@ public abstract class ElasticsearchTemplateTests {
|
|||||||
softly.assertThat(searchHits.getTotalHitsRelation()).isEqualTo(TotalHitsRelation.OFF);
|
softly.assertThat(searchHits.getTotalHitsRelation()).isEqualTo(TotalHitsRelation.OFF);
|
||||||
softly.assertAll();
|
softly.assertAll();
|
||||||
}
|
}
|
||||||
|
@Test // #1893
|
||||||
|
@DisplayName("should index document from source with version")
|
||||||
|
void shouldIndexDocumentFromSourceWithVersion() {
|
||||||
|
|
||||||
|
String source = "{\n" + //
|
||||||
|
" \"answer\": 42\n" + //
|
||||||
|
"}";
|
||||||
|
IndexQuery query = new IndexQueryBuilder() //
|
||||||
|
.withId("42") //
|
||||||
|
.withSource(source) //
|
||||||
|
.withVersion(42L) //
|
||||||
|
.build();
|
||||||
|
|
||||||
|
operations.index(query, IndexCoordinates.of(INDEX_NAME_SAMPLE_ENTITY));
|
||||||
|
}
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@ -3865,5 +3882,5 @@ public abstract class ElasticsearchTemplateTests {
|
|||||||
@JoinTypeRelation(parent = "question", children = { "answer" }) }) private JoinField<String> myJoinField;
|
@JoinTypeRelation(parent = "question", children = { "answer" }) }) private JoinField<String> myJoinField;
|
||||||
@Field(type = Text) private String text;
|
@Field(type = Text) private String text;
|
||||||
}
|
}
|
||||||
//endregion
|
// endregion
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user