The resource type is taking into account when grouping.
This commit is contained in:
parent
7520dad3ff
commit
568acf930b
2 changed files with 89 additions and 18 deletions
|
|
@ -30,7 +30,10 @@ import java.util.Set;
|
|||
import java.util.Map.Entry;
|
||||
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.commons.lang.builder.EqualsBuilder;
|
||||
import org.apache.commons.lang.builder.HashCodeBuilder;
|
||||
import org.navalplanner.business.resources.entities.Criterion;
|
||||
import org.navalplanner.business.resources.entities.ResourceEnum;
|
||||
|
||||
/**
|
||||
* A collection of HoursGroup with the same name required <br />
|
||||
|
|
@ -38,6 +41,54 @@ import org.navalplanner.business.resources.entities.Criterion;
|
|||
*/
|
||||
public class AggregatedHoursGroup {
|
||||
|
||||
private static class GroupingCriteria {
|
||||
|
||||
private static Map<GroupingCriteria, List<HoursGroup>> byCriterions(
|
||||
Collection<? extends HoursGroup> hours) {
|
||||
Map<GroupingCriteria, List<HoursGroup>> result = new HashMap<GroupingCriteria, List<HoursGroup>>();
|
||||
for (HoursGroup each : hours) {
|
||||
GroupingCriteria key = asGroupingCriteria(each);
|
||||
if (!result.containsKey(key)) {
|
||||
result.put(key,
|
||||
new ArrayList<HoursGroup>());
|
||||
}
|
||||
result.get(key).add(each);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private static GroupingCriteria asGroupingCriteria(HoursGroup hoursGroup) {
|
||||
return new GroupingCriteria(hoursGroup.getResourceType(),
|
||||
hoursGroup.getValidCriterions());
|
||||
}
|
||||
|
||||
private final ResourceEnum type;
|
||||
|
||||
private final Set<Criterion> criterions;
|
||||
|
||||
private GroupingCriteria(ResourceEnum type, Set<Criterion> criterions) {
|
||||
this.type = type;
|
||||
this.criterions = criterions;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return new HashCodeBuilder().append(type).append(criterions)
|
||||
.toHashCode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (obj instanceof GroupingCriteria) {
|
||||
GroupingCriteria other = (GroupingCriteria) obj;
|
||||
return new EqualsBuilder().append(type, other.type).append(
|
||||
criterions,
|
||||
other.criterions).isEquals();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static List<AggregatedHoursGroup> aggregate(HoursGroup... hours) {
|
||||
return aggregate(Arrays.asList(hours));
|
||||
}
|
||||
|
|
@ -45,7 +96,8 @@ public class AggregatedHoursGroup {
|
|||
public static List<AggregatedHoursGroup> aggregate(
|
||||
Collection<? extends HoursGroup> hours) {
|
||||
List<AggregatedHoursGroup> result = new ArrayList<AggregatedHoursGroup>();
|
||||
for (Entry<Set<Criterion>, List<HoursGroup>> entry : byCriterions(hours)
|
||||
for (Entry<GroupingCriteria, List<HoursGroup>> entry : GroupingCriteria
|
||||
.byCriterions(hours)
|
||||
.entrySet()) {
|
||||
result.add(new AggregatedHoursGroup(entry.getKey(), entry
|
||||
.getValue()));
|
||||
|
|
@ -61,27 +113,19 @@ public class AggregatedHoursGroup {
|
|||
return result;
|
||||
}
|
||||
|
||||
private static Map<Set<Criterion>, List<HoursGroup>> byCriterions(
|
||||
Collection<? extends HoursGroup> hours) {
|
||||
Map<Set<Criterion>, List<HoursGroup>> result = new HashMap<Set<Criterion>, List<HoursGroup>>();
|
||||
for (HoursGroup each : hours) {
|
||||
if (!result.containsKey(each.getValidCriterions())) {
|
||||
result.put(each.getValidCriterions(),
|
||||
new ArrayList<HoursGroup>());
|
||||
}
|
||||
result.get(each.getValidCriterions()).add(each);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private final Set<Criterion> criterions;
|
||||
|
||||
private final List<HoursGroup> hoursGroup;
|
||||
|
||||
private AggregatedHoursGroup(Set<Criterion> criterions,
|
||||
private ResourceEnum resourceType;
|
||||
|
||||
|
||||
private AggregatedHoursGroup(GroupingCriteria groupingCriteria,
|
||||
List<HoursGroup> hours) {
|
||||
this.criterions = Collections.unmodifiableSet(criterions);
|
||||
this.criterions = Collections
|
||||
.unmodifiableSet(groupingCriteria.criterions);
|
||||
this.hoursGroup = Collections.unmodifiableList(hours);
|
||||
this.resourceType = groupingCriteria.type;
|
||||
}
|
||||
|
||||
public Set<Criterion> getCriterions() {
|
||||
|
|
@ -92,6 +136,10 @@ public class AggregatedHoursGroup {
|
|||
return hoursGroup;
|
||||
}
|
||||
|
||||
public ResourceEnum getResourceType() {
|
||||
return resourceType;
|
||||
}
|
||||
|
||||
public int getHours() {
|
||||
int result = 0;
|
||||
for (HoursGroup each : hoursGroup) {
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@ import org.navalplanner.business.orders.entities.HoursGroup;
|
|||
import org.navalplanner.business.requirements.entities.CriterionRequirement;
|
||||
import org.navalplanner.business.requirements.entities.DirectCriterionRequirement;
|
||||
import org.navalplanner.business.resources.entities.Criterion;
|
||||
import org.navalplanner.business.resources.entities.ResourceEnum;
|
||||
|
||||
/**
|
||||
* @author Óscar González Fernández <ogonzalez@igalia.com>
|
||||
|
|
@ -95,6 +96,23 @@ public class AggregatedHoursGroupTest {
|
|||
assertThat(AggregatedHoursGroup.sum(list), equalTo(15));
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("unchecked")
|
||||
public void theResourceTypeIsTakingIntoAccountWhenGrouping() {
|
||||
HoursGroup h1 = createHoursGroupWithCriterions(ResourceEnum.MACHINE, criterion1,
|
||||
criterion2);
|
||||
h1.setWorkingHours(10);
|
||||
HoursGroup h2 = createHoursGroupWithCriterions(ResourceEnum.WORKER,
|
||||
criterion1, criterion2);
|
||||
h1.setWorkingHours(5);
|
||||
List<AggregatedHoursGroup> aggregate = AggregatedHoursGroup.aggregate(h1,h2);
|
||||
assertThat(aggregate.size(), equalTo(2));
|
||||
assertThat(aggregate, hasItem(allOf(withCriterions(criterion1,
|
||||
criterion2), withHours(h1))));
|
||||
assertThat(aggregate, hasItem(allOf(withCriterions(criterion1,
|
||||
criterion2), withHours(h2))));
|
||||
}
|
||||
|
||||
private static abstract class AggregatedHoursGroupMatcher extends
|
||||
BaseMatcher<AggregatedHoursGroup> {
|
||||
|
||||
|
|
@ -149,9 +167,14 @@ public class AggregatedHoursGroupTest {
|
|||
}
|
||||
|
||||
private HoursGroup createHoursGroupWithCriterions(Criterion... criterions) {
|
||||
return createHoursGroupWithCriterions(ResourceEnum.WORKER, criterions);
|
||||
}
|
||||
|
||||
private HoursGroup createHoursGroupWithCriterions(
|
||||
ResourceEnum resourceType, Criterion... criterions) {
|
||||
HoursGroup result = new HoursGroup();
|
||||
result
|
||||
.setCriterionRequirements(asCriterionRequirements(criterions));
|
||||
result.setCriterionRequirements(asCriterionRequirements(criterions));
|
||||
result.setResourceType(resourceType);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue