/** * Create a new GroupByBuilder for the given key expression * * @param key * @return */ public static <K> GroupByBuilder<K> groupBy(Expression<K> key) { return new GroupByBuilder<K>(key); }
/** * Get the results as a list * * @param expression * @return */ public <V> ResultTransformer<List<V>> list(Expression<V> expression) { final Expression<V> lookup = getLookup(expression); return new GroupByList<K, V>(key, expression) { @Override protected V transform(Group group) { return group.getOne(lookup); } }; }
@Test @ExcludeIn({MYSQL, DERBY}) @NoBatooJPA public void GroupBy() { QAuthor author = QAuthor.author; QBook book = QBook.book; for (int i = 0; i < 10; i++) { Author a = new Author(); a.setName(String.valueOf(i)); save(a); for (int j = 0; j < 2; j++) { Book b = new Book(); b.setTitle(String.valueOf(i)+" "+String.valueOf(j)); b.setAuthor(a); save(b); } } Map<Long, List<Pair<Long, String>>> map = query() .from(author) .join(author.books, book) .transform(GroupBy .groupBy(author.id) .as(GroupBy.list(QPair.create(book.id, book.title)))); for (Entry<Long, List<Pair<Long, String>>> entry : map.entrySet()) { System.out.println("author = " + entry.getKey()); for (Pair<Long,String> pair : entry.getValue()) { System.out.println(" book = " + pair.getFirst() + "," + pair.getSecond()); } } }
@Test @ExcludeIn(DERBY) public void Transform_GroupBy() { QCat kitten = new QCat("kitten"); Map<Integer, Cat> result = query().from(cat).innerJoin(cat.kittens, kitten) .transform(GroupBy.groupBy(cat.id) .as(Projections.constructor(Cat.class, cat.name, cat.id, GroupBy.list(Projections.constructor(Cat.class, kitten.name, kitten.id))))); for (Cat entry : result.values()) { assertEquals(1, entry.getKittens().size()); } }
@Test @ExcludeIn(DERBY) public void Transform_GroupBy2() { QCat kitten = new QCat("kitten"); Map<List<?>, Group> result = query().from(cat).innerJoin(cat.kittens, kitten) .transform(GroupBy.groupBy(cat.id, kitten.id) .as(cat, kitten)); assertFalse(result.isEmpty()); for (Tuple row : query().from(cat).innerJoin(cat.kittens, kitten) .list(cat, kitten)) { assertNotNull(result.get(Arrays.asList(row.get(cat).getId(), row.get(kitten).getId()))); } }
/** * Get the results as a closeable iterator * * @param expression * @return */ public <V> ResultTransformer<CloseableIterator<V>> iterate(Expression<V> expression) { final Expression<V> lookup = getLookup(expression); return new GroupByIterate<K, V>(key, expression) { @Override protected V transform(Group group) { return group.getOne(lookup); } }; }
/** * Create a new GroupByBuilder for the given key expressions * * @param keys * @return */ public static GroupByBuilder<List<?>> groupBy(Expression<?>... keys) { return new GroupByBuilder<List<?>>(new QList(keys)); }
@Test @ExcludeIn(DERBY) public void Transform_GroupBy_Alias() { QCat kitten = new QCat("kitten"); SimplePath<Cat> k = new SimplePath<Cat>(Cat.class, "k"); Map<Integer, Group> result = query().from(cat).innerJoin(cat.kittens, kitten) .transform(GroupBy.groupBy(cat.id) .as(cat.name, cat.id, GroupBy.list(Projections.constructor(Cat.class, kitten.name, kitten.id).as(k)))); for (Group entry : result.values()) { assertNotNull(entry.getOne(cat.id)); assertNotNull(entry.getOne(cat.name)); assertFalse(entry.getList(k).isEmpty()); } }
/** * Get the results as a map * * @param expression * @return */ @SuppressWarnings("unchecked") public <V> ResultTransformer<Map<K, V>> as(Expression<V> expression) { final Expression<V> lookup = getLookup(expression); return new GroupByMap<K, V>(key, expression) { @Override protected Map<K, V> transform(Map<K, Group> groups) { Map<K, V> results = new LinkedHashMap<K, V>((int) Math.ceil(groups.size()/0.75), 0.75f); for (Map.Entry<K, Group> entry : groups.entrySet()) { results.put(entry.getKey(), entry.getValue().getOne(lookup)); } return results; } }; }