Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix missing properties on UpdateOperation #748

Merged
merged 5 commits into from
Nov 29, 2023
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
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ Inspired from [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
### Removed

### Fixed
- Fix missing properties on UpdateOperation ([#744](https://github.com/opensearch-project/opensearch-java/pull/744))

### Security

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ public final Integer retryOnConflict() {
return this.retryOnConflict;
}

@Override
protected void serializeInternal(JsonGenerator generator, JsonpMapper mapper) {

super.serializeInternal(generator, mapper);
Expand Down Expand Up @@ -144,6 +145,12 @@ public static class Builder<TDocument> extends BulkOperationBase.AbstractBuilder
@Nullable
private Boolean docAsUpsert;

@Nullable
private Boolean scriptedUpsert;

@Nullable
private Boolean detectNoop;

@Nullable
private TDocument upsert;

Expand All @@ -166,6 +173,22 @@ public final Builder<TDocument> docAsUpsert(@Nullable Boolean value) {
return this;
}

/**
* API name: {@code scripted_upsert}
*/
public final Builder<TDocument> scriptedUpsert(@Nullable Boolean value) {
this.scriptedUpsert = value;
return this;
}

/**
* API name: {@code detect_noop}
*/
public final Builder<TDocument> detectNoop(@Nullable Boolean value) {
this.detectNoop = value;
return this;
}

/**
* API name: {@code upsert}
*/
Expand Down Expand Up @@ -218,17 +241,20 @@ protected Builder<TDocument> self() {
* @throws NullPointerException
* if some of the required fields are null.
*/
@Override
public UpdateOperation<TDocument> build() {
_checkSingleUse();

data = new UpdateOperationData.Builder<TDocument>().document(document)
.docAsUpsert(docAsUpsert)
.scriptedUpsert(scriptedUpsert)
.detectNoop(detectNoop)
.script(script)
.upsert(upsert)
.tDocumentSerializer(tDocumentSerializer)
.build();

return new UpdateOperation<TDocument>(this);
return new UpdateOperation<>(this);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,12 @@ public class UpdateOperationData<TDocument> implements JsonpSerializable {
@Nullable
private final Boolean docAsUpsert;

@Nullable
private final Boolean scriptedUpsert;

@Nullable
private final Boolean detectNoop;

@Nullable
private final TDocument upsert;

Expand All @@ -36,6 +42,8 @@ public class UpdateOperationData<TDocument> implements JsonpSerializable {
private UpdateOperationData(Builder<TDocument> builder) {
this.document = builder.document;
this.docAsUpsert = builder.docAsUpsert;
this.scriptedUpsert = builder.scriptedUpsert;
this.detectNoop = builder.detectNoop;
this.script = builder.script;
this.upsert = builder.upsert;
this.tDocumentSerializer = builder.tDocumentSerializer;
Expand All @@ -55,6 +63,16 @@ protected void serializeInternal(JsonGenerator generator, JsonpMapper mapper) {
generator.write(this.docAsUpsert);
}

if (this.scriptedUpsert != null) {
generator.writeKey("scripted_upsert");
generator.write(scriptedUpsert);
}

if (this.detectNoop != null) {
generator.writeKey("detect_noop");
generator.write(detectNoop);
}

if (this.document != null) {
generator.writeKey("doc");
JsonpUtils.serialize(document, generator, tDocumentSerializer, mapper);
Expand Down Expand Up @@ -87,6 +105,12 @@ public static class Builder<TDocument> extends BulkOperationBase.AbstractBuilder
@Nullable
private Boolean docAsUpsert;

@Nullable
private Boolean scriptedUpsert;

@Nullable
private Boolean detectNoop;

@Nullable
private TDocument upsert;

Expand All @@ -109,6 +133,22 @@ public final Builder<TDocument> docAsUpsert(@Nullable Boolean value) {
return this;
}

/**
* API name: {@code scripted_upsert}
*/
public final Builder<TDocument> scriptedUpsert(@Nullable Boolean value) {
this.scriptedUpsert = value;
return this;
}

/**
* API name: {@code detect_noop}
*/
public final Builder<TDocument> detectNoop(@Nullable Boolean value) {
this.detectNoop = value;
return this;
}

/**
* API name: {@code upsert}
*/
Expand Down Expand Up @@ -145,10 +185,11 @@ protected Builder<TDocument> self() {
* @throws NullPointerException
* if some of the required fields are null.
*/
@Override
public UpdateOperationData<TDocument> build() {
_checkSingleUse();

return new UpdateOperationData<TDocument>(this);
return new UpdateOperationData<>(this);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -393,6 +393,100 @@ public void testBulkUpdateScriptUpsert() throws IOException {
assertEquals(1337, getResponse.source().getIntValue());
}

public void testBulkUpdateScriptedUpsertUpdate() throws IOException {
final String id = "777";

final AppData appData = new AppData();
appData.setIntValue(1337);
appData.setMsg("foo");

assertEquals(Result.Created, javaClient().index(b -> b.index("index").id(id).document(appData)).result());

final BulkOperation op = new BulkOperation.Builder().update(
o -> o.index("index")
.id(id)
.scriptedUpsert(true)
.upsert(Collections.emptyMap())
.script(
Script.of(
s -> s.inline(
new InlineScript.Builder().lang("painless")
.source("ctx._source.intValue = ctx?._source?.intValue == null ? 7777 : 9999")
.build()
)
)
)
).build();

BulkRequest bulkRequest = new BulkRequest.Builder().operations(op).build();
BulkResponse bulkResponse = javaClient().bulk(bulkRequest);

assertTrue(bulkResponse.took() > 0);
assertEquals(1, bulkResponse.items().size());

final GetResponse<AppData> getResponse = javaClient().get(b -> b.index("index").id(id), AppData.class);
assertTrue(getResponse.found());
assertEquals(9999, getResponse.source().getIntValue());
}

public void testBulkUpdateScriptedUpsertInsert() throws IOException {
final String id = "778";

final BulkOperation op = new BulkOperation.Builder().update(
o -> o.index("index")
.id(id)
.scriptedUpsert(true)
.upsert(Collections.emptyMap())
.script(
Script.of(
s -> s.inline(
new InlineScript.Builder().lang("painless")
.source("ctx._source.intValue = ctx?._source?.intValue == null ? 7777 : 9999")
.build()
)
)
)
).build();

BulkRequest bulkRequest = new BulkRequest.Builder().operations(op).build();
BulkResponse bulkResponse = javaClient().bulk(bulkRequest);

assertTrue(bulkResponse.took() > 0);
assertEquals(1, bulkResponse.items().size());

final GetResponse<AppData> getResponse = javaClient().get(b -> b.index("index").id(id), AppData.class);
assertTrue(getResponse.found());
assertEquals(7777, getResponse.source().getIntValue());
}

public void testBulkUpdateDetectNoop() throws IOException {
final String id = "779";

final AppData appData = new AppData();
appData.setIntValue(1337);
appData.setMsg("foo");

assertEquals(Result.Created, javaClient().index(b -> b.index("index").id(id).document(appData)).result());

BulkOperation op = new BulkOperation.Builder().update(o -> o.index("index").id(id).detectNoop(true).document(appData)).build();

BulkRequest bulkRequest = new BulkRequest.Builder().operations(op).build();
BulkResponse bulkResponse = javaClient().bulk(bulkRequest);

assertTrue(bulkResponse.took() > 0);
assertEquals(1, bulkResponse.items().size());
assertEquals(Result.NoOp.jsonValue(), bulkResponse.items().get(0).result());

op = new BulkOperation.Builder().update(o -> o.index("index").id(id).detectNoop(false).document(appData)).build();

bulkRequest = new BulkRequest.Builder().operations(op).build();
bulkResponse = javaClient().bulk(bulkRequest);
assertTrue(bulkResponse.took() > 0);
assertEquals(1, bulkResponse.items().size());
assertEquals(Result.Updated.jsonValue(), bulkResponse.items().get(0).result());

}

public void testBulkUpdateUpsert() throws IOException {
final String id = "100";

Expand Down
Loading