Skip to content

Commit

Permalink
WorkItem: 3453 Task Related Metrics.
Browse files Browse the repository at this point in the history
  • Loading branch information
Braden Simpson authored and lekksi committed Jan 19, 2012
1 parent f49b502 commit 733409f
Show file tree
Hide file tree
Showing 8 changed files with 44 additions and 13 deletions.
Expand Up @@ -291,7 +291,7 @@ public IterationMetrics getIterationMetrics(Iteration iteration) {

// 3. Tasks done and Total
Pair<Integer, Integer> pairTasks = iterationDAO
.getCountOfDoneAndAllTasks(iteration);
.getCountOfDoneAndNonDeferred(iteration);
metrics.setTotalTasks(pairTasks.second);
metrics.setCompletedTasks(pairTasks.first);

Expand Down
2 changes: 2 additions & 0 deletions src/fi/hut/soberit/agilefant/db/IterationDAO.java
Expand Up @@ -26,6 +26,8 @@ public interface IterationDAO extends GenericDAO<Iteration> {

public Pair<Integer, Integer> getCountOfDoneAndAllTasks(Iteration iteration);

public Pair<Integer, Integer> getCountOfDoneAndNonDeferred(Iteration iteration);

public Pair<Integer, Integer> getCountOfDoneAndAllStories(
Iteration iteration);

Expand Down
Expand Up @@ -20,6 +20,7 @@
import fi.hut.soberit.agilefant.model.StoryHourEntry;
import fi.hut.soberit.agilefant.model.TaskHourEntry;
import fi.hut.soberit.agilefant.model.User;
import fi.hut.soberit.agilefant.model.TaskState;

@Repository("hourEntryDAO")
public class HourEntryDAOHibernate extends GenericDAOHibernate<HourEntry>
Expand Down Expand Up @@ -47,8 +48,8 @@ private long calculateHourSum(boolean task, int storyId) {
crit.setProjection(Projections.sum("minutesSpent"));
if(task)
crit = crit.createCriteria("task");
crit.createCriteria("story").add(
Restrictions.idEq(storyId));
crit = crit.createCriteria("story").add(Restrictions.idEq(storyId)).add(
Restrictions.ne("state", TaskState.DEFERRED));
Long result = (Long) crit.uniqueResult();

if (result == null)
Expand Down
Expand Up @@ -97,6 +97,25 @@ public Map<StoryState, Integer> countIterationStoriesByState(int iterationId) {
return results;
}

private Pair<Integer, Integer> getGenericCountDoneNonDeferred(Class<?> type,
Collection<String> joins, Iteration iteration) {
Criteria criteria = getCurrentSession().createCriteria(type);
criteria.setProjection(Projections.projectionList().add(
Projections.property("state")).add(Projections.rowCount(),
"taskCount").add(Projections.groupProperty("state"), "state"));
criteria = addIterationRestriction(criteria, joins, iteration);

List<Object[]> results = asList(criteria);
int total = 0;
int done = 0;
for (Object[] row : results) {
Long count = (Long) row[1];
total += (row[0].equals(TaskState.DEFERRED)) ? 0 : count;
done += (row[0].equals(TaskState.DONE)) ? count : 0;
}
return Pair.create(done, total);
}

private Pair<Integer, Integer> getCounOfDoneAndAll(Class<?> type,
Object doneValue, Collection<String> joins, Iteration iteration) {
Criteria criteria = getCurrentSession().createCriteria(type);
Expand Down Expand Up @@ -128,7 +147,16 @@ public Pair<Integer, Integer> getCountOfDoneAndAllTasks(Iteration iteration) {
return Pair.create(noStory.first + inStory.first, noStory.second
+ inStory.second);
}


public Pair<Integer, Integer> getCountOfDoneAndNonDeferred(Iteration iteration) {
Pair<Integer, Integer> noStory = getGenericCountDoneNonDeferred(Task.class,
Arrays.asList("iteration"), iteration);
Pair<Integer, Integer> inStory = getGenericCountDoneNonDeferred(Task.class,
Arrays.asList("story", "backlog"), iteration);
return Pair.create(noStory.first + inStory.first, noStory.second
+ inStory.second);
}

public Pair<Integer, Integer> getCountOfDoneAndAllStories(
Iteration iteration) {
return getCounOfDoneAndAll(Story.class, StoryState.DONE, Arrays
Expand Down Expand Up @@ -219,6 +247,7 @@ public Map<Integer, StoryMetrics> calculateIterationDirectStoryMetrics(

Criteria taskMetrics = this.getCurrentSession().createCriteria(
Task.class);
taskMetrics.add(Restrictions.ne("state", TaskState.DEFERRED));
taskMetrics.createCriteria("story", "story").add(
Restrictions.eq("backlog", iteration));
ProjectionList taskSums = Projections.projectionList();
Expand Down
Expand Up @@ -10,6 +10,7 @@
import org.joda.time.LocalDate;
import org.springframework.stereotype.Repository;

import fi.hut.soberit.agilefant.model.TaskState;
import fi.hut.soberit.agilefant.db.IterationHistoryEntryDAO;
import fi.hut.soberit.agilefant.model.ExactEstimate;
import fi.hut.soberit.agilefant.model.IterationHistoryEntry;
Expand Down Expand Up @@ -66,10 +67,7 @@ private Pair<ExactEstimate, ExactEstimate> extractPairSum(
private Pair<ExactEstimate, ExactEstimate> calculateCurrentHistoryData_tasksWithoutStory(int iterationId) {
Criteria crit = getCurrentSession().createCriteria(Task.class);
crit.add(Restrictions.eq("iteration.id", iterationId));

//TODO JB - change this to deferred
crit.add(Restrictions.ne("state", TaskState.BLOCKED));

crit.add(Restrictions.ne("state", TaskState.DEFERRED));
crit.setProjection(Projections.projectionList().add(
Projections.sum("effortLeft")).add(
Projections.sum("originalEstimate")));
Expand All @@ -87,7 +85,7 @@ private Pair<ExactEstimate, ExactEstimate> calculateCurrentHistoryData_tasksInsi
crit.setProjection(Projections.projectionList().add(
Projections.sum("effortLeft")).add(
Projections.sum("originalEstimate")));

crit.add(Restrictions.ne("state", TaskState.DEFERRED));
crit = crit.createCriteria("story");

crit.setFetchMode("story", FetchMode.SELECT);
Expand Down
Expand Up @@ -26,6 +26,7 @@
import fi.hut.soberit.agilefant.model.Task;
import fi.hut.soberit.agilefant.model.User;
import fi.hut.soberit.agilefant.util.StoryMetrics;
import fi.hut.soberit.agilefant.model.TaskState;

@Repository("storyDAO")
public class StoryDAOHibernate extends GenericDAOHibernate<Story> implements
Expand All @@ -43,7 +44,8 @@ public StoryMetrics calculateMetrics(int storyId) {
.add(Projections.sum("originalEstimate"), "originalEstimateSum")
.add(Projections.sum("effortLeft"), "effortLeftSum")
);
criteria.add(Restrictions.eq("story.id", storyId));
criteria.add(Restrictions.eq("story.id", storyId));
criteria.add(Restrictions.ne("state", TaskState.DEFERRED));
Object[] result = (Object[])criteria.uniqueResult();
if (result[0] != null) {
metrics.setOriginalEstimate((Long)result[0]);
Expand Down
4 changes: 2 additions & 2 deletions src/fi/hut/soberit/agilefant/model/TaskState.java
Expand Up @@ -11,8 +11,8 @@ public enum TaskState {
@XmlEnumValue("PENDING") PENDING,
@XmlEnumValue("BLOCKED") BLOCKED,
@XmlEnumValue("IMPLEMENTED") IMPLEMENTED,
@XmlEnumValue("DONE") DONE;

@XmlEnumValue("DONE") DONE,
@XmlEnumValue("DEFERRED") DEFERRED;

public int getOrdinal() {
return this.ordinal();
Expand Down
Expand Up @@ -83,7 +83,6 @@ public void setTotalTasks(Integer totalTasks) {
public Integer getTotalTasks() {
return totalTasks;
}

public void setCompletedStories(Integer completedStories) {
this.completedStories = completedStories;
}
Expand Down

0 comments on commit 733409f

Please sign in to comment.