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

Removed required index for Hit.java #831

Closed
wants to merge 6 commits into from
Closed
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 @@ -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;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How do you ensure that this is only for a inner hit ? And outer hits should enforce requireNonNull.

Copy link
Contributor Author

@jvan1997 jvan1997 Feb 7, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I do think this is a good call out; The problem is that the the InnerHit is in a List in HitsMetadata, which is then in the InnerHitsResult.

So unless there is a file made explicitly to represent an InnerHit (which I think is a valid path), the other option would be to re-populate the Index and the Id to the InnerHits as well, even if they match the parent, or a third option to create a flag that allows a hit to know whether it is an InnerHit or main Hit.

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,84 @@
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 {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we have unit tests for outer hits with nullable ? Should be allowed or not allowed ?

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)
)
)
)
)
);
}
Loading