Skip to content

Commit

Permalink
Fix missing properties on UpdateOperation (#748)
Browse files Browse the repository at this point in the history
* Added scriptedUpsert option to UpdateOperation (#744)

Signed-off-by: Christian Winkler <cwinkler@integrationmatters.com>

* Added detectNoop option to UpdateOperation (#744)

Signed-off-by: Christian Winkler <cwinkler@integrationmatters.com>

* updated changelog

Signed-off-by: Christian Winkler <cwinkler@integrationmatters.com>

* Added tests

Signed-off-by: Christian Winkler <cwinkler@integrationmatters.com
Signed-off-by: Christian Winkler <cwinkler@integrationmatters.com>

* Running spotlessApply

Signed-off-by: Christian Winkler <cwinkler@integrationmatters.com
Signed-off-by: Christian Winkler <cwinkler@integrationmatters.com>

---------

Signed-off-by: Christian Winkler <cwinkler@integrationmatters.com>
Signed-off-by: Christian Winkler <cwinkler@integrationmatters.com
  • Loading branch information
fs-chris authored Nov 29, 2023
1 parent 5edb45a commit f46b347
Show file tree
Hide file tree
Showing 4 changed files with 164 additions and 2 deletions.
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

0 comments on commit f46b347

Please sign in to comment.