Skip to content

Commit 028239f

Browse files
authored
Add optional fetchSource flag to the SourceFilter.
Original Pull Request #3014 Closes #3009
1 parent 01d2d24 commit 028239f

File tree

6 files changed

+74
-9
lines changed

6 files changed

+74
-9
lines changed

src/main/java/org/springframework/data/elasticsearch/client/elc/RequestConverter.java

+10-4
Original file line numberDiff line numberDiff line change
@@ -2014,9 +2014,12 @@ private VersionType retrieveVersionTypeFromPersistentEntity(@Nullable Class<?> c
20142014
private SourceConfig getSourceConfig(Query query) {
20152015

20162016
if (query.getSourceFilter() != null) {
2017-
return SourceConfig.of(s -> s //
2018-
.filter(sfb -> {
2019-
SourceFilter sourceFilter = query.getSourceFilter();
2017+
return SourceConfig.of(s -> {
2018+
SourceFilter sourceFilter = query.getSourceFilter();
2019+
if (sourceFilter.fetchSource() != null) {
2020+
s.fetch(sourceFilter.fetchSource());
2021+
} else {
2022+
s.filter(sfb -> {
20202023
String[] includes = sourceFilter.getIncludes();
20212024
String[] excludes = sourceFilter.getExcludes();
20222025

@@ -2029,7 +2032,10 @@ private SourceConfig getSourceConfig(Query query) {
20292032
}
20302033

20312034
return sfb;
2032-
}));
2035+
});
2036+
}
2037+
return s;
2038+
});
20332039
} else {
20342040
return null;
20352041
}

src/main/java/org/springframework/data/elasticsearch/core/convert/MappingElasticsearchConverter.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1273,7 +1273,7 @@ private void updatePropertiesInFieldsAndSourceFilter(Query query, Class<?> domai
12731273
.toArray(new String[] {});
12741274
}
12751275

1276-
query.addSourceFilter(new FetchSourceFilter(includes, excludes));
1276+
query.addSourceFilter(new FetchSourceFilter(sourceFilter.fetchSource(), includes, excludes));
12771277
}
12781278
}
12791279
}

src/main/java/org/springframework/data/elasticsearch/core/query/FetchSourceFilter.java

+12-3
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,16 @@
2828
*/
2929
public class FetchSourceFilter implements SourceFilter {
3030

31+
@Nullable private final Boolean fetchSource;
3132
@Nullable private final String[] includes;
3233
@Nullable private final String[] excludes;
3334

3435
/**
3536
* @since 5.2
3637
*/
37-
public static SourceFilter of(@Nullable final String[] includes, @Nullable final String[] excludes) {
38-
return new FetchSourceFilter(includes, excludes);
38+
public static SourceFilter of(@Nullable Boolean fetchSource, @Nullable final String[] includes,
39+
@Nullable final String[] excludes) {
40+
return new FetchSourceFilter(fetchSource, includes, excludes);
3941
}
4042

4143
/**
@@ -48,11 +50,18 @@ public static SourceFilter of(Function<FetchSourceFilterBuilder, FetchSourceFilt
4850
return builderFunction.apply(new FetchSourceFilterBuilder()).build();
4951
}
5052

51-
public FetchSourceFilter(@Nullable final String[] includes, @Nullable final String[] excludes) {
53+
public FetchSourceFilter(@Nullable Boolean fetchSource, @Nullable final String[] includes,
54+
@Nullable final String[] excludes) {
55+
this.fetchSource = fetchSource;
5256
this.includes = includes;
5357
this.excludes = excludes;
5458
}
5559

60+
@Override
61+
public Boolean fetchSource() {
62+
return fetchSource;
63+
}
64+
5665
@Override
5766
public String[] getIncludes() {
5867
return includes;

src/main/java/org/springframework/data/elasticsearch/core/query/FetchSourceFilterBuilder.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
*/
2626
public class FetchSourceFilterBuilder {
2727

28+
@Nullable private Boolean fetchSource;
2829
@Nullable private String[] includes;
2930
@Nullable private String[] excludes;
3031

@@ -38,12 +39,17 @@ public FetchSourceFilterBuilder withExcludes(String... excludes) {
3839
return this;
3940
}
4041

42+
public FetchSourceFilterBuilder withFetchSource(Boolean fetchSource) {
43+
this.fetchSource = fetchSource;
44+
return this;
45+
}
46+
4147
public SourceFilter build() {
4248
if (includes == null)
4349
includes = new String[0];
4450
if (excludes == null)
4551
excludes = new String[0];
4652

47-
return new FetchSourceFilter(includes, excludes);
53+
return new FetchSourceFilter(fetchSource, includes, excludes);
4854
}
4955
}

src/main/java/org/springframework/data/elasticsearch/core/query/SourceFilter.java

+11
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,15 @@ public interface SourceFilter {
4040
*/
4141
@Nullable
4242
String[] getExcludes();
43+
44+
/**
45+
* Flag to set the _source parameter in a query to true or false. If this is not null, the values returned from
46+
* getIncludes() and getExcludes() are ignored
47+
*
48+
* @since 5.5
49+
*/
50+
@Nullable
51+
default Boolean fetchSource() {
52+
return null;
53+
}
4354
}

src/test/java/org/springframework/data/elasticsearch/core/SourceFilterIntegrationTests.java

+33
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.springframework.data.elasticsearch.annotations.Field;
3131
import org.springframework.data.elasticsearch.annotations.FieldType;
3232
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
33+
import org.springframework.data.elasticsearch.core.query.FetchSourceFilter;
3334
import org.springframework.data.elasticsearch.core.query.FetchSourceFilterBuilder;
3435
import org.springframework.data.elasticsearch.core.query.Query;
3536
import org.springframework.data.elasticsearch.core.query.SourceFilter;
@@ -186,6 +187,38 @@ public String[] getExcludes() {
186187
assertThat(entity.getField3()).isNull();
187188
}
188189

190+
@Test // #3009
191+
@DisplayName("should not return any fields when source is set to false")
192+
void shouldNotReturnAnyFieldsWhenSourceIsSetToFalse() {
193+
194+
Query query = Query.findAll();
195+
query.addSourceFilter(FetchSourceFilter.of(b -> b.withFetchSource(false)));
196+
197+
SearchHits<Entity> entities = operations.search(query, Entity.class);
198+
199+
assertThat(entities).hasSize(1);
200+
Entity entity = entities.getSearchHit(0).getContent();
201+
assertThat(entity.getField1()).isNull();
202+
assertThat(entity.getField2()).isNull();
203+
assertThat(entity.getField3()).isNull();
204+
}
205+
206+
@Test // #3009
207+
@DisplayName("should return all fields when source is set to true")
208+
void shouldReturnAllFieldsWhenSourceIsSetToTrue() {
209+
210+
Query query = Query.findAll();
211+
query.addSourceFilter(FetchSourceFilter.of(b -> b.withFetchSource(true)));
212+
213+
SearchHits<Entity> entities = operations.search(query, Entity.class);
214+
215+
assertThat(entities).hasSize(1);
216+
Entity entity = entities.getSearchHit(0).getContent();
217+
assertThat(entity.getField1()).isNotNull();
218+
assertThat(entity.getField2()).isNotNull();
219+
assertThat(entity.getField3()).isNotNull();
220+
}
221+
189222
@Document(indexName = "#{@indexNameProvider.indexName()}")
190223
public static class Entity {
191224
@Nullable

0 commit comments

Comments
 (0)