From d8aac367f530d46cf3bb1c738f8e642b347408ae Mon Sep 17 00:00:00 2001 From: Ivan Dugic Date: Fri, 7 Sep 2012 21:54:01 +0200 Subject: [PATCH] [#1708] Add Map> ResultQuery.fetchGroupsInto(Field, Class) --- .../org/jooq/test/_/testcases/FetchTests.java | 40 +++++++++++++++++++ .../src/org/jooq/test/jOOQAbstractTest.java | 5 +++ jOOQ/src/main/java/org/jooq/Result.java | 14 +++++++ jOOQ/src/main/java/org/jooq/ResultQuery.java | 16 ++++++++ .../jooq/impl/AbstractDelegatingSelect.java | 5 +++ .../org/jooq/impl/AbstractResultQuery.java | 5 +++ .../main/java/org/jooq/impl/ResultImpl.java | 20 ++++++++++ 7 files changed, 105 insertions(+) diff --git a/jOOQ-test/src/org/jooq/test/_/testcases/FetchTests.java b/jOOQ-test/src/org/jooq/test/_/testcases/FetchTests.java index 639ac54064..31e3ec2a83 100644 --- a/jOOQ-test/src/org/jooq/test/_/testcases/FetchTests.java +++ b/jOOQ-test/src/org/jooq/test/_/testcases/FetchTests.java @@ -1500,4 +1500,44 @@ extends BaseTest> map = create().selectFrom(TBook()).orderBy(TBook_ID()) + .fetchIntoGroups(TBook_ID(), (Class) book.get()); + + assertEquals(4, map.size()); + assertEquals(BOOK_IDS, new ArrayList(map.keySet())); + + for (Entry> entry : map.entrySet()) { + assertEquals(1, entry.getValue().size()); + assertEquals(entry.getKey(), on(entry.getValue().get(0)).call("getId").get()); + } + + // Group by BOOK.AUTHOR_ID + map = create().selectFrom(TBook()).orderBy(TBook_ID()) + .fetchIntoGroups(TBook_AUTHOR_ID(), (Class) book.get()); + + assertEquals(2, map.size()); + assertEquals(AUTHOR_IDS, new ArrayList(map.keySet())); + + Iterator>> it = map.entrySet().iterator(); + Entry> entry21 = it.next(); + assertEquals(2, entry21.getValue().size()); + assertEquals(1, ((Integer) on(entry21.getValue().get(0)).call("getId").get()).intValue()); + assertEquals(2, ((Integer) on(entry21.getValue().get(1)).call("getId").get()).intValue()); + + Entry> entry22 = it.next(); + assertEquals(2, entry22.getValue().size()); + assertEquals(3, ((Integer) on(entry22.getValue().get(0)).call("getId").get()).intValue()); + assertEquals(4, ((Integer) on(entry22.getValue().get(1)).call("getId").get()).intValue()); + + assertFalse(it.hasNext()); + } + } diff --git a/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java b/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java index b2c528733c..37b2698e70 100644 --- a/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java +++ b/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java @@ -792,6 +792,11 @@ public abstract class jOOQAbstractTest< new FetchTests(this).testFetchArray(); } + @Test + public void testFetchIntoGroups() throws Exception { + new FetchTests(this).testFetchIntoGroups(); + } + @Test public void testDAOMethods() throws Exception { new DaoTests(this).testDAOMethods(); diff --git a/jOOQ/src/main/java/org/jooq/Result.java b/jOOQ/src/main/java/org/jooq/Result.java index 9d131d2174..fc395818c6 100644 --- a/jOOQ/src/main/java/org/jooq/Result.java +++ b/jOOQ/src/main/java/org/jooq/Result.java @@ -1863,6 +1863,20 @@ public interface Result extends FieldProvider, List, Attach */ Map> intoGroups(Field key, Field value); + /** + * Return a {@link Map} with results grouped by the given key and mapped + * into the given entity type. + *

+ * + * @param The key's generic field type + * @param The generic entity type. + * @param key The key field. + * @param type The entity type. + * @throws MappingException wrapping any reflection or data type conversion + * exception that might have occurred while mapping records + */ + Map> intoGroups(Field key, Class type) throws MappingException; + /** * Convert this result into an array of arrays *

diff --git a/jOOQ/src/main/java/org/jooq/ResultQuery.java b/jOOQ/src/main/java/org/jooq/ResultQuery.java index b730cbee24..ca4f2182d7 100644 --- a/jOOQ/src/main/java/org/jooq/ResultQuery.java +++ b/jOOQ/src/main/java/org/jooq/ResultQuery.java @@ -730,6 +730,22 @@ public interface ResultQuery extends Query { */ > H fetchInto(H handler) throws DataAccessException; + /** + * Return a {@link Map} with results grouped by the given key and mapped + * into the given entity type. + * + * @param The key's generic field type + * @param The generic entity type. + * @param key The key field. + * @param type The entity type. + * @throws DataAccessException if something went wrong executing the query + * @throws MappingException wrapping any reflection or data type conversion + * exception that might have occurred while mapping records + * @see Result#intoGroups(Field, Class) + */ + Map> fetchIntoGroups(Field key, Class type) throws DataAccessException, + MappingException; + /** * Fetch results asynchronously. *

diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractDelegatingSelect.java b/jOOQ/src/main/java/org/jooq/impl/AbstractDelegatingSelect.java index b978dcd167..ae4c933f56 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractDelegatingSelect.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractDelegatingSelect.java @@ -323,6 +323,11 @@ abstract class AbstractDelegatingSelect return getDelegate().fetchInto(handler); } + @Override + public final Map> fetchIntoGroups(Field key, Class type) { + return getDelegate().fetchIntoGroups(key, type); + } + @Override public final FutureResult fetchLater() { return getDelegate().fetchLater(); diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java b/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java index 91ab7c9ed4..ffdbd203db 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java @@ -516,6 +516,11 @@ abstract class AbstractResultQuery extends AbstractQuery imple return fetch().into(handler); } + @Override + public final Map> fetchIntoGroups(Field key, Class type) { + return fetch().intoGroups(key, type); + } + @Override public final FutureResult fetchLater() { ExecutorService executor = newSingleThreadExecutor(); diff --git a/jOOQ/src/main/java/org/jooq/impl/ResultImpl.java b/jOOQ/src/main/java/org/jooq/impl/ResultImpl.java index ef19f69d4e..b886ea5477 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ResultImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ResultImpl.java @@ -57,6 +57,7 @@ import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; +import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import java.util.Map; @@ -1439,6 +1440,25 @@ class ResultImpl implements Result, AttachableInternal { return map; } + @Override + public final Map> intoGroups(Field key, Class type) { + Map> map = new LinkedHashMap>(); + + for (R record : this) { + K keyVal = record.getValue(key); + + List list = map.get(keyVal); + if (list == null) { + list = new LinkedList(); + map.put(keyVal, list); + } + + list.add(record.into(type)); + } + + return map; + } + @Override public final Object[][] intoArray() { int size = size();