Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,17 @@
import co.elastic.clients.json.JsonpSerializable;
import co.elastic.clients.json.JsonpUtils;
import co.elastic.clients.json.ObjectDeserializer;
import co.elastic.clients.json.UnionDeserializer;
import co.elastic.clients.util.ApiTypeHelper;
import co.elastic.clients.util.ObjectBuilder;
import co.elastic.clients.util.ObjectBuilderBase;
import co.elastic.clients.util.TaggedUnion;
import co.elastic.clients.util.TaggedUnionUtils;
import jakarta.json.stream.JsonGenerator;
import jakarta.json.stream.JsonParser;
import java.lang.Boolean;
import java.lang.Object;
import java.util.EnumSet;
import java.util.List;
import java.util.Objects;
import java.util.function.Function;
import javax.annotation.Nullable;
Expand Down Expand Up @@ -181,12 +183,23 @@ public SourceConfig build() {

}

private static JsonpDeserializer<SourceConfig> buildSourceConfigDeserializer() {
return new UnionDeserializer.Builder<SourceConfig, Kind, Object>(SourceConfig::new, false)
.addMember(Kind.Filter, SourceFilter._DESERIALIZER)
.addMember(Kind.Fetch, JsonpDeserializer.booleanDeserializer()).build();
}

public static final JsonpDeserializer<SourceConfig> _DESERIALIZER = JsonpDeserializer
.lazy(SourceConfig::buildSourceConfigDeserializer);
.lazy(() -> JsonpDeserializer.of(EnumSet.of(JsonParser.Event.START_OBJECT, JsonParser.Event.START_ARRAY,
JsonParser.Event.VALUE_TRUE, JsonParser.Event.VALUE_FALSE), (parser, mapper, event) -> {
return switch (event) {
case VALUE_TRUE -> SourceConfig.of(b -> b.fetch(true));
case VALUE_FALSE -> SourceConfig.of(b -> b.fetch(false));
case START_ARRAY -> {
List<String> includes = JsonpDeserializer
.arrayDeserializer(JsonpDeserializer.stringDeserializer())
.deserialize(parser, mapper, event);
yield SourceConfig.of(b -> b.filter(f -> f.includes(includes)));
}
case START_OBJECT -> {
SourceFilter filter = SourceFilter._DESERIALIZER.deserialize(parser, mapper, event);
yield SourceConfig.of(b -> b.filter(filter));
}
default -> null;
};
}));
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@

import java.io.InputStream;
import java.io.StringReader;
import java.util.Arrays;
import java.util.Collections;

/**
* Test issues related to the API specifications.
Expand All @@ -54,6 +56,28 @@
*/
public class SpecIssuesTest extends ModelTestCase {

@Test
public void i1245_sourceAsArray() {
// "_source" also accepts an array of field names as a shortcut for SourceFilter.includes
SearchRequest array = fromJson("{\"_source\":[\"date\",\"distributor\"]}", SearchRequest.class);
assertTrue(array.source().isFilter());
assertEquals(Arrays.asList("date", "distributor"), array.source().filter().includes());

// The object form still works, with all SourceFilter fields set
SearchRequest object = fromJson(
"{\"_source\":{\"includes\":[\"date\",\"distributor\"],\"excludes\":[\"secret\"],\"exclude_vectors\":true}}",
SearchRequest.class);
assertTrue(object.source().isFilter());
assertEquals(Arrays.asList("date", "distributor"), object.source().filter().includes());
assertEquals(Collections.singletonList("secret"), object.source().filter().excludes());
assertTrue(object.source().filter().excludeVectors());

// The boolean form still works
SearchRequest bool = fromJson("{\"_source\":false}", SearchRequest.class);
assertTrue(bool.source().isFetch());
assertFalse(bool.source().fetch());
}

@Test
public void i0328_charFilter() throws Exception {
// Both mappings and mappings_path are optional
Expand Down
Loading