public void testSortNestedWithNestedFilter()

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