in modules/parent-join/src/internalClusterTest/java/org/opensearch/join/query/ChildQuerySearchIT.java [1498:1810]
public void testMinMaxChildren() throws Exception {
assertAcked(
prepareCreate("test").addMapping("doc", buildParentJoinFieldMappingFromSimplifiedDef("join_field", true, "parent", "child"))
);
ensureGreen();
indexRandom(true, createMinMaxDocBuilders().toArray(new IndexRequestBuilder[0]));
SearchResponse response;
// Score mode = NONE
response = minMaxQuery(ScoreMode.None, 1, null);
assertThat(response.getHits().getTotalHits().value, equalTo(3L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("2"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(1f));
assertThat(response.getHits().getHits()[1].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[1].getScore(), equalTo(1f));
assertThat(response.getHits().getHits()[2].getId(), equalTo("4"));
assertThat(response.getHits().getHits()[2].getScore(), equalTo(1f));
response = minMaxQuery(ScoreMode.None, 1, null);
assertThat(response.getHits().getTotalHits().value, equalTo(3L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("2"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(1f));
assertThat(response.getHits().getHits()[1].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[1].getScore(), equalTo(1f));
assertThat(response.getHits().getHits()[2].getId(), equalTo("4"));
assertThat(response.getHits().getHits()[2].getScore(), equalTo(1f));
response = minMaxQuery(ScoreMode.None, 2, null);
assertThat(response.getHits().getTotalHits().value, equalTo(2L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(1f));
assertThat(response.getHits().getHits()[1].getId(), equalTo("4"));
assertThat(response.getHits().getHits()[1].getScore(), equalTo(1f));
response = minMaxQuery(ScoreMode.None, 3, null);
assertThat(response.getHits().getTotalHits().value, equalTo(1L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("4"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(1f));
response = minMaxQuery(ScoreMode.None, 4, null);
assertThat(response.getHits().getTotalHits().value, equalTo(0L));
response = minMaxQuery(ScoreMode.None, 1, 4);
assertThat(response.getHits().getTotalHits().value, equalTo(3L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("2"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(1f));
assertThat(response.getHits().getHits()[1].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[1].getScore(), equalTo(1f));
assertThat(response.getHits().getHits()[2].getId(), equalTo("4"));
assertThat(response.getHits().getHits()[2].getScore(), equalTo(1f));
response = minMaxQuery(ScoreMode.None, 1, 3);
assertThat(response.getHits().getTotalHits().value, equalTo(3L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("2"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(1f));
assertThat(response.getHits().getHits()[1].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[1].getScore(), equalTo(1f));
assertThat(response.getHits().getHits()[2].getId(), equalTo("4"));
assertThat(response.getHits().getHits()[2].getScore(), equalTo(1f));
response = minMaxQuery(ScoreMode.None, 1, 2);
assertThat(response.getHits().getTotalHits().value, equalTo(2L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("2"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(1f));
assertThat(response.getHits().getHits()[1].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[1].getScore(), equalTo(1f));
response = minMaxQuery(ScoreMode.None, 2, 2);
assertThat(response.getHits().getTotalHits().value, equalTo(1L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(1f));
IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> minMaxQuery(ScoreMode.None, 3, 2));
assertThat(e.getMessage(), equalTo("[has_child] 'max_children' is less than 'min_children'"));
// Score mode = SUM
response = minMaxQuery(ScoreMode.Total, 1, null);
assertThat(response.getHits().getTotalHits().value, equalTo(3L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("4"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(6f));
assertThat(response.getHits().getHits()[1].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[1].getScore(), equalTo(3f));
assertThat(response.getHits().getHits()[2].getId(), equalTo("2"));
assertThat(response.getHits().getHits()[2].getScore(), equalTo(1f));
response = minMaxQuery(ScoreMode.Total, 1, null);
assertThat(response.getHits().getTotalHits().value, equalTo(3L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("4"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(6f));
assertThat(response.getHits().getHits()[1].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[1].getScore(), equalTo(3f));
assertThat(response.getHits().getHits()[2].getId(), equalTo("2"));
assertThat(response.getHits().getHits()[2].getScore(), equalTo(1f));
response = minMaxQuery(ScoreMode.Total, 2, null);
assertThat(response.getHits().getTotalHits().value, equalTo(2L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("4"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(6f));
assertThat(response.getHits().getHits()[1].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[1].getScore(), equalTo(3f));
response = minMaxQuery(ScoreMode.Total, 3, null);
assertThat(response.getHits().getTotalHits().value, equalTo(1L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("4"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(6f));
response = minMaxQuery(ScoreMode.Total, 4, null);
assertThat(response.getHits().getTotalHits().value, equalTo(0L));
response = minMaxQuery(ScoreMode.Total, 1, 4);
assertThat(response.getHits().getTotalHits().value, equalTo(3L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("4"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(6f));
assertThat(response.getHits().getHits()[1].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[1].getScore(), equalTo(3f));
assertThat(response.getHits().getHits()[2].getId(), equalTo("2"));
assertThat(response.getHits().getHits()[2].getScore(), equalTo(1f));
response = minMaxQuery(ScoreMode.Total, 1, 3);
assertThat(response.getHits().getTotalHits().value, equalTo(3L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("4"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(6f));
assertThat(response.getHits().getHits()[1].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[1].getScore(), equalTo(3f));
assertThat(response.getHits().getHits()[2].getId(), equalTo("2"));
assertThat(response.getHits().getHits()[2].getScore(), equalTo(1f));
response = minMaxQuery(ScoreMode.Total, 1, 2);
assertThat(response.getHits().getTotalHits().value, equalTo(2L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(3f));
assertThat(response.getHits().getHits()[1].getId(), equalTo("2"));
assertThat(response.getHits().getHits()[1].getScore(), equalTo(1f));
response = minMaxQuery(ScoreMode.Total, 2, 2);
assertThat(response.getHits().getTotalHits().value, equalTo(1L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(3f));
e = expectThrows(IllegalArgumentException.class, () -> minMaxQuery(ScoreMode.Total, 3, 2));
assertThat(e.getMessage(), equalTo("[has_child] 'max_children' is less than 'min_children'"));
// Score mode = MAX
response = minMaxQuery(ScoreMode.Max, 1, null);
assertThat(response.getHits().getTotalHits().value, equalTo(3L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("4"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(3f));
assertThat(response.getHits().getHits()[1].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[1].getScore(), equalTo(2f));
assertThat(response.getHits().getHits()[2].getId(), equalTo("2"));
assertThat(response.getHits().getHits()[2].getScore(), equalTo(1f));
response = minMaxQuery(ScoreMode.Max, 1, null);
assertThat(response.getHits().getTotalHits().value, equalTo(3L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("4"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(3f));
assertThat(response.getHits().getHits()[1].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[1].getScore(), equalTo(2f));
assertThat(response.getHits().getHits()[2].getId(), equalTo("2"));
assertThat(response.getHits().getHits()[2].getScore(), equalTo(1f));
response = minMaxQuery(ScoreMode.Max, 2, null);
assertThat(response.getHits().getTotalHits().value, equalTo(2L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("4"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(3f));
assertThat(response.getHits().getHits()[1].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[1].getScore(), equalTo(2f));
response = minMaxQuery(ScoreMode.Max, 3, null);
assertThat(response.getHits().getTotalHits().value, equalTo(1L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("4"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(3f));
response = minMaxQuery(ScoreMode.Max, 4, null);
assertThat(response.getHits().getTotalHits().value, equalTo(0L));
response = minMaxQuery(ScoreMode.Max, 1, 4);
assertThat(response.getHits().getTotalHits().value, equalTo(3L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("4"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(3f));
assertThat(response.getHits().getHits()[1].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[1].getScore(), equalTo(2f));
assertThat(response.getHits().getHits()[2].getId(), equalTo("2"));
assertThat(response.getHits().getHits()[2].getScore(), equalTo(1f));
response = minMaxQuery(ScoreMode.Max, 1, 3);
assertThat(response.getHits().getTotalHits().value, equalTo(3L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("4"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(3f));
assertThat(response.getHits().getHits()[1].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[1].getScore(), equalTo(2f));
assertThat(response.getHits().getHits()[2].getId(), equalTo("2"));
assertThat(response.getHits().getHits()[2].getScore(), equalTo(1f));
response = minMaxQuery(ScoreMode.Max, 1, 2);
assertThat(response.getHits().getTotalHits().value, equalTo(2L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(2f));
assertThat(response.getHits().getHits()[1].getId(), equalTo("2"));
assertThat(response.getHits().getHits()[1].getScore(), equalTo(1f));
response = minMaxQuery(ScoreMode.Max, 2, 2);
assertThat(response.getHits().getTotalHits().value, equalTo(1L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(2f));
e = expectThrows(IllegalArgumentException.class, () -> minMaxQuery(ScoreMode.Max, 3, 2));
assertThat(e.getMessage(), equalTo("[has_child] 'max_children' is less than 'min_children'"));
// Score mode = AVG
response = minMaxQuery(ScoreMode.Avg, 1, null);
assertThat(response.getHits().getTotalHits().value, equalTo(3L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("4"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(2f));
assertThat(response.getHits().getHits()[1].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[1].getScore(), equalTo(1.5f));
assertThat(response.getHits().getHits()[2].getId(), equalTo("2"));
assertThat(response.getHits().getHits()[2].getScore(), equalTo(1f));
response = minMaxQuery(ScoreMode.Avg, 1, null);
assertThat(response.getHits().getTotalHits().value, equalTo(3L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("4"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(2f));
assertThat(response.getHits().getHits()[1].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[1].getScore(), equalTo(1.5f));
assertThat(response.getHits().getHits()[2].getId(), equalTo("2"));
assertThat(response.getHits().getHits()[2].getScore(), equalTo(1f));
response = minMaxQuery(ScoreMode.Avg, 2, null);
assertThat(response.getHits().getTotalHits().value, equalTo(2L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("4"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(2f));
assertThat(response.getHits().getHits()[1].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[1].getScore(), equalTo(1.5f));
response = minMaxQuery(ScoreMode.Avg, 3, null);
assertThat(response.getHits().getTotalHits().value, equalTo(1L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("4"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(2f));
response = minMaxQuery(ScoreMode.Avg, 4, null);
assertThat(response.getHits().getTotalHits().value, equalTo(0L));
response = minMaxQuery(ScoreMode.Avg, 1, 4);
assertThat(response.getHits().getTotalHits().value, equalTo(3L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("4"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(2f));
assertThat(response.getHits().getHits()[1].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[1].getScore(), equalTo(1.5f));
assertThat(response.getHits().getHits()[2].getId(), equalTo("2"));
assertThat(response.getHits().getHits()[2].getScore(), equalTo(1f));
response = minMaxQuery(ScoreMode.Avg, 1, 3);
assertThat(response.getHits().getTotalHits().value, equalTo(3L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("4"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(2f));
assertThat(response.getHits().getHits()[1].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[1].getScore(), equalTo(1.5f));
assertThat(response.getHits().getHits()[2].getId(), equalTo("2"));
assertThat(response.getHits().getHits()[2].getScore(), equalTo(1f));
response = minMaxQuery(ScoreMode.Avg, 1, 2);
assertThat(response.getHits().getTotalHits().value, equalTo(2L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(1.5f));
assertThat(response.getHits().getHits()[1].getId(), equalTo("2"));
assertThat(response.getHits().getHits()[1].getScore(), equalTo(1f));
response = minMaxQuery(ScoreMode.Avg, 2, 2);
assertThat(response.getHits().getTotalHits().value, equalTo(1L));
assertThat(response.getHits().getHits()[0].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[0].getScore(), equalTo(1.5f));
e = expectThrows(IllegalArgumentException.class, () -> minMaxQuery(ScoreMode.Avg, 3, 2));
assertThat(e.getMessage(), equalTo("[has_child] 'max_children' is less than 'min_children'"));
}