in server/src/internalClusterTest/java/org/elasticsearch/search/nested/SimpleNestedIT.java [973:1314]
public void testSortNestedWithNestedFilter() throws Exception {
assertAcked(
prepareCreate("test").setMapping(
XContentFactory.jsonBuilder()
.startObject()
.startObject("_doc")
.startObject("properties")
.startObject("grand_parent_values")
.field("type", "long")
.endObject()
.startObject("parent")
.field("type", "nested")
.startObject("properties")
.startObject("parent_values")
.field("type", "long")
.endObject()
.startObject("child")
.field("type", "nested")
.startObject("properties")
.startObject("child_values")
.field("type", "long")
.endObject()
.endObject()
.endObject()
.endObject()
.endObject()
.endObject()
.endObject()
.endObject()
)
);
ensureGreen();
// sum: 11
prepareIndex("test").setId("1")
.setSource(
jsonBuilder().startObject()
.field("grand_parent_values", 1L)
.startArray("parent")
.startObject()
.field("filter", false)
.field("parent_values", 1L)
.startArray("child")
.startObject()
.field("filter", true)
.field("child_values", 1L)
.startObject("child_obj")
.field("value", 1L)
.endObject()
.endObject()
.startObject()
.field("filter", false)
.field("child_values", 6L)
.endObject()
.endArray()
.endObject()
.startObject()
.field("filter", true)
.field("parent_values", 2L)
.startArray("child")
.startObject()
.field("filter", false)
.field("child_values", -1L)
.endObject()
.startObject()
.field("filter", false)
.field("child_values", 5L)
.endObject()
.endArray()
.endObject()
.endArray()
.endObject()
)
.get();
// sum: 7
prepareIndex("test").setId("2")
.setSource(
jsonBuilder().startObject()
.field("grand_parent_values", 2L)
.startArray("parent")
.startObject()
.field("filter", false)
.field("parent_values", 2L)
.startArray("child")
.startObject()
.field("filter", true)
.field("child_values", 2L)
.startObject("child_obj")
.field("value", 2L)
.endObject()
.endObject()
.startObject()
.field("filter", false)
.field("child_values", 4L)
.endObject()
.endArray()
.endObject()
.startObject()
.field("parent_values", 3L)
.field("filter", true)
.startArray("child")
.startObject()
.field("child_values", -2L)
.field("filter", false)
.endObject()
.startObject()
.field("filter", false)
.field("child_values", 3L)
.endObject()
.endArray()
.endObject()
.endArray()
.endObject()
)
.get();
// sum: 2
prepareIndex("test").setId("3")
.setSource(
jsonBuilder().startObject()
.field("grand_parent_values", 3L)
.startArray("parent")
.startObject()
.field("parent_values", 3L)
.field("filter", false)
.startArray("child")
.startObject()
.field("filter", true)
.field("child_values", 3L)
.startObject("child_obj")
.field("value", 3L)
.endObject()
.endObject()
.startObject()
.field("filter", false)
.field("child_values", 1L)
.endObject()
.endArray()
.endObject()
.startObject()
.field("parent_values", 4L)
.field("filter", true)
.startArray("child")
.startObject()
.field("filter", false)
.field("child_values", -3L)
.endObject()
.startObject()
.field("filter", false)
.field("child_values", 1L)
.endObject()
.endArray()
.endObject()
.endArray()
.endObject()
)
.get();
refresh();
// Without nested filter
assertResponse(
prepareSearch().setQuery(matchAllQuery())
.addSort(
SortBuilders.fieldSort("parent.child.child_values")
.setNestedSort(new NestedSortBuilder("parent.child"))
.order(SortOrder.ASC)
),
response -> {
assertHitCount(response, 3);
assertThat(response.getHits().getHits().length, equalTo(3));
assertThat(response.getHits().getHits()[0].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[0].getSortValues()[0].toString(), equalTo("-3"));
assertThat(response.getHits().getHits()[1].getId(), equalTo("2"));
assertThat(response.getHits().getHits()[1].getSortValues()[0].toString(), equalTo("-2"));
assertThat(response.getHits().getHits()[2].getId(), equalTo("1"));
assertThat(response.getHits().getHits()[2].getSortValues()[0].toString(), equalTo("-1"));
}
);
// With nested filter
NestedSortBuilder nestedSort = new NestedSortBuilder("parent.child");
nestedSort.setFilter(QueryBuilders.termQuery("parent.child.filter", true));
assertResponses(response -> {
assertHitCount(response, 3);
assertThat(response.getHits().getHits().length, equalTo(3));
assertThat(response.getHits().getHits()[0].getId(), equalTo("1"));
assertThat(response.getHits().getHits()[0].getSortValues()[0].toString(), equalTo("1"));
assertThat(response.getHits().getHits()[1].getId(), equalTo("2"));
assertThat(response.getHits().getHits()[1].getSortValues()[0].toString(), equalTo("2"));
assertThat(response.getHits().getHits()[2].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[2].getSortValues()[0].toString(), equalTo("3"));
},
prepareSearch().setQuery(matchAllQuery())
.addSort(SortBuilders.fieldSort("parent.child.child_values").setNestedSort(nestedSort).order(SortOrder.ASC)),
prepareSearch().setQuery(matchAllQuery())
.addSort(
SortBuilders.fieldSort("parent.child.child_obj.value")
.setNestedSort(
new NestedSortBuilder("parent.child").setFilter(QueryBuilders.termQuery("parent.child.filter", true))
)
.order(SortOrder.ASC)
),
// Sort mode: sum with filter
prepareSearch().setQuery(matchAllQuery())
.addSort(
SortBuilders.fieldSort("parent.child.child_values")
.setNestedSort(
new NestedSortBuilder("parent.child").setFilter(QueryBuilders.termQuery("parent.child.filter", true))
)
.sortMode(SortMode.SUM)
.order(SortOrder.ASC)
),
// Sort mode: avg with filter
prepareSearch().setQuery(matchAllQuery())
.addSort(
SortBuilders.fieldSort("parent.child.child_values")
.setNestedSort(
new NestedSortBuilder("parent.child").setFilter(QueryBuilders.termQuery("parent.child.filter", true))
)
.sortMode(SortMode.AVG)
.order(SortOrder.ASC)
)
);
assertResponse(
prepareSearch().setQuery(matchAllQuery())
.addSort(
SortBuilders.fieldSort("parent.parent_values")
.setNestedSort(nestedSort.setFilter(QueryBuilders.termQuery("parent.filter", false)))
.order(SortOrder.ASC)
),
response -> {
assertHitCount(response, 3);
assertThat(response.getHits().getHits().length, equalTo(3));
assertThat(response.getHits().getHits()[0].getId(), equalTo("1"));
assertThat(response.getHits().getHits()[0].getSortValues()[0].toString(), equalTo("1"));
assertThat(response.getHits().getHits()[1].getId(), equalTo("2"));
assertThat(response.getHits().getHits()[1].getSortValues()[0].toString(), equalTo("2"));
assertThat(response.getHits().getHits()[2].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[2].getSortValues()[0].toString(), equalTo("3"));
}
);
assertResponse(
prepareSearch().setQuery(matchAllQuery())
.addSort(
SortBuilders.fieldSort("parent.child.child_values")
.setNestedSort(
new NestedSortBuilder("parent").setFilter(QueryBuilders.termQuery("parent.filter", false))
.setNestedSort(new NestedSortBuilder("parent.child"))
)
.sortMode(SortMode.MAX)
.order(SortOrder.ASC)
),
response -> {
assertHitCount(response, 3);
assertThat(response.getHits().getHits().length, equalTo(3));
assertThat(response.getHits().getHits()[0].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[0].getSortValues()[0].toString(), equalTo("3"));
assertThat(response.getHits().getHits()[1].getId(), equalTo("2"));
assertThat(response.getHits().getHits()[1].getSortValues()[0].toString(), equalTo("4"));
assertThat(response.getHits().getHits()[2].getId(), equalTo("1"));
assertThat(response.getHits().getHits()[2].getSortValues()[0].toString(), equalTo("6"));
}
);
// Sort mode: sum
assertResponse(
prepareSearch().setQuery(matchAllQuery())
.addSort(
SortBuilders.fieldSort("parent.child.child_values")
.setNestedSort(new NestedSortBuilder("parent.child"))
.sortMode(SortMode.SUM)
.order(SortOrder.ASC)
),
response -> {
assertHitCount(response, 3);
assertThat(response.getHits().getHits().length, equalTo(3));
assertThat(response.getHits().getHits()[0].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[0].getSortValues()[0].toString(), equalTo("2"));
assertThat(response.getHits().getHits()[1].getId(), equalTo("2"));
assertThat(response.getHits().getHits()[1].getSortValues()[0].toString(), equalTo("7"));
assertThat(response.getHits().getHits()[2].getId(), equalTo("1"));
assertThat(response.getHits().getHits()[2].getSortValues()[0].toString(), equalTo("11"));
}
);
assertResponse(
prepareSearch().setQuery(matchAllQuery())
.addSort(
SortBuilders.fieldSort("parent.child.child_values")
.setNestedSort(new NestedSortBuilder("parent.child"))
.sortMode(SortMode.SUM)
.order(SortOrder.DESC)
),
response -> {
assertHitCount(response, 3);
assertThat(response.getHits().getHits().length, equalTo(3));
assertThat(response.getHits().getHits()[0].getId(), equalTo("1"));
assertThat(response.getHits().getHits()[0].getSortValues()[0].toString(), equalTo("11"));
assertThat(response.getHits().getHits()[1].getId(), equalTo("2"));
assertThat(response.getHits().getHits()[1].getSortValues()[0].toString(), equalTo("7"));
assertThat(response.getHits().getHits()[2].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[2].getSortValues()[0].toString(), equalTo("2"));
}
);
// Sort mode: avg
assertResponse(
prepareSearch().setQuery(matchAllQuery())
.addSort(
SortBuilders.fieldSort("parent.child.child_values")
.setNestedSort(new NestedSortBuilder("parent.child"))
.sortMode(SortMode.AVG)
.order(SortOrder.ASC)
),
response -> {
assertHitCount(response, 3);
assertThat(response.getHits().getHits().length, equalTo(3));
assertThat(response.getHits().getHits()[0].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[0].getSortValues()[0].toString(), equalTo("1"));
assertThat(response.getHits().getHits()[1].getId(), equalTo("2"));
assertThat(response.getHits().getHits()[1].getSortValues()[0].toString(), equalTo("2"));
assertThat(response.getHits().getHits()[2].getId(), equalTo("1"));
assertThat(response.getHits().getHits()[2].getSortValues()[0].toString(), equalTo("3"));
}
);
assertResponse(
prepareSearch().setQuery(matchAllQuery())
.addSort(
SortBuilders.fieldSort("parent.child.child_values")
.setNestedSort(new NestedSortBuilder("parent.child"))
.sortMode(SortMode.AVG)
.order(SortOrder.DESC)
),
response -> {
assertHitCount(response, 3);
assertThat(response.getHits().getHits().length, equalTo(3));
assertThat(response.getHits().getHits()[0].getId(), equalTo("1"));
assertThat(response.getHits().getHits()[0].getSortValues()[0].toString(), equalTo("3"));
assertThat(response.getHits().getHits()[1].getId(), equalTo("2"));
assertThat(response.getHits().getHits()[1].getSortValues()[0].toString(), equalTo("2"));
assertThat(response.getHits().getHits()[2].getId(), equalTo("3"));
assertThat(response.getHits().getHits()[2].getSortValues()[0].toString(), equalTo("1"));
}
);
}