From 45e6356e4e74a306adcf214113b080cb43ac23e2 Mon Sep 17 00:00:00 2001 From: Ivan Dugic Date: Tue, 18 Sep 2012 22:28:03 +0200 Subject: [PATCH] [#1810 Add Map ResultQuery.fetchMap(Field, Class) and Result.intoMap(Field, Class)] --- .../org/jooq/test/_/testcases/FetchTests.java | 41 ++++++++++++++++++- .../src/org/jooq/test/jOOQAbstractTest.java | 9 +++- jOOQ/src/main/java/org/jooq/Result.java | 16 ++++++++ jOOQ/src/main/java/org/jooq/ResultQuery.java | 18 ++++++++ .../jooq/impl/AbstractDelegatingSelect.java | 5 +++ .../org/jooq/impl/AbstractResultQuery.java | 5 +++ .../main/java/org/jooq/impl/ResultImpl.java | 13 ++++++ 7 files changed, 103 insertions(+), 4 deletions(-) diff --git a/jOOQ-test/src/org/jooq/test/_/testcases/FetchTests.java b/jOOQ-test/src/org/jooq/test/_/testcases/FetchTests.java index 35d4aa877c..0c3dbbf9b1 100644 --- a/jOOQ-test/src/org/jooq/test/_/testcases/FetchTests.java +++ b/jOOQ-test/src/org/jooq/test/_/testcases/FetchTests.java @@ -1599,7 +1599,45 @@ extends BaseTest map1 = + create().selectFrom(TBook()) + .orderBy(TBook_ID()) + .fetchMap(TBook_ID(), TBookPojo()); + + assertEquals(4, map1.size()); + assertEquals(BOOK_IDS, new ArrayList(map1.keySet())); + + List> entries = + new ArrayList>(map1.entrySet()); + + for (int i = 0; i < map1.size(); i++) { + Entry entry = entries.get(i); + + assertEquals(BOOK_IDS.get(i), on(entry.getValue()).call("getId").get()); + assertEquals(BOOK_AUTHOR_IDS.get(i), on(entry.getValue()).call("getAuthorId").get()); + assertEquals(BOOK_TITLES.get(i), on(entry.getValue()).call("getTitle").get()); + } + + try { + // Group by BOOK.AUTHOR_ID + create().selectFrom(TBook()).orderBy(TBook_ID()).fetchMap(TBook_AUTHOR_ID(), TBookPojo()); + + fail("Fetching map with the non-unique key - InvalidResultException not thrown."); + } + catch (Throwable t) { + assertEquals(InvalidResultException.class, t.getClass()); + } + } + + @Test + public void testFetchGroupsPOJO() throws Exception { if (TBookPojo() == null) { log.info("SKIPPING", "Generated POJO tests"); return; @@ -1656,5 +1694,4 @@ extends BaseTest extends FieldProvider, List, Attach */ Map, R> intoMap(Field[] keys); + /** + * Return a {@link Map} with results grouped by the given key and mapped + * into the given entity type. + *

+ * An {@link InvalidResultException} is thrown, if the key is non-unique in + * the result set. Use {@link #intoGroups(Field, Class)} instead, if your + * key is non-unique. + * + * @param key The key. Client code must assure that key is unique in the + * result set. + * @return A Map containing the result. + * @throws InvalidResultException if the key is non-unique in the result + * set. + */ + Map intoMap(Field key, Class type) throws MappingException; + /** * Return a {@link Map} with one of the result's columns as key and a list * of corresponding records as value. diff --git a/jOOQ/src/main/java/org/jooq/ResultQuery.java b/jOOQ/src/main/java/org/jooq/ResultQuery.java index 6f9ebcb7bb..cc5e278d4f 100644 --- a/jOOQ/src/main/java/org/jooq/ResultQuery.java +++ b/jOOQ/src/main/java/org/jooq/ResultQuery.java @@ -519,6 +519,24 @@ public interface ResultQuery extends Query { */ Map, R> fetchMap(Field[] keys) throws DataAccessException; + /** + * Execute the query and return a {@link Map} with results grouped by the + * given key and mapped into the given entity type. + *

+ * An exception is thrown, if the key turn out to be non-unique in the + * result set. Use {@link #fetchGroups(Field, Class)} instead, if your key + * is non-unique. + * + * @param key The key. Client code must assure that key is unique in the + * result set. + * @return A Map containing the result. + * @throws DataAccessException if something went wrong executing the query + * @throws InvalidResultException if the key is non-unique in the result + * set. + * @see Result#intoMap(Field, Class) + */ + Map fetchMap(Field key, Class type) throws DataAccessException; + /** * Execute the query and return a {@link Map} with one of the result's * columns as key and a list of corresponding records as value. diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractDelegatingSelect.java b/jOOQ/src/main/java/org/jooq/impl/AbstractDelegatingSelect.java index 1875f1d907..a7cbc54f4d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractDelegatingSelect.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractDelegatingSelect.java @@ -238,6 +238,11 @@ abstract class AbstractDelegatingSelect return getDelegate().fetchMap(keys); } + @Override + public final Map fetchMap(Field key, Class type) { + return getDelegate().fetchMap(key, type); + } + @Override public final List> fetchMaps() { return getDelegate().fetchMaps(); diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java b/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java index d698c241b3..00475f3653 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java @@ -421,6 +421,11 @@ abstract class AbstractResultQuery extends AbstractQuery imple return fetch().intoMap(keys); } + @Override + public final Map fetchMap(Field key, Class type) { + return fetch().intoMap(key, type); + } + @Override public final List> fetchMaps() { return fetch().intoMaps(); diff --git a/jOOQ/src/main/java/org/jooq/impl/ResultImpl.java b/jOOQ/src/main/java/org/jooq/impl/ResultImpl.java index 5f5e556bce..6299ce7ff1 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ResultImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ResultImpl.java @@ -1413,6 +1413,19 @@ class ResultImpl implements Result, AttachableInternal { return map; } + @Override + public final Map intoMap(Field key, Class type) { + Map map = new LinkedHashMap(); + + for (R record : this) { + if (map.put(record.getValue(key), record.into(type)) != null) { + throw new InvalidResultException("Key " + key + " is not unique in Result for " + this); + } + } + + return map; + } + @Override public final Map> intoGroups(Field key) { Map> map = new LinkedHashMap>();