Skip to content

Commit 294734c

Browse files
authored
Raw json support (#200) (#205)
1 parent 8227641 commit 294734c

File tree

1,359 files changed

+11446
-2717
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,359 files changed

+11446
-2717
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,6 @@ gradle-app.setting
1818
*.iml
1919

2020
.ci/output
21+
22+
# HTML files produced by the docs build
23+
html_docs

docs/index.asciidoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ include::installation.asciidoc[]
2525
include::connecting.asciidoc[]
2626
include::migrate.asciidoc[]
2727
include::api-conventions.asciidoc[]
28+
include::loading-json.asciidoc[]
2829
include::javadoc-and-source.asciidoc[]
2930

3031
include::{elasticsearch-root}/docs/java-rest/low-level/index.asciidoc[]

docs/loading-json.asciidoc

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
[[loading-json]]
2+
== Creating API objects from JSON data
3+
4+
A common workflow during application development with Elasticsearch is to use the Kibana Developer Console to interactively prepare and test queries, aggregations, index mappings and other complex API calls. This results in working JSON snippets that you may want to use in your application.
5+
6+
As translating these JSON snippets to Java code can be time-consuming and error-prone, most of the data classes in the {java-client} can be loaded from JSON text: object builders have `withJson()` methods that populate the builder from raw JSON. This also allows you to combine dynamically loaded JSON with programmatic construction of objects.
7+
8+
Under the hood, the `withJson()` methods call the object's deserializer. The JSON text's structure and value types therefore have to be correct for the target data structure. Using `withJson()` keeps the strong typing guarantees of the {java-client}.
9+
10+
[discrete]
11+
=== Examples
12+
13+
[discrete]
14+
==== Loading an index definition from a resource file
15+
16+
Consider a resource file `some-index.json` containing an index definition:
17+
18+
["source", "json"]
19+
--------------------------------------------------
20+
{
21+
"mappings": {
22+
"properties": {
23+
"field1": { "type": "text" }
24+
}
25+
}
26+
}
27+
--------------------------------------------------
28+
29+
You can create an index from that definition as follows:
30+
31+
["source","java"]
32+
--------------------------------------------------
33+
include-tagged::{doc-tests}/LoadingJsonTest.java[load-index]
34+
--------------------------------------------------
35+
<1> open an input stream for the JSON resource file.
36+
<2> populate the index creation request with the resource file contents.
37+
38+
[discrete]
39+
==== Ingesting documents from JSON files
40+
41+
Similarly, you can read documents to be stored in {es} from data files:
42+
43+
["source","java"]
44+
--------------------------------------------------
45+
include-tagged::{doc-tests}/LoadingJsonTest.java[ingest-data]
46+
--------------------------------------------------
47+
<1> when calling `withJson()` on data structures that have generic type parameters, these generic types will be considered to be `JsonData`.
48+
49+
[discrete]
50+
==== Creating a search request combining JSON and programmatic construction
51+
52+
You can combine `withJson()` with regular calls to setter methods. The example below loads the query part of a search request from a `String` and programmatically adds an aggregation.
53+
54+
["source","java"]
55+
--------------------------------------------------
56+
include-tagged::{doc-tests}/LoadingJsonTest.java[query]
57+
--------------------------------------------------
58+
<1> loads the query from the JSON string.
59+
<2> adds the aggregation.
60+
<3> since this is an aggregation we don't care about result documents and set their target class to `Void`, meaning they will just be ignored. Note that setting `size` to zero actually prevents any document from being returned.
61+
62+
[discrete]
63+
==== Creating a search request from multiple JSON snippets
64+
65+
The `withJson()` methods are partial deserializers: the properties loaded from the JSON will set property values or replace the previous ones, but will not reset other properties not found in the JSON input. You can use this to combine multiple JSON snippets to build complex search requests. In the example below, we combine separate definitions of a query that selects some documents and an aggregation that is run on the results of this query.
66+
67+
["source","java"]
68+
--------------------------------------------------
69+
include-tagged::{doc-tests}/LoadingJsonTest.java[query-and-agg]
70+
--------------------------------------------------
71+
<1> set max number of returned document to 100 for queries.
72+
<2> we do not want any matching document in aggregations.
73+
<3> loads the query part of the request.
74+
<4> loads the aggregation part of the request (overwrites `size` from the query).
75+
<5> additional request properties set programmatically.
76+
77+
Notice that order matters when the JSON snippets have some common properties: just as when setting property values programmatically, the last value that is set for a property overwrites the previous one.

java-client/src/main/java/co/elastic/clients/ApiClient.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package co.elastic.clients;
2121

22+
import co.elastic.clients.json.JsonpMapper;
2223
import co.elastic.clients.transport.TransportOptions;
2324
import co.elastic.clients.transport.Transport;
2425
import co.elastic.clients.json.JsonpDeserializer;
@@ -51,11 +52,23 @@ protected <V> JsonpDeserializer<V> getDeserializer(Class<V> clazz) {
5152
*/
5253
public abstract Self withTransportOptions(@Nullable TransportOptions transportOptions);
5354

55+
/**
56+
* Get the transport used by this client to handle communication with the server.
57+
*/
5458
public T _transport() {
5559
return this.transport;
5660
}
5761

5862
public TransportOptions _transportOptions() {
5963
return this.transportOptions;
6064
}
65+
66+
/**
67+
* Get the JSON mapper used to map API objects to/from JSON.
68+
* <p>
69+
* Shortcut for <code>_transport().jsonpMapper()</code>
70+
*/
71+
public JsonpMapper _jsonpMapper() {
72+
return transport.jsonpMapper();
73+
}
6174
}

java-client/src/main/java/co/elastic/clients/elasticsearch/_types/AcknowledgedResponseBase.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
import co.elastic.clients.json.ObjectDeserializer;
3232
import co.elastic.clients.util.ApiTypeHelper;
3333
import co.elastic.clients.util.ObjectBuilder;
34-
import co.elastic.clients.util.ObjectBuilderBase;
34+
import co.elastic.clients.util.WithJsonObjectBuilderBase;
3535
import jakarta.json.stream.JsonGenerator;
3636
import java.lang.Boolean;
3737
import java.util.Objects;
@@ -83,7 +83,7 @@ protected void serializeInternal(JsonGenerator generator, JsonpMapper mapper) {
8383

8484
protected abstract static class AbstractBuilder<BuilderT extends AbstractBuilder<BuilderT>>
8585
extends
86-
ObjectBuilderBase {
86+
WithJsonObjectBuilderBase<BuilderT> {
8787
private Boolean acknowledged;
8888

8989
/**

java-client/src/main/java/co/elastic/clients/elasticsearch/_types/BaseNode.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
import co.elastic.clients.json.ObjectDeserializer;
3232
import co.elastic.clients.util.ApiTypeHelper;
3333
import co.elastic.clients.util.ObjectBuilder;
34-
import co.elastic.clients.util.ObjectBuilderBase;
34+
import co.elastic.clients.util.WithJsonObjectBuilderBase;
3535
import jakarta.json.stream.JsonGenerator;
3636
import java.lang.String;
3737
import java.util.List;
@@ -162,7 +162,7 @@ protected void serializeInternal(JsonGenerator generator, JsonpMapper mapper) {
162162

163163
protected abstract static class AbstractBuilder<BuilderT extends AbstractBuilder<BuilderT>>
164164
extends
165-
ObjectBuilderBase {
165+
WithJsonObjectBuilderBase<BuilderT> {
166166
private Map<String, String> attributes;
167167

168168
private String host;

java-client/src/main/java/co/elastic/clients/elasticsearch/_types/BulkIndexByScrollFailure.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
import co.elastic.clients.json.ObjectDeserializer;
3232
import co.elastic.clients.util.ApiTypeHelper;
3333
import co.elastic.clients.util.ObjectBuilder;
34-
import co.elastic.clients.util.ObjectBuilderBase;
34+
import co.elastic.clients.util.WithJsonObjectBuilderBase;
3535
import jakarta.json.stream.JsonGenerator;
3636
import java.lang.Integer;
3737
import java.lang.String;
@@ -143,7 +143,9 @@ protected void serializeInternal(JsonGenerator generator, JsonpMapper mapper) {
143143
* Builder for {@link BulkIndexByScrollFailure}.
144144
*/
145145

146-
public static class Builder extends ObjectBuilderBase implements ObjectBuilder<BulkIndexByScrollFailure> {
146+
public static class Builder extends WithJsonObjectBuilderBase<Builder>
147+
implements
148+
ObjectBuilder<BulkIndexByScrollFailure> {
147149
private ErrorCause cause;
148150

149151
private String id;
@@ -201,6 +203,11 @@ public final Builder type(String value) {
201203
return this;
202204
}
203205

206+
@Override
207+
protected Builder self() {
208+
return this;
209+
}
210+
204211
/**
205212
* Builds a {@link BulkIndexByScrollFailure}.
206213
*

java-client/src/main/java/co/elastic/clients/elasticsearch/_types/BulkStats.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
import co.elastic.clients.json.ObjectDeserializer;
3232
import co.elastic.clients.util.ApiTypeHelper;
3333
import co.elastic.clients.util.ObjectBuilder;
34-
import co.elastic.clients.util.ObjectBuilderBase;
34+
import co.elastic.clients.util.WithJsonObjectBuilderBase;
3535
import jakarta.json.stream.JsonGenerator;
3636
import java.lang.Long;
3737
import java.lang.String;
@@ -211,7 +211,7 @@ protected void serializeInternal(JsonGenerator generator, JsonpMapper mapper) {
211211
* Builder for {@link BulkStats}.
212212
*/
213213

214-
public static class Builder extends ObjectBuilderBase implements ObjectBuilder<BulkStats> {
214+
public static class Builder extends WithJsonObjectBuilderBase<Builder> implements ObjectBuilder<BulkStats> {
215215
private Long totalOperations;
216216

217217
@Nullable
@@ -306,6 +306,11 @@ public final Builder avgSizeInBytes(long value) {
306306
return this;
307307
}
308308

309+
@Override
310+
protected Builder self() {
311+
return this;
312+
}
313+
309314
/**
310315
* Builds a {@link BulkStats}.
311316
*

java-client/src/main/java/co/elastic/clients/elasticsearch/_types/ClusterStatistics.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
import co.elastic.clients.json.ObjectDeserializer;
3232
import co.elastic.clients.util.ApiTypeHelper;
3333
import co.elastic.clients.util.ObjectBuilder;
34-
import co.elastic.clients.util.ObjectBuilderBase;
34+
import co.elastic.clients.util.WithJsonObjectBuilderBase;
3535
import jakarta.json.stream.JsonGenerator;
3636
import java.lang.Integer;
3737
import java.util.Objects;
@@ -115,7 +115,7 @@ protected void serializeInternal(JsonGenerator generator, JsonpMapper mapper) {
115115
* Builder for {@link ClusterStatistics}.
116116
*/
117117

118-
public static class Builder extends ObjectBuilderBase implements ObjectBuilder<ClusterStatistics> {
118+
public static class Builder extends WithJsonObjectBuilderBase<Builder> implements ObjectBuilder<ClusterStatistics> {
119119
private Integer skipped;
120120

121121
private Integer successful;
@@ -146,6 +146,11 @@ public final Builder total(int value) {
146146
return this;
147147
}
148148

149+
@Override
150+
protected Builder self() {
151+
return this;
152+
}
153+
149154
/**
150155
* Builds a {@link ClusterStatistics}.
151156
*

java-client/src/main/java/co/elastic/clients/elasticsearch/_types/CompletionStats.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
import co.elastic.clients.json.ObjectDeserializer;
3232
import co.elastic.clients.util.ApiTypeHelper;
3333
import co.elastic.clients.util.ObjectBuilder;
34-
import co.elastic.clients.util.ObjectBuilderBase;
34+
import co.elastic.clients.util.WithJsonObjectBuilderBase;
3535
import jakarta.json.stream.JsonGenerator;
3636
import java.lang.Long;
3737
import java.lang.String;
@@ -131,7 +131,7 @@ protected void serializeInternal(JsonGenerator generator, JsonpMapper mapper) {
131131
* Builder for {@link CompletionStats}.
132132
*/
133133

134-
public static class Builder extends ObjectBuilderBase implements ObjectBuilder<CompletionStats> {
134+
public static class Builder extends WithJsonObjectBuilderBase<Builder> implements ObjectBuilder<CompletionStats> {
135135
private Long sizeInBytes;
136136

137137
@Nullable
@@ -185,6 +185,11 @@ public final Builder fields(String key, Function<FieldSizeUsage.Builder, ObjectB
185185
return fields(key, fn.apply(new FieldSizeUsage.Builder()).build());
186186
}
187187

188+
@Override
189+
protected Builder self() {
190+
return this;
191+
}
192+
188193
/**
189194
* Builds a {@link CompletionStats}.
190195
*

java-client/src/main/java/co/elastic/clients/elasticsearch/_types/CoordsGeoBounds.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
import co.elastic.clients.json.ObjectDeserializer;
3232
import co.elastic.clients.util.ApiTypeHelper;
3333
import co.elastic.clients.util.ObjectBuilder;
34-
import co.elastic.clients.util.ObjectBuilderBase;
34+
import co.elastic.clients.util.WithJsonObjectBuilderBase;
3535
import jakarta.json.stream.JsonGenerator;
3636
import java.lang.Double;
3737
import java.util.Objects;
@@ -128,7 +128,7 @@ protected void serializeInternal(JsonGenerator generator, JsonpMapper mapper) {
128128
* Builder for {@link CoordsGeoBounds}.
129129
*/
130130

131-
public static class Builder extends ObjectBuilderBase implements ObjectBuilder<CoordsGeoBounds> {
131+
public static class Builder extends WithJsonObjectBuilderBase<Builder> implements ObjectBuilder<CoordsGeoBounds> {
132132
private Double top;
133133

134134
private Double bottom;
@@ -169,6 +169,11 @@ public final Builder right(double value) {
169169
return this;
170170
}
171171

172+
@Override
173+
protected Builder self() {
174+
return this;
175+
}
176+
172177
/**
173178
* Builds a {@link CoordsGeoBounds}.
174179
*

java-client/src/main/java/co/elastic/clients/elasticsearch/_types/DocStats.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
import co.elastic.clients.json.ObjectDeserializer;
3232
import co.elastic.clients.util.ApiTypeHelper;
3333
import co.elastic.clients.util.ObjectBuilder;
34-
import co.elastic.clients.util.ObjectBuilderBase;
34+
import co.elastic.clients.util.WithJsonObjectBuilderBase;
3535
import jakarta.json.stream.JsonGenerator;
3636
import java.lang.Long;
3737
import java.util.Objects;
@@ -108,7 +108,7 @@ protected void serializeInternal(JsonGenerator generator, JsonpMapper mapper) {
108108
* Builder for {@link DocStats}.
109109
*/
110110

111-
public static class Builder extends ObjectBuilderBase implements ObjectBuilder<DocStats> {
111+
public static class Builder extends WithJsonObjectBuilderBase<Builder> implements ObjectBuilder<DocStats> {
112112
private Long count;
113113

114114
@Nullable
@@ -130,6 +130,11 @@ public final Builder deleted(@Nullable Long value) {
130130
return this;
131131
}
132132

133+
@Override
134+
protected Builder self() {
135+
return this;
136+
}
137+
133138
/**
134139
* Builds a {@link DocStats}.
135140
*

java-client/src/main/java/co/elastic/clients/elasticsearch/_types/ElasticsearchVersionInfo.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
import co.elastic.clients.util.ApiTypeHelper;
3333
import co.elastic.clients.util.DateTime;
3434
import co.elastic.clients.util.ObjectBuilder;
35-
import co.elastic.clients.util.ObjectBuilderBase;
35+
import co.elastic.clients.util.WithJsonObjectBuilderBase;
3636
import jakarta.json.stream.JsonGenerator;
3737
import java.lang.Boolean;
3838
import java.lang.String;
@@ -197,7 +197,9 @@ protected void serializeInternal(JsonGenerator generator, JsonpMapper mapper) {
197197
* Builder for {@link ElasticsearchVersionInfo}.
198198
*/
199199

200-
public static class Builder extends ObjectBuilderBase implements ObjectBuilder<ElasticsearchVersionInfo> {
200+
public static class Builder extends WithJsonObjectBuilderBase<Builder>
201+
implements
202+
ObjectBuilder<ElasticsearchVersionInfo> {
201203
private DateTime buildDate;
202204

203205
private String buildFlavor;
@@ -288,6 +290,11 @@ public final Builder number(String value) {
288290
return this;
289291
}
290292

293+
@Override
294+
protected Builder self() {
295+
return this;
296+
}
297+
291298
/**
292299
* Builds a {@link ElasticsearchVersionInfo}.
293300
*

0 commit comments

Comments
 (0)