diff --git a/src/main/java/com/avaje/ebeaninternal/server/querydefn/OrmQueryDetail.java b/src/main/java/com/avaje/ebeaninternal/server/querydefn/OrmQueryDetail.java index d96c7f91f..7af5d97ac 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/querydefn/OrmQueryDetail.java +++ b/src/main/java/com/avaje/ebeaninternal/server/querydefn/OrmQueryDetail.java @@ -298,15 +298,18 @@ public class OrmQueryDetail implements Serializable { fetch(new OrmQueryProperties(path, properties)); } + /** + * Sort the fetch paths into depth order adding any missing parent paths if necessary. + */ public void sortFetchPaths(BeanDescriptor d) { - LinkedHashMap sorted = new LinkedHashMap(); - - for (OrmQueryProperties p : fetchPaths.values()) { - sortFetchPaths(d, p, sorted); + if (!fetchPaths.isEmpty()) { + LinkedHashMap sorted = new LinkedHashMap(); + for (OrmQueryProperties p : fetchPaths.values()) { + sortFetchPaths(d, p, sorted); + } + fetchPaths = sorted; } - - fetchPaths = sorted; } private void sortFetchPaths(BeanDescriptor d, OrmQueryProperties p, LinkedHashMap sorted) { diff --git a/src/test/java/com/avaje/ebeaninternal/server/querydefn/OrmQueryDetailTest.java b/src/test/java/com/avaje/ebeaninternal/server/querydefn/OrmQueryDetailTest.java index 55c7bfd98..9a3b4edea 100644 --- a/src/test/java/com/avaje/ebeaninternal/server/querydefn/OrmQueryDetailTest.java +++ b/src/test/java/com/avaje/ebeaninternal/server/querydefn/OrmQueryDetailTest.java @@ -166,6 +166,40 @@ public class OrmQueryDetailTest extends BaseTestCase { assertThat(detail.getChunk("customer.contacts", false).isQueryFetch()).isTrue(); } + @Test + public void sortFetchPaths_when_missingParent_expect_addsMissing() { + + OrmQueryDetail detail = new OrmQueryDetail(); + detail.fetch("customer.contacts", null, null); + + detail.sortFetchPaths(orderDesc()); + + assertThat(detail.getFetchPaths()).containsExactly("customer","customer.contacts"); + assertThat(detail.getChunk("customer",false).getIncluded()).containsExactly("id"); + } + + @Test + public void sortFetchPaths_when_outOfOrder_expect_correctOrder() { + + OrmQueryDetail detail = new OrmQueryDetail(); + detail.fetch("customer.contacts", "email", null); + detail.fetch("customer", "name", null); + + detail.sortFetchPaths(orderDesc()); + + assertThat(detail.getFetchPaths()).containsExactly("customer","customer.contacts"); + assertThat(detail.getChunk("customer",false).getIncluded()).containsExactly("name"); + } + + @Test + public void sortFetchPaths_when_empty_expect_stillEmpty() { + + OrmQueryDetail detail = new OrmQueryDetail(); + detail.sortFetchPaths(orderDesc()); + + assertThat(detail.getFetchPaths()).isEmpty(); + } + BeanDescriptor orderDesc() { return getBeanDescriptor(Order.class); }