Skip to content

Commit

Permalink
Removed required index for Hit.java (opensearch-project#833)
Browse files Browse the repository at this point in the history
For InnerHits, since the index and id is assumed to be the same as parent, they were not included in the InnerHit object, but when converting it into a Hit object in the java sdk, it would throw an exception, saying index is required. Removed it, and also added unit tests.

Signed-off-by: jvan1997 <32347479+jvan1997@users.noreply.github.com>
  • Loading branch information
jvan1997 authored Feb 7, 2024
1 parent 3884476 commit c18adb9
Show file tree
Hide file tree
Showing 3 changed files with 98 additions and 7 deletions.
5 changes: 3 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@ This section is for maintaining a changelog for all breaking changes for the cli
- Fix version and build ([#254](https://github.com/opensearch-project/opensearch-java/pull/254))
- Fix PutTemplateRequest field deserialization ([#723](https://github.com/opensearch-project/opensearch-java/pull/723))
- Fix PutIndexTemplateRequest field deserialization ([#765](https://github.com/opensearch-project/opensearch-java/pull/765))
- Fix InnerHits storedFields deserialization/serialization ([#781](https://github.com/opensearch-project/opensearch-java/pull/781)
- Fix InnerHits storedFields deserialization/serialization ([#781](https://github.com/opensearch-project/opensearch-java/pull/781))
- Fix InnerHits to no longer enforce the nullable Index field when converting to Hit. ([#825](https://github.com/opensearch-project/opensearch-java/issues/825))

### Security

Expand Down Expand Up @@ -265,4 +266,4 @@ This section is for maintaining a changelog for all breaking changes for the cli
[2.5.0]: https://github.com/opensearch-project/opensearch-java/compare/v2.4.0...v2.5.0
[2.4.0]: https://github.com/opensearch-project/opensearch-java/compare/v2.3.0...v2.4.0
[2.3.0]: https://github.com/opensearch-project/opensearch-java/compare/v2.2.0...v2.3.0
[2.2.0]: https://github.com/opensearch-project/opensearch-java/compare/v2.1.0...v2.2.0
[2.2.0]: https://github.com/opensearch-project/opensearch-java/compare/v2.1.0...v2.2.0
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ public class Hit<TDocument> implements JsonpSerializable {

private Hit(Builder<TDocument> builder) {

this.index = ApiTypeHelper.requireNonNull(builder.index, this, "index");
this.index = builder.index;
this.id = builder.id;
this.score = builder.score;
this.explanation = builder.explanation;
Expand All @@ -134,7 +134,7 @@ public static <TDocument> Hit<TDocument> of(Function<Builder<TDocument>, ObjectB
}

/**
* Required - API name: {@code _index}
* API name: {@code _index}
*/
public final String index() {
return this.index;
Expand Down Expand Up @@ -281,8 +281,10 @@ public void serialize(JsonGenerator generator, JsonpMapper mapper) {

protected void serializeInternal(JsonGenerator generator, JsonpMapper mapper) {

generator.writeKey("_index");
generator.write(this.index);
if (this.index != null) {
generator.writeKey("_index");
generator.write(this.index);
}

if (this.id != null) {
generator.writeKey("_id");
Expand Down Expand Up @@ -419,6 +421,8 @@ protected void serializeInternal(JsonGenerator generator, JsonpMapper mapper) {
*/

public static class Builder<TDocument> extends ObjectBuilderBase implements ObjectBuilder<Hit<TDocument>> {

@Nullable
private String index;

@Nullable
Expand Down Expand Up @@ -478,7 +482,7 @@ public static class Builder<TDocument> extends ObjectBuilderBase implements Obje
/**
* Required - API name: {@code _index}
*/
public final Builder<TDocument> index(String value) {
public final Builder<TDocument> index(@Nullable String value) {
this.index = value;
return this;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package org.opensearch.client.opensearch.core.search;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;

import java.io.StringReader;
import org.junit.Test;
import org.opensearch.client.json.JsonData;
import org.opensearch.client.json.JsonpMapper;
import org.opensearch.client.json.jsonb.JsonbJsonpMapper;

public class InnerHitsResultTest {
private final JsonpMapper mapper = new JsonbJsonpMapper();
private final String storedSalary = "details.salary";
private final String storedJobId = "details.jobId";

/**
* test if the InnerHitsResult will build the Hit<JsonData>
*/
@Test
public void testInnerHits() {

String classString = String.valueOf(hitResultWithIdIndex.innerHits().get("test_child").getClass());
assertEquals(classString, InnerHitsResult.class.toString());
// take hitResult and get the InnerHit
InnerHitsResult innerHitsResult = hitResultWithIdIndex.innerHits().get("test_child");
Hit<JsonData> innerHitResult = innerHitsResult.hits().hits().get(0);
assertNotNull(innerHitResult.index());
assertEquals(innerHitResult.index(), "_index");
assertNotNull(innerHitResult.id());
assertEquals(innerHitResult.id(), "child_id");
}

/**
* test if the InnerHitsResult will still build the Hit<JsonData> even if id and index is not specified
*/
@Test
public void testInnerHitWithoutIdIndex() {

String classString = String.valueOf(hitResultNoIdIndex.innerHits().get("test_child").getClass());
assertEquals(classString, InnerHitsResult.class.toString());
// take hitResult and get the InnerHit
InnerHitsResult innerHitsResult = hitResultNoIdIndex.innerHits().get("test_child");
Hit<JsonData> innerHitResult = innerHitsResult.hits().hits().get(0);
// Id and index are now nullable.
assertNull(innerHitResult.index());
assertNull(innerHitResult.id());
}

private final String innerHitJsonWithNoIdOrIndex = "{\"key\":\"value\"}";
private final String innerHitJsonWithIdOrIndex = "{\"id\":\"value\",\"index\":\"value\"}";

private final Hit<JsonData> hitResultNoIdIndex = Hit.of(
it -> it.id("test_parent")
.index("_index")
.innerHits(
"test_child",
innerHitsResultBuilder -> innerHitsResultBuilder.hits(
innerHitsMetadataBuilder -> innerHitsMetadataBuilder.total(total -> total.value(1).relation(TotalHitsRelation.Eq))
.hits(
innerHitsListMemberBuilder -> innerHitsListMemberBuilder.source(
JsonData.from(mapper.jsonProvider().createParser(new StringReader(innerHitJsonWithNoIdOrIndex)), mapper)
)
)
)
)
);
private final Hit<JsonData> hitResultWithIdIndex = Hit.of(
it -> it.id("test_parent")
.index("_index")
.innerHits(
"test_child",
innerHitsResultBuilder -> innerHitsResultBuilder.hits(
innerHitsMetadataBuilder -> innerHitsMetadataBuilder.total(total -> total.value(1).relation(TotalHitsRelation.Eq))
.hits(
innerHitsListMemberBuilder -> innerHitsListMemberBuilder.id("child_id")
.index("_index")
.source(
JsonData.from(mapper.jsonProvider().createParser(new StringReader(innerHitJsonWithIdOrIndex)), mapper)
)
)
)
)
);
}

0 comments on commit c18adb9

Please sign in to comment.