Add option to not write version to document source.

Original Pull Request #2487
Closes #2466
This commit is contained in:
Peter-Josef Meisch 2023-03-05 09:53:41 +01:00 committed by GitHub
parent 63cebd7038
commit ec77b3a082
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 86 additions and 1 deletions

View File

@ -85,6 +85,14 @@ public @interface Document {
*/
boolean storeIdInSource() default true;
/**
* Specifies if the version property should also be stored in the Elasticsearch document source. Default value is
* true.
*
* @since 5.1
*/
boolean storeVersionInSource() default true;
/**
* @since 4.3
*/

View File

@ -941,7 +941,8 @@ public class MappingElasticsearchConverter
if (!property.isWritable() //
|| property.isIndexedIndexNameProperty() //
|| (property.isIdProperty() && !entity.storeIdInSource())) {
|| (property.isIdProperty() && !entity.storeIdInSource()) //
|| (property.isVersionProperty() && !entity.storeVersionInSource())) {
continue;
}

View File

@ -181,4 +181,10 @@ public interface ElasticsearchPersistentEntity<T> extends PersistentEntity<T, El
* @since 5.1
*/
boolean storeIdInSource();
/**
* @return the storeVersionInSource value from the document annotation.
* @since 5.1
*/
boolean storeVersionInSource();
}

View File

@ -84,6 +84,7 @@ public class SimpleElasticsearchPersistentEntity<T> extends BasicPersistentEntit
private final Lazy<EvaluationContext> indexNameEvaluationContext = Lazy.of(this::getIndexNameEvaluationContext);
private final boolean storeIdInSource;
private final boolean storeVersionInSource;
public SimpleElasticsearchPersistentEntity(TypeInformation<T> typeInformation,
ContextConfiguration contextConfiguration) {
@ -108,9 +109,11 @@ public class SimpleElasticsearchPersistentEntity<T> extends BasicPersistentEntit
this.createIndexAndMapping = document.createIndex();
this.dynamic = document.dynamic();
this.storeIdInSource = document.storeIdInSource();
this.storeVersionInSource = document.storeVersionInSource();
} else {
this.dynamic = Dynamic.INHERIT;
this.storeIdInSource = true;
this.storeVersionInSource = true;
}
Routing routingAnnotation = AnnotatedElementUtils.findMergedAnnotation(clazz, Routing.class);
@ -200,6 +203,11 @@ public class SimpleElasticsearchPersistentEntity<T> extends BasicPersistentEntit
return storeIdInSource;
}
@Override
public boolean storeVersionInSource() {
return storeVersionInSource;
}
@Override
public void addPersistentProperty(ElasticsearchPersistentProperty property) {
super.addPersistentProperty(property);

View File

@ -50,6 +50,7 @@ import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.ReadOnlyProperty;
import org.springframework.data.annotation.Transient;
import org.springframework.data.annotation.TypeAlias;
import org.springframework.data.annotation.Version;
import org.springframework.data.convert.ReadingConverter;
import org.springframework.data.convert.WritingConverter;
import org.springframework.data.domain.Range;
@ -1893,6 +1894,30 @@ public class MappingElasticsearchConverterUnitTests {
assertEquals(expected, json, true);
}
@Test // #2364
@DisplayName("should not write version property to document source if configured so")
void shouldNotWriteVersionPropertyToDocumentSourceIfConfiguredSo() throws JSONException {
@Language("JSON")
var expected = """
{
"_class": "org.springframework.data.elasticsearch.core.convert.MappingElasticsearchConverterUnitTests$DontWriteVersionToSourceEntity",
"id": "42",
"text": "some text"
}
""";
var entity = new DontWriteVersionToSourceEntity();
entity.setId("42");
entity.setVersion(7L);
entity.setText("some text");
Document document = Document.create();
mappingElasticsearchConverter.write(entity, document);
String json = document.toJson();
assertEquals(expected, json, true);
}
@Test // #2290
@DisplayName("should respect field setting for empty properties")
void shouldRespectFieldSettingForEmptyProperties() throws JSONException {
@ -3004,6 +3029,43 @@ public class MappingElasticsearchConverterUnitTests {
}
}
@org.springframework.data.elasticsearch.annotations.Document(indexName = "doesnt-matter",
storeVersionInSource = false)
static class DontWriteVersionToSourceEntity {
@Nullable private String id;
@Version
@Nullable private Long version;
@Nullable
@Field(type = FieldType.Text) private String text;
@Nullable
public String getId() {
return id;
}
public void setId(@Nullable String id) {
this.id = id;
}
@Nullable
public Long getVersion() {
return version;
}
public void setVersion(@Nullable Long version) {
this.version = version;
}
@Nullable
public String getText() {
return text;
}
public void setText(@Nullable String text) {
this.text = text;
}
}
static class EntityWithPropertiesThatMightBeEmpty {
@Nullable private String id;