getMap optimization

This commit is contained in:
Samppa Saarela 2011-09-19 10:49:58 +03:00
parent 8114b3a51a
commit d4db0dbbf1
2 changed files with 40 additions and 24 deletions

View File

@ -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]);

View File

@ -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);