mirror of
https://github.com/querydsl/querydsl.git
synced 2026-07-03 21:07:49 +08:00
getMap optimization
This commit is contained in:
parent
8114b3a51a
commit
d4db0dbbf1
@ -10,6 +10,7 @@ import java.util.Arrays;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
@ -61,6 +62,10 @@ public class GroupBy2<S> implements ResultTransformer<Map<S, Group2>> {
|
||||
public List<Expression<?>> getArgs() {
|
||||
return Arrays.asList(key, value);
|
||||
}
|
||||
|
||||
public boolean equals(Expression<?> keyExpr, Expression<?> valueExpr) {
|
||||
return key.equals(keyExpr) && value.equals(valueExpr);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Pair<K, V> newInstance(Object... args) {
|
||||
@ -283,13 +288,19 @@ public class GroupBy2<S> implements ResultTransformer<Map<S, Group2>> {
|
||||
|
||||
private class GroupImpl implements Group2 {
|
||||
|
||||
private final Map<Expression<?>, GroupColumn<?>> groupColumns;
|
||||
private final Map<Expression<?>, GroupColumn<?>> groupColumns = new LinkedHashMap<Expression<?>, GroupColumn<?>>();
|
||||
|
||||
private final List<QPair<?, ?>> pairs = new LinkedList<GroupBy2.QPair<?,?>>();
|
||||
|
||||
public GroupImpl() {
|
||||
groupColumns = new LinkedHashMap<Expression<?>, GroupColumn<?>>();
|
||||
for (int i=0; i < columns.size(); i++) {
|
||||
GroupColumnDefinition<?, ?> coldef = columns.get(i);
|
||||
groupColumns.put(coldef.getExpression(), coldef.createGroupColumn());
|
||||
Expression<?> expr = coldef.getExpression();
|
||||
groupColumns.put(expr, coldef.createGroupColumn());
|
||||
// Optimized map access
|
||||
if (expr instanceof QPair) {
|
||||
pairs.add((QPair<?, ?>) expr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -321,10 +332,15 @@ public class GroupBy2<S> implements ResultTransformer<Map<S, Group2>> {
|
||||
}
|
||||
|
||||
public <K, V> Map<K, V> getMap(Expression<K> key, Expression<V> value) {
|
||||
return (Map<K, V>) groupColumns.get(new QPair<K, V>(key, value)).get();
|
||||
for (QPair<?, ?> pair : pairs) {
|
||||
if (pair.equals(key, value)) {
|
||||
return (Map<K, V>) groupColumns.get(pair).get();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void add(Object[] row) {
|
||||
void add(Object[] row) {
|
||||
int i=0;
|
||||
for (GroupColumn<?> groupColumn : groupColumns.values()) {
|
||||
groupColumn.add(row[i]);
|
||||
|
||||
@ -34,6 +34,24 @@ public class GroupBy2Test {
|
||||
|
||||
private final StringExpression commentText = new StringPath("commentText");
|
||||
|
||||
private final GroupColumnDefinition<Integer, String> constant = new AbstractGroupColumnDefinition<Integer, String>(commentId) {
|
||||
|
||||
@Override
|
||||
public GroupColumn<String> createGroupColumn() {
|
||||
return new GroupColumn<String>() {
|
||||
|
||||
@Override
|
||||
public void add(Object o) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public String get() {
|
||||
return "constant";
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
static class PostWithComments {
|
||||
public Integer id;
|
||||
public String name;
|
||||
@ -91,25 +109,7 @@ public class GroupBy2Test {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void Custom_GroupColumnDefinition() {
|
||||
GroupColumnDefinition<Integer, String> constant = new AbstractGroupColumnDefinition<Integer, String>(commentId) {
|
||||
|
||||
@Override
|
||||
public GroupColumn<String> createGroupColumn() {
|
||||
return new GroupColumn<String>() {
|
||||
|
||||
@Override
|
||||
public void add(Object o) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public String get() {
|
||||
return "constant";
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
public void With_Constant_Column() {
|
||||
Map<Integer, Group2> results =
|
||||
GroupBy2.groupBy(postId).withOne(postName).withGroup(constant).transform(BASIC_RESULTS);
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user