Skip to content
This repository has been archived by the owner on Aug 1, 2024. It is now read-only.

Commit

Permalink
Now supporting Object as @group return value.
Browse files Browse the repository at this point in the history
  • Loading branch information
Marc Petersen committed Nov 14, 2012
1 parent e22dd7d commit b41680f
Show file tree
Hide file tree
Showing 5 changed files with 95 additions and 41 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,20 +29,16 @@
*/
public final class AggregationLine<E extends Serializable> extends Line {

private String displayName;
private Object groupingObject;
private List<ValueLine<E>> valueLines;
private Map<String, BigDecimal> values;

public AggregationLine(String aDisplayName) {
displayName = aDisplayName;
public AggregationLine(Object aGroupingObject) {
groupingObject = aGroupingObject;
valueLines = new ArrayList<ValueLine<E>>();
values = new HashMap<String, BigDecimal>();
}

public String getDisplayName() {
return displayName;
}

public List<ValueLine<E>> getValueLines() {
return valueLines;
}
Expand All @@ -68,6 +64,14 @@ public BigDecimal getValue(String key) {
return values.get(key);
}

public Object getGroupingObject() {
return groupingObject;
}

public String getDisplayName() {
return getGroupingObject().toString();
}

@Override
public boolean isExpanded() {
return expanded;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
* An AggregationValue is used to annotate a method which returns a value for aggregation within a group.
* Note: ATM the annotated method should return a BigDecimal.
*
* @author Marc Petersen - open knowledge GmbH
*/
@Retention(RUNTIME)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
* The annotated method is also allowed to return Object, but should then implement equals correctly.
*
* @author Marc Petersen - open knowledge GmbH
*/
@Retention(RUNTIME)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ protected void initGroupedLines() {
}

protected Map putOrAddValueLine(Map map, Object key, ValueLine<E> currentLine) {
AggregationLine line = map.containsKey(key) ? (AggregationLine) map.get(key) : new AggregationLine(key.toString());
AggregationLine line = map.containsKey(key) ? (AggregationLine) map.get(key) : new AggregationLine(key);
line.setExpanded(expandByDefault);
line.addValueLine(currentLine, getAggregationValueMethods());
map.put(key, line);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,77 +20,122 @@
import org.junit.Test;

import java.io.Serializable;
import java.math.BigDecimal;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;

/**
* @author Marc Petersen - open knowledge GmbH
*/
public class GroupingManagerTest {

List<Foo> foos;
List<PersonTracker> personTrackers;

@Before
public void init() {
foos = new ArrayList<Foo>();

foos.add(new Foo("Marc", "Today"));
foos.add(new Foo("Marc", "Tomorrow"));
foos.add(new Foo("Jens", "Today"));
foos.add(new Foo("Jens", "Yesterday"));
foos.add(new Foo("Bartug", "Yesterday"));
foos.add(new Foo("Bartug", "Tomorrow"));
public void init() throws MalformedURLException {
personTrackers = new ArrayList<PersonTracker>();

personTrackers.add(new PersonTracker("Marc", "Today", new BigDecimal(1), new URL("http://foo.de/")));
personTrackers.add(new PersonTracker("Marc", "Tomorrow", new BigDecimal(2), new URL("http://foo.de/")));
personTrackers.add(new PersonTracker("Jens", "Today", new BigDecimal(3), new URL("http://bar.de/")));
personTrackers.add(new PersonTracker("Jens", "Yesterday", new BigDecimal(4), new URL("http://foo.de/")));
personTrackers.add(new PersonTracker("Bartug", "Yesterday", new BigDecimal(5), new URL("http://bar.de/")));
personTrackers.add(new PersonTracker("Bartug", "Tomorrow", new BigDecimal(6), new URL("http://foo.de/")));
}

@Test
public void groupingMetaDataTest() {
GroupingManager<Foo> manager = new GroupingManager<Foo>(foos, Foo.class);
GroupingManager<PersonTracker> manager = new GroupingManager<PersonTracker>(personTrackers, PersonTracker.class);
List<GroupingMetaData> metaData = manager.getGroupingMetaData();

assertThat(metaData.get(0).getOrder(), is(100));
assertThat(metaData.get(1).getOrder(), is(200));
}

@Test
public void groupByTest() {
GroupingManager<Foo> manager = new GroupingManager<Foo>(foos, Foo.class);
manager.groupBy("Bar");
public void groupByStringTest() {
GroupingManager<PersonTracker> manager = new GroupingManager<PersonTracker>(personTrackers, PersonTracker.class);
manager.groupBy("Name");

assertThat(((AggregationLine<Foo>)manager.getGroupedLines().get(0)).getDisplayName(), is("Bartug"));
assertThat(((AggregationLine<Foo>)manager.getGroupedLines().get(1)).getDisplayName(), is("Jens"));
assertThat(((AggregationLine<Foo>)manager.getGroupedLines().get(2)).getDisplayName(), is("Marc"));
assertThat(((AggregationLine<PersonTracker>)manager.getGroupedLines().get(0)).getDisplayName(), is("Bartug"));
assertThat(((AggregationLine<PersonTracker>)manager.getGroupedLines().get(1)).getDisplayName(), is("Jens"));
assertThat(((AggregationLine<PersonTracker>)manager.getGroupedLines().get(2)).getDisplayName(), is("Marc"));
}

@Test
public void groupByObjectTest() throws MalformedURLException {
GroupingManager<PersonTracker> manager = new GroupingManager<PersonTracker>(personTrackers, PersonTracker.class);
manager.groupBy("ProfileLink");

assertEquals(((AggregationLine<PersonTracker>)manager.getGroupedLines().get(0)).getGroupingObject(), new URL("http://bar.de/"));
assertEquals(((AggregationLine<PersonTracker>)manager.getGroupedLines().get(1)).getGroupingObject(), new URL("http://foo.de/"));
}

@Test
public void initGroupTest() throws Exception {
GroupingManager<Foo> manager = new GroupingManager<Foo>(foos, Foo.class);
GroupingManager<PersonTracker> manager = new GroupingManager<PersonTracker>(personTrackers, PersonTracker.class);

assertThat(((ValueLine<PersonTracker>)manager.getGroupedLines().get(0)).getObject().getName(), is("Marc"));
assertThat(((ValueLine<PersonTracker>)manager.getGroupedLines().get(4)).getObject().getName(), is("Bartug"));
assertThat(((ValueLine<PersonTracker>) manager.getGroupedLines().get(5)).getObject().getName(), is("Bartug"));
}

@Test
public void aggregatedValueTest() {
GroupingManager<PersonTracker> manager = new GroupingManager<PersonTracker>(personTrackers, PersonTracker.class);
manager.groupBy("Name");

assertThat(((ValueLine<Foo>)manager.getGroupedLines().get(0)).getObject().getBar(), is("Marc"));
assertThat(((ValueLine<Foo>)manager.getGroupedLines().get(4)).getObject().getBar(), is("Bartug"));
assertThat(((ValueLine<Foo>) manager.getGroupedLines().get(5)).getObject().getBar(), is("Bartug"));
assertEquals(((AggregationLine<PersonTracker>) manager.getGroupedLines().get(0)).getValue("getAge"), new BigDecimal(11));
assertEquals(((AggregationLine<PersonTracker>) manager.getGroupedLines().get(1)).getValue("getAge"), new BigDecimal(7));
assertEquals(((AggregationLine<PersonTracker>) manager.getGroupedLines().get(2)).getValue("getAge"), new BigDecimal(3));
}

public class Foo implements Serializable {
public class PersonTracker implements Serializable {

private String bar;
private String yadda;
private String name;
private String lastSeen;
private URL url;
private BigDecimal age;

public PersonTracker(String aName, String aLastSeen) {
name = aName;
lastSeen = aLastSeen;
}

public PersonTracker(String aName, String aLastSeen, BigDecimal aAge) {
this(aName, aLastSeen);
age = aAge;
}

public PersonTracker(String aName, String aLastSeen, BigDecimal aAge, URL aUrl) {
this(aName, aLastSeen, aAge);
url = aUrl;
}

@Group(order = 100, displayName = "Name")
public String getName() {
return name;
}

public Foo(String aBar, String aYadda) {
bar = aBar;
yadda = aYadda;
@Group(order = 200, displayName = "LastSeen")
public String getLastSeen() {
return lastSeen;
}

@Group(order = 100, displayName = "Bar")
public String getBar() {
return bar;
@Group(order = 200, displayName = "ProfileLink")
public URL getUrl() {
return url;
}

@Group(order = 200, displayName = "Yadda")
public String getYadda() {
return yadda;
@AggregrationValue
public BigDecimal getAge() {
return age;
}
}
}

0 comments on commit b41680f

Please sign in to comment.