Skip to content

Commit 6f04f8f

Browse files
Source shortcut support (#1260) (#1263)
* supporting _source shortcut * regen Co-authored-by: Laura Trotta <153528055+l-trotta@users.noreply.github.com>
1 parent eccc745 commit 6f04f8f

2 files changed

Lines changed: 45 additions & 8 deletions

File tree

java-client/src/main/java/co/elastic/clients/elasticsearch/core/search/SourceConfig.java

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,17 @@
2525
import co.elastic.clients.json.JsonpSerializable;
2626
import co.elastic.clients.json.JsonpUtils;
2727
import co.elastic.clients.json.ObjectDeserializer;
28-
import co.elastic.clients.json.UnionDeserializer;
2928
import co.elastic.clients.util.ApiTypeHelper;
3029
import co.elastic.clients.util.ObjectBuilder;
3130
import co.elastic.clients.util.ObjectBuilderBase;
3231
import co.elastic.clients.util.TaggedUnion;
3332
import co.elastic.clients.util.TaggedUnionUtils;
3433
import jakarta.json.stream.JsonGenerator;
34+
import jakarta.json.stream.JsonParser;
3535
import java.lang.Boolean;
3636
import java.lang.Object;
37+
import java.util.EnumSet;
38+
import java.util.List;
3739
import java.util.Objects;
3840
import java.util.function.Function;
3941
import javax.annotation.Nullable;
@@ -181,12 +183,23 @@ public SourceConfig build() {
181183

182184
}
183185

184-
private static JsonpDeserializer<SourceConfig> buildSourceConfigDeserializer() {
185-
return new UnionDeserializer.Builder<SourceConfig, Kind, Object>(SourceConfig::new, false)
186-
.addMember(Kind.Filter, SourceFilter._DESERIALIZER)
187-
.addMember(Kind.Fetch, JsonpDeserializer.booleanDeserializer()).build();
188-
}
189-
190186
public static final JsonpDeserializer<SourceConfig> _DESERIALIZER = JsonpDeserializer
191-
.lazy(SourceConfig::buildSourceConfigDeserializer);
187+
.lazy(() -> JsonpDeserializer.of(EnumSet.of(JsonParser.Event.START_OBJECT, JsonParser.Event.START_ARRAY,
188+
JsonParser.Event.VALUE_TRUE, JsonParser.Event.VALUE_FALSE), (parser, mapper, event) -> {
189+
return switch (event) {
190+
case VALUE_TRUE -> SourceConfig.of(b -> b.fetch(true));
191+
case VALUE_FALSE -> SourceConfig.of(b -> b.fetch(false));
192+
case START_ARRAY -> {
193+
List<String> includes = JsonpDeserializer
194+
.arrayDeserializer(JsonpDeserializer.stringDeserializer())
195+
.deserialize(parser, mapper, event);
196+
yield SourceConfig.of(b -> b.filter(f -> f.includes(includes)));
197+
}
198+
case START_OBJECT -> {
199+
SourceFilter filter = SourceFilter._DESERIALIZER.deserialize(parser, mapper, event);
200+
yield SourceConfig.of(b -> b.filter(filter));
201+
}
202+
default -> null;
203+
};
204+
}));
192205
}

java-client/src/test/java/co/elastic/clients/elasticsearch/spec_issues/SpecIssuesTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@
4646

4747
import java.io.InputStream;
4848
import java.io.StringReader;
49+
import java.util.Arrays;
50+
import java.util.Collections;
4951

5052
/**
5153
* Test issues related to the API specifications.
@@ -54,6 +56,28 @@
5456
*/
5557
public class SpecIssuesTest extends ModelTestCase {
5658

59+
@Test
60+
public void i1245_sourceAsArray() {
61+
// "_source" also accepts an array of field names as a shortcut for SourceFilter.includes
62+
SearchRequest array = fromJson("{\"_source\":[\"date\",\"distributor\"]}", SearchRequest.class);
63+
assertTrue(array.source().isFilter());
64+
assertEquals(Arrays.asList("date", "distributor"), array.source().filter().includes());
65+
66+
// The object form still works, with all SourceFilter fields set
67+
SearchRequest object = fromJson(
68+
"{\"_source\":{\"includes\":[\"date\",\"distributor\"],\"excludes\":[\"secret\"],\"exclude_vectors\":true}}",
69+
SearchRequest.class);
70+
assertTrue(object.source().isFilter());
71+
assertEquals(Arrays.asList("date", "distributor"), object.source().filter().includes());
72+
assertEquals(Collections.singletonList("secret"), object.source().filter().excludes());
73+
assertTrue(object.source().filter().excludeVectors());
74+
75+
// The boolean form still works
76+
SearchRequest bool = fromJson("{\"_source\":false}", SearchRequest.class);
77+
assertTrue(bool.source().isFetch());
78+
assertFalse(bool.source().fetch());
79+
}
80+
5781
@Test
5882
public void i0328_charFilter() throws Exception {
5983
// Both mappings and mappings_path are optional

0 commit comments

Comments
 (0)