From d4db0dbbf1efbeee1eb5b37d4b2bae849a297d5c Mon Sep 17 00:00:00 2001 From: Samppa Saarela Date: Mon, 19 Sep 2011 10:49:58 +0300 Subject: [PATCH] getMap optimization --- .../com/mysema/query/support/GroupBy2.java | 26 ++++++++++--- .../mysema/query/support/GroupBy2Test.java | 38 +++++++++---------- 2 files changed, 40 insertions(+), 24 deletions(-) diff --git a/querydsl-core/src/test/java/com/mysema/query/support/GroupBy2.java b/querydsl-core/src/test/java/com/mysema/query/support/GroupBy2.java index e1395d083..f9b5ec34f 100644 --- a/querydsl-core/src/test/java/com/mysema/query/support/GroupBy2.java +++ b/querydsl-core/src/test/java/com/mysema/query/support/GroupBy2.java @@ -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 implements ResultTransformer> { public List> getArgs() { return Arrays.asList(key, value); } + + public boolean equals(Expression keyExpr, Expression valueExpr) { + return key.equals(keyExpr) && value.equals(valueExpr); + } @Override public Pair newInstance(Object... args) { @@ -283,13 +288,19 @@ public class GroupBy2 implements ResultTransformer> { private class GroupImpl implements Group2 { - private final Map, GroupColumn> groupColumns; + private final Map, GroupColumn> groupColumns = new LinkedHashMap, GroupColumn>(); + + private final List> pairs = new LinkedList>(); public GroupImpl() { - groupColumns = new LinkedHashMap, 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 implements ResultTransformer> { } public Map getMap(Expression key, Expression value) { - return (Map) groupColumns.get(new QPair(key, value)).get(); + for (QPair pair : pairs) { + if (pair.equals(key, value)) { + return (Map) 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]); diff --git a/querydsl-core/src/test/java/com/mysema/query/support/GroupBy2Test.java b/querydsl-core/src/test/java/com/mysema/query/support/GroupBy2Test.java index 57536865e..3c36121e6 100644 --- a/querydsl-core/src/test/java/com/mysema/query/support/GroupBy2Test.java +++ b/querydsl-core/src/test/java/com/mysema/query/support/GroupBy2Test.java @@ -34,6 +34,24 @@ public class GroupBy2Test { private final StringExpression commentText = new StringPath("commentText"); + private final GroupColumnDefinition constant = new AbstractGroupColumnDefinition(commentId) { + + @Override + public GroupColumn createGroupColumn() { + return new GroupColumn() { + + @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 constant = new AbstractGroupColumnDefinition(commentId) { - - @Override - public GroupColumn createGroupColumn() { - return new GroupColumn() { - - @Override - public void add(Object o) { - } - - @Override - public String get() { - return "constant"; - } - }; - } - }; - + public void With_Constant_Column() { Map results = GroupBy2.groupBy(postId).withOne(postName).withGroup(constant).transform(BASIC_RESULTS);