/** * Get the results as a map * * @param expressions * @return */ public ResultTransformer<Map<K, Group>> as(Expression<?>... expressions) { return new GroupByMap<K, Group>(key, expressions); }
@Override public Map<K, V> transform(Projectable projectable) { Map<K, Group> groups = new LinkedHashMap<K, Group>(); // create groups FactoryExpression<Tuple> expr = FactoryExpressionUtils.wrap(new QTuple(expressions)); boolean hasGroups = false; for (Expression<?> e : expr.getArgs()) { hasGroups |= e instanceof GroupExpression; } if (hasGroups) { expr = withoutGroupExpressions(expr); } CloseableIterator<Tuple> iter = projectable.iterate(expr); try { while (iter.hasNext()) { Object[] row = iter.next().toArray(); K groupId = (K) row[0]; GroupImpl group = (GroupImpl)groups.get(groupId); if (group == null) { group = new GroupImpl(groupExpressions, maps); groups.put(groupId, group); } group.add(row); } } finally { iter.close(); } // transform groups return transform(groups); }
/** * 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; } }; }
/** * Get the results as a map * * @param expression * @return */ public <V> ResultTransformer<Map<K, V>> as(FactoryExpression<V> expression) { final FactoryExpression<?> transformation = FactoryExpressionUtils.wrap(expression); List<Expression<?>> args = transformation.getArgs(); return new GroupByMap<K, V>(key, args.toArray(new Expression<?>[args.size()])) { @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(), transform(entry.getValue())); } return results; } @SuppressWarnings("unchecked") protected V transform(Group group) { // XXX Isn't group.toArray() suitable here? List<Object> args = new ArrayList<Object>(groupExpressions.size() - 1); for (int i = 1; i < groupExpressions.size(); i++) { args.add(group.getGroup(groupExpressions.get(i))); } return (V)transformation.newInstance(args.toArray()); } }; }