From 2b5e3f5586ad0c71dcf404a166e18529a960eb00 Mon Sep 17 00:00:00 2001 From: Martijn van Groningen Date: Mon, 25 Feb 2013 16:21:22 +0100 Subject: [PATCH] Fixed resolving closest nested object when sorting on a field inside nested object --- .../search/sort/SortParseElement.java | 26 +++++++++++------- .../integration/nested/SimpleNestedTests.java | 27 +++++++++++++++++++ 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/elasticsearch/search/sort/SortParseElement.java b/src/main/java/org/elasticsearch/search/sort/SortParseElement.java index c89069ca044..67301e1ac26 100644 --- a/src/main/java/org/elasticsearch/search/sort/SortParseElement.java +++ b/src/main/java/org/elasticsearch/search/sort/SortParseElement.java @@ -242,18 +242,24 @@ public class SortParseElement implements SearchParseElement { int indexOf = fieldName.lastIndexOf('.'); if (indexOf == -1) { return null; - } + } else { + do { + String objectPath = fieldName.substring(0, indexOf); + ObjectMappers objectMappers = context.mapperService().objectMapper(objectPath); + if (objectMappers == null) { + return null; + } - String objectPath = fieldName.substring(0, indexOf); - ObjectMappers objectMappers = context.mapperService().objectMapper(objectPath); - if (objectMappers == null) { - return null; - } + if (objectMappers.hasNested()) { + for (ObjectMapper objectMapper : objectMappers) { + if (objectMapper.nested().isNested()) { + return objectMapper; + } + } + } - for (ObjectMapper objectMapper : objectMappers) { - if (objectMapper.nested().isNested()) { - return objectMapper; - } + indexOf = objectPath.lastIndexOf('.'); + } while (indexOf != -1); } return null; diff --git a/src/test/java/org/elasticsearch/test/integration/nested/SimpleNestedTests.java b/src/test/java/org/elasticsearch/test/integration/nested/SimpleNestedTests.java index f7782facbd3..246ebcd4a40 100644 --- a/src/test/java/org/elasticsearch/test/integration/nested/SimpleNestedTests.java +++ b/src/test/java/org/elasticsearch/test/integration/nested/SimpleNestedTests.java @@ -714,6 +714,9 @@ public class SimpleNestedTests extends AbstractNodesTests { .startObject("child") .field("filter", true) .field("child_values", 1l) + .startObject("child_obj") + .field("value", 1l) + .endObject() .endObject() .startObject("child") .field("filter", false) @@ -742,6 +745,9 @@ public class SimpleNestedTests extends AbstractNodesTests { .startObject("child") .field("filter", true) .field("child_values", 2l) + .startObject("child_obj") + .field("value", 2l) + .endObject() .endObject() .startObject("child") .field("filter", false) @@ -770,6 +776,9 @@ public class SimpleNestedTests extends AbstractNodesTests { .startObject("child") .field("filter", true) .field("child_values", 3l) + .startObject("child_obj") + .field("value", 3l) + .endObject() .endObject() .startObject("child") .field("filter", false) @@ -884,6 +893,24 @@ public class SimpleNestedTests extends AbstractNodesTests { // assertThat(searchResponse.getHits().getHits()[1].sortValues()[0].toString(), equalTo("-2")); // assertThat(searchResponse.getHits().getHits()[2].getId(), equalTo("1")); // assertThat(searchResponse.getHits().getHits()[2].sortValues()[0].toString(), equalTo("-1")); + + // Check if closest nested type is resolved + searchResponse = client.prepareSearch() + .setQuery(matchAllQuery()) + .addSort( + SortBuilders.fieldSort("parent.child.child_obj.value") + .setNestedFilter(FilterBuilders.termFilter("parent.child.filter", true)) + .order(SortOrder.ASC) + ) + .execute().actionGet(); + assertThat(searchResponse.getHits().totalHits(), equalTo(3l)); + assertThat(searchResponse.getHits().getHits().length, equalTo(3)); + assertThat(searchResponse.getHits().getHits()[0].getId(), equalTo("1")); + assertThat(searchResponse.getHits().getHits()[0].sortValues()[0].toString(), equalTo("1")); + assertThat(searchResponse.getHits().getHits()[1].getId(), equalTo("2")); + assertThat(searchResponse.getHits().getHits()[1].sortValues()[0].toString(), equalTo("2")); + assertThat(searchResponse.getHits().getHits()[2].getId(), equalTo("3")); + assertThat(searchResponse.getHits().getHits()[2].sortValues()[0].toString(), equalTo("3")); } } \ No newline at end of file