From 4c89e3e2d03c56f74a15f5ddf2b716471e128e6e Mon Sep 17 00:00:00 2001 From: Peter-Josef Meisch Date: Thu, 28 Nov 2024 15:26:35 +0100 Subject: [PATCH] Add optional fetchSource flag to the SourceFilter. Closes #3009 --- .../client/elc/RequestConverter.java | 14 +++++--- .../MappingElasticsearchConverter.java | 2 +- .../core/query/FetchSourceFilter.java | 15 +++++++-- .../core/query/FetchSourceFilterBuilder.java | 8 ++++- .../core/query/SourceFilter.java | 11 +++++++ .../core/SourceFilterIntegrationTests.java | 33 +++++++++++++++++++ 6 files changed, 74 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/springframework/data/elasticsearch/client/elc/RequestConverter.java b/src/main/java/org/springframework/data/elasticsearch/client/elc/RequestConverter.java index ea42903a5..ec934452e 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/elc/RequestConverter.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/elc/RequestConverter.java @@ -2014,9 +2014,12 @@ private VersionType retrieveVersionTypeFromPersistentEntity(@Nullable Class c private SourceConfig getSourceConfig(Query query) { if (query.getSourceFilter() != null) { - return SourceConfig.of(s -> s // - .filter(sfb -> { - SourceFilter sourceFilter = query.getSourceFilter(); + return SourceConfig.of(s -> { + SourceFilter sourceFilter = query.getSourceFilter(); + if (sourceFilter.fetchSource() != null) { + s.fetch(sourceFilter.fetchSource()); + } else { + s.filter(sfb -> { String[] includes = sourceFilter.getIncludes(); String[] excludes = sourceFilter.getExcludes(); @@ -2029,7 +2032,10 @@ private SourceConfig getSourceConfig(Query query) { } return sfb; - })); + }); + } + return s; + }); } else { return null; } diff --git a/src/main/java/org/springframework/data/elasticsearch/core/convert/MappingElasticsearchConverter.java b/src/main/java/org/springframework/data/elasticsearch/core/convert/MappingElasticsearchConverter.java index ccac971fd..0ae0e8928 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/convert/MappingElasticsearchConverter.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/convert/MappingElasticsearchConverter.java @@ -1273,7 +1273,7 @@ private void updatePropertiesInFieldsAndSourceFilter(Query query, Class domai .toArray(new String[] {}); } - query.addSourceFilter(new FetchSourceFilter(includes, excludes)); + query.addSourceFilter(new FetchSourceFilter(sourceFilter.fetchSource(), includes, excludes)); } } } diff --git a/src/main/java/org/springframework/data/elasticsearch/core/query/FetchSourceFilter.java b/src/main/java/org/springframework/data/elasticsearch/core/query/FetchSourceFilter.java index caca169c6..ced12f407 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/query/FetchSourceFilter.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/query/FetchSourceFilter.java @@ -28,14 +28,16 @@ */ public class FetchSourceFilter implements SourceFilter { + @Nullable private final Boolean fetchSource; @Nullable private final String[] includes; @Nullable private final String[] excludes; /** * @since 5.2 */ - public static SourceFilter of(@Nullable final String[] includes, @Nullable final String[] excludes) { - return new FetchSourceFilter(includes, excludes); + public static SourceFilter of(@Nullable Boolean fetchSource, @Nullable final String[] includes, + @Nullable final String[] excludes) { + return new FetchSourceFilter(fetchSource, includes, excludes); } /** @@ -48,11 +50,18 @@ public static SourceFilter of(Function b.withFetchSource(false))); + + SearchHits entities = operations.search(query, Entity.class); + + assertThat(entities).hasSize(1); + Entity entity = entities.getSearchHit(0).getContent(); + assertThat(entity.getField1()).isNull(); + assertThat(entity.getField2()).isNull(); + assertThat(entity.getField3()).isNull(); + } + + @Test // #3009 + @DisplayName("should return all fields when source is set to true") + void shouldReturnAllFieldsWhenSourceIsSetToTrue() { + + Query query = Query.findAll(); + query.addSourceFilter(FetchSourceFilter.of(b -> b.withFetchSource(true))); + + SearchHits entities = operations.search(query, Entity.class); + + assertThat(entities).hasSize(1); + Entity entity = entities.getSearchHit(0).getContent(); + assertThat(entity.getField1()).isNotNull(); + assertThat(entity.getField2()).isNotNull(); + assertThat(entity.getField3()).isNotNull(); + } + @Document(indexName = "#{@indexNameProvider.indexName()}") public static class Entity { @Nullable