Skip to content

Commit

Permalink
WorkItem: 4860 Fixing timesheets and missing spent efforts on stories
Browse files Browse the repository at this point in the history
We went through places where stories were joined to backlog and changed
them to use iteration instead when it was trying to compare things to
iteration.

Signed-off-by: Petteri Räty <petsku@petteriraty.eu>
  • Loading branch information
lekksi authored and betelgeuse committed Mar 29, 2012
1 parent be57893 commit 27141d2
Show file tree
Hide file tree
Showing 9 changed files with 80 additions and 89 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ INSERT INTO backlogs (id, parent_id, backlogtype, name) VALUES (6, 3, 'Iteration
INSERT INTO users (id, enabled, recentItemsNumberOfWeeks) VALUES (1, true, 1);
INSERT INTO users (id, enabled, recentItemsNumberOfWeeks) VALUES (2, true, 1);

INSERT INTO stories (id, backlog_id, name, state) VALUES (1, 5, 'Story 1', 0);
INSERT INTO stories (id, backlog_id, name, state) VALUES (2, 5, 'Story 2', 0);
INSERT INTO stories (id, backlog_id, name, state) VALUES (3, 5, 'Story 3', 0);
INSERT INTO stories (id, backlog_id, iteration_id, name, state) VALUES (1, 3, 5, 'Story 1', 0);
INSERT INTO stories (id, backlog_id, iteration_id, name, state) VALUES (2, 3, 5, 'Story 2', 0);
INSERT INTO stories (id, backlog_id, iteration_id, name, state) VALUES (3, 3, 5, 'Story 3', 0);

INSERT INTO stories (id, backlog_id, name, state) VALUES (4, 1, 'Story 4', 0);
INSERT INTO stories (id, backlog_id, name, state) VALUES (5, 1, 'Story 5', 0);
Expand Down
36 changes: 18 additions & 18 deletions conf/test/fi/hut/soberit/agilefant/db/IterationDAOTest-data.sql
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,25 @@ INSERT INTO backlogs (id, backlogtype, name, startDate, endDate) VALUES (3, 'Ite
INSERT INTO backlogs (id, backlogtype, name, backlogSize, startDate, endDate) VALUES (4, 'Iteration', 'Iteration 4', 400, '2009-05-20 10:15:00', '2009-07-01 10:15:00');

INSERT INTO users (id, enabled, recentItemsNumberOfWeeks) VALUES (1, true, 1);
INSERT INTO stories (id, backlog_id, name, storypoints, state) VALUES (1, 1, 'Story 1', 10, 0);
INSERT INTO stories (id, backlog_id, name, storypoints, state) VALUES (2, 1, 'Story 2', 5, 5);
INSERT INTO stories (id, backlog_id, name, storypoints, state) VALUES (3, 2, 'Story 3', 5, 0);
INSERT INTO stories (id, iteration_id, name, storypoints, state) VALUES (1, 1, 'Story 1', 10, 0);
INSERT INTO stories (id, iteration_id, name, storypoints, state) VALUES (2, 1, 'Story 2', 5, 5);
INSERT INTO stories (id, iteration_id, name, storypoints, state) VALUES (3, 2, 'Story 3', 5, 0);

INSERT INTO stories (id, backlog_id, name, storypoints, state) VALUES (4, 3, 'Story 3', 5, 1);
INSERT INTO stories (id, backlog_id, name, storypoints, state) VALUES (5, 3, 'Story 4', 5, 2);
INSERT INTO stories (id, backlog_id, name, storypoints, state) VALUES (6, 3, 'Story 5', 5, 2);
INSERT INTO stories (id, backlog_id, name, storypoints, state) VALUES (7, 3, 'Story 6', 5, 3);
INSERT INTO stories (id, backlog_id, name, storypoints, state) VALUES (8, 3, 'Story 7', 5, 3);
INSERT INTO stories (id, backlog_id, name, storypoints, state) VALUES (9, 3, 'Story 8', 5, 3);
INSERT INTO stories (id, backlog_id, name, storypoints, state) VALUES (10, 3, 'Story 9', 5, 4);
INSERT INTO stories (id, backlog_id, name, storypoints, state) VALUES (11, 3, 'Story 10', 5, 4);
INSERT INTO stories (id, backlog_id, name, storypoints, state) VALUES (12, 3, 'Story 11', 5, 4);
INSERT INTO stories (id, backlog_id, name, storypoints, state) VALUES (13, 3, 'Story 12', 5, 4);
INSERT INTO stories (id, backlog_id, name, storypoints, state) VALUES (14, 3, 'Story 13', 5, 5);
INSERT INTO stories (id, backlog_id, name, storypoints, state) VALUES (15, 3, 'Story 14', 5, 5);
INSERT INTO stories (id, backlog_id, name, storypoints, state) VALUES (16, 3, 'Story 15', 5, 5);
INSERT INTO stories (id, backlog_id, name, storypoints, state) VALUES (17, 3, 'Story 16', 5, 5);
INSERT INTO stories (id, backlog_id, name, storypoints, state) VALUES (18, 3, 'Story 17', 5, 5);
INSERT INTO stories (id, iteration_id, name, storypoints, state) VALUES (4, 3, 'Story 3', 5, 1);
INSERT INTO stories (id, iteration_id, name, storypoints, state) VALUES (5, 3, 'Story 4', 5, 2);
INSERT INTO stories (id, iteration_id, name, storypoints, state) VALUES (6, 3, 'Story 5', 5, 2);
INSERT INTO stories (id, iteration_id, name, storypoints, state) VALUES (7, 3, 'Story 6', 5, 3);
INSERT INTO stories (id, iteration_id, name, storypoints, state) VALUES (8, 3, 'Story 7', 5, 3);
INSERT INTO stories (id, iteration_id, name, storypoints, state) VALUES (9, 3, 'Story 8', 5, 3);
INSERT INTO stories (id, iteration_id, name, storypoints, state) VALUES (10, 3, 'Story 9', 5, 4);
INSERT INTO stories (id, iteration_id, name, storypoints, state) VALUES (11, 3, 'Story 10', 5, 4);
INSERT INTO stories (id, iteration_id, name, storypoints, state) VALUES (12, 3, 'Story 11', 5, 4);
INSERT INTO stories (id, iteration_id, name, storypoints, state) VALUES (13, 3, 'Story 12', 5, 4);
INSERT INTO stories (id, iteration_id, name, storypoints, state) VALUES (14, 3, 'Story 13', 5, 5);
INSERT INTO stories (id, iteration_id, name, storypoints, state) VALUES (15, 3, 'Story 14', 5, 5);
INSERT INTO stories (id, iteration_id, name, storypoints, state) VALUES (16, 3, 'Story 15', 5, 5);
INSERT INTO stories (id, iteration_id, name, storypoints, state) VALUES (17, 3, 'Story 16', 5, 5);
INSERT INTO stories (id, iteration_id, name, storypoints, state) VALUES (18, 3, 'Story 17', 5, 5);

INSERT INTO tasks (id, state, iteration_id, story_id) VALUES (1, 1, NULL, 1);
INSERT INTO tasks (id, state, iteration_id, story_id) VALUES (2, 5, NULL, 1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ INSERT INTO backlogs (id, backlogtype, name, rank, parent_id) VALUES (5, 'Projec

-- iteration stories
INSERT INTO backlogs (id, backlogtype, name, parent_id) VALUES (3, 'Iteration', 'Test iteration', 2);
INSERT INTO stories (id, state, storyPoints, backlog_id, name, parent_id) VALUES (31, 1, 10, 3, 'Iteration Story 1', 21); --leaf
INSERT INTO stories (id, state, storyPoints, backlog_id, name, parent_id) VALUES (32, 1, 20, 3, 'Iteration Story 2', 23); --leaf
INSERT INTO stories (id, state, storyPoints, backlog_id, name, parent_id) VALUES (33, 5, 30, 3, 'Iteration Story 3', NULL); --root, leaf
INSERT INTO stories (id, state, storyPoints, backlog_id, name, parent_id) VALUES (34, 1, 40, 3, 'Iteration Story 4', 11); --root, leaf
INSERT INTO stories (id, state, storyPoints, backlog_id, iteration_id, name, parent_id) VALUES (31, 1, 10, 2, 3, 'Iteration Story 1', 21); --leaf
INSERT INTO stories (id, state, storyPoints, backlog_id, iteration_id, name, parent_id) VALUES (32, 1, 20, 2, 3, 'Iteration Story 2', 23); --leaf
INSERT INTO stories (id, state, storyPoints, backlog_id, iteration_id, name, parent_id) VALUES (33, 5, 30, 2, 3, 'Iteration Story 3', NULL); --root, leaf
INSERT INTO stories (id, state, storyPoints, backlog_id, iteration_id, name, parent_id) VALUES (34, 1, 40, 2, 3, 'Iteration Story 4', 11); --root, leaf

12 changes: 6 additions & 6 deletions conf/test/fi/hut/soberit/agilefant/db/TaskDAOTest-data.sql
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@ INSERT INTO users (id, enabled, recentItemsNumberOfWeeks) VALUES (1, true, 1);
INSERT INTO users (id, enabled, recentItemsNumberOfWeeks) VALUES (2, true, 1);

INSERT INTO backlogs (id,backlogtype,startDate, endDate) VALUES (1,'Iteration','2009-05-20 10:15:00', '2009-07-01 10:15:00');
INSERT INTO backlogs (id,backlogtype,startDate, endDate) VALUES (2,'Project','2009-05-20 10:15:00', '2009-07-01 10:15:00');
INSERT INTO backlogs (id,backlogtype,startDate, endDate, rank) VALUES (2,'Project','2009-05-20 10:15:00', '2009-07-01 10:15:00', 0);

INSERT INTO assignment (user_id, backlog_id, availability) VALUES (1,1,100);
INSERT INTO assignment (user_id, backlog_id, availability) VALUES (2,1,100);

INSERT INTO stories (id,backlog_id, name, state) VALUES (1,1, 'Story', 1);
INSERT INTO stories (id,backlog_id, name, state) VALUES (2,2, 'Story 2', 1);
INSERT INTO stories (id,backlog_id, name, state) VALUES (3,1, 'Story 3', 1);
INSERT INTO stories (id,backlog_id, iteration_id, name, state) VALUES (1,2, 1, 'Story', 1);
INSERT INTO stories (id,backlog_id, iteration_id, name, state) VALUES (2,2, NULL, 'Story 2', 1);
INSERT INTO stories (id,backlog_id, iteration_id, name, state) VALUES (3,2, 1, 'Story 3', 1);

-- 2 tasks directly under iteration 1
-- 1 assignee - done already
Expand Down Expand Up @@ -62,7 +62,7 @@ INSERT INTO task_user (tasks_id, responsibles_id) VALUES(9,1);
--RANKS
INSERT INTO backlogs (id,backlogtype,startDate, endDate) VALUES (3,'Iteration','2009-05-20 10:15:00', '2009-07-01 10:15:00');

INSERT INTO stories (id,backlog_id, name, state) VALUES (55,3, 'Story', 1);
INSERT INTO stories (id,backlog_id, iteration_id, name, state) VALUES (55, NULL, 3, 'Story', 1);

INSERT INTO tasks (id,state, effortLeft, iteration_id, rank) VALUES (16,1,10000,3,5);
INSERT INTO tasks (id,state, effortLeft, iteration_id, rank) VALUES (17,1,10000,3,1500);
Expand All @@ -80,7 +80,7 @@ INSERT INTO tasks (id,state, effortLeft, originalEstimate, iteration_id, rank) V
INSERT INTO users (id, enabled, recentItemsNumberOfWeeks) VALUES (3, true, 1);
INSERT INTO backlogs (id, backlogtype, startDate, endDate) VALUES (5,'Iteration','2009-05-20 10:15:00', '2009-07-01 10:15:00');
INSERT INTO assignment (user_id, backlog_id, availability) VALUES (3,5,100);
INSERT INTO stories (id,backlog_id, name, state) VALUES (10,5, 'Story 5', 1);
INSERT INTO stories (id,backlog_id, iteration_id, name, state) VALUES (10,NULL, 5, 'Story 5', 1);
INSERT INTO tasks (id,state, effortLeft, story_id, rank) VALUES (25,1,null,10,1);
INSERT INTO tasks (id,state, effortLeft, story_id, rank) VALUES (26,0,2,10,2);
INSERT INTO task_user (tasks_id, responsibles_id) VALUES(26,3);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,12 @@ protected void attachTaskNodeToIterationNode(TimesheetData sheetData, TaskTimesh
parentNode.addChild(taskNode);
}
protected void attachStoryNodeToBacklogNode(TimesheetData sheetData, StoryTimesheetNode storyNode) {
Backlog backlog = storyNode.getStory().getBacklog();
Backlog backlog = storyNode.getStory().getIteration();

if(backlog == null) {
backlog = storyNode.getStory().getBacklog();
}

if(backlog == null) {
return;
}
Expand All @@ -139,7 +144,7 @@ protected void attachStoryNodeToBacklogNode(TimesheetData sheetData, StoryTimesh
sheetData.addNode(parentNode);
}
parentNode.addChild(storyNode);
}
}

protected void attachBacklogNodeToBacklogNode(TimesheetData sheetData, BacklogTimesheetNode backlogNode) {
Backlog parentBacklog = backlogNode.getBacklog().getParent();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,16 +118,16 @@ public List<StoryHourEntry> getStoryHourEntriesByFilter(
Criteria crit = getCurrentSession()
.createCriteria(StoryHourEntry.class);
crit
.createAlias("story.backlog", "bl",
.createAlias("story.iteration", "iteration",
CriteriaSpecification.LEFT_JOIN);
crit.createAlias("story.backlog.parent", "blParent",
crit.createAlias("story.backlog", "backlog",
CriteriaSpecification.LEFT_JOIN);
crit.createAlias("story.backlog.parent.parent", "blParentParent",
crit.createAlias("story.backlog.parent", "backlogParent",
CriteriaSpecification.LEFT_JOIN);

crit.add(Restrictions.or(Restrictions.in("bl.id", backlogIds),
Restrictions.or(Restrictions.in("blParent.id", backlogIds),
Restrictions.in("blParentParent.id", backlogIds))));
crit.add(Restrictions.or(Restrictions.in("iteration.id", backlogIds),
Restrictions.or(Restrictions.in("backlog.id", backlogIds),
Restrictions.in("backlogParent.id", backlogIds))));
crit.addOrder(Order.desc("date"));
this.setDateUserFilter(crit, startDate, endDate, userIds);
return asList(crit);
Expand All @@ -140,51 +140,36 @@ public List<TaskHourEntry> getTaskHourEntriesByFilter(
return Collections.emptyList();
}

List<TaskHourEntry> result;

Criteria crit = getCurrentSession().createCriteria(TaskHourEntry.class);

crit.createAlias("task.story", "story");
crit.createAlias("task.story.backlog", "bl",
CriteriaSpecification.LEFT_JOIN);
crit.createAlias("task.story.backlog.parent", "blParent",
CriteriaSpecification.LEFT_JOIN);
crit.createAlias("task.story.backlog.parent.parent", "blParentParent",
CriteriaSpecification.LEFT_JOIN);
crit.createAlias("task.story.iteration", "si",
CriteriaSpecification.LEFT_JOIN);
String[] backlogs = {
"iteration",
"backlog",
"backlogParent",
"task_without_story_iteration",
"task_without_story_project",
"task_without_story_product"
};

crit.createAlias("task.story", "story", CriteriaSpecification.LEFT_JOIN);
crit.createAlias("task.story.iteration", "iteration", CriteriaSpecification.LEFT_JOIN);
crit.createAlias("task.story.backlog", "backlog", CriteriaSpecification.LEFT_JOIN);
crit.createAlias("task.story.backlog.parent", "backlogParent", CriteriaSpecification.LEFT_JOIN);
crit.createAlias("task.iteration", "task_without_story_iteration", CriteriaSpecification.LEFT_JOIN);
crit.createAlias("task.iteration.parent", "task_without_story_project", CriteriaSpecification.LEFT_JOIN);
crit.createAlias("task.iteration.parent.parent", "task_without_story_product", CriteriaSpecification.LEFT_JOIN);

Criterion parentProject = Restrictions.or(Restrictions.or(Restrictions.in("bl.id", backlogIds), Restrictions
.in("blParent.id", backlogIds)), Restrictions.and(Restrictions.isNull("story.backlog"), Restrictions.in("si.id", backlogIds)));
crit.add(Restrictions.or(Restrictions.in("blParentParent.id",
backlogIds), parentProject));
crit.addOrder(Order.desc("date"));
this.setDateUserFilter(crit, startDate, endDate, userIds);

result = asList(crit);

//entries where task has no story attachment
crit = getCurrentSession().createCriteria(TaskHourEntry.class);

crit.createAlias("task", "task");
crit.createAlias("task.iteration", "iBl", CriteriaSpecification.LEFT_JOIN);
crit.createAlias("task.iteration.parent", "iBlParent",
CriteriaSpecification.LEFT_JOIN);
crit.createAlias("task.iteration.parent.parent", "iBlParentParent",
CriteriaSpecification.LEFT_JOIN);
Criterion condition = Restrictions.isNull("task.id");
for(String alias : backlogs) {
condition = Restrictions.or(Restrictions.in(alias + ".id", backlogIds), condition);
}

Criterion iterationParents = Restrictions.or(Restrictions.in(
"iBlParent.id", backlogIds), Restrictions.in("iBlParentParent.id",
backlogIds));
crit.add( Restrictions.or(iterationParents,
Restrictions.in("iBl.id", backlogIds)));
crit.add(Restrictions.isNull("task.story"));
crit.add(condition);
crit.addOrder(Order.desc("date"));
this.setDateUserFilter(crit, startDate, endDate, userIds);
List<TaskHourEntry> hourentriesWithoutStory = asList(crit);
result.addAll(hourentriesWithoutStory);

return result;
return asList(crit);
}

public long calculateIterationHourEntriesSum(int iterationId) {
Expand Down Expand Up @@ -245,7 +230,7 @@ private long getSumForTaskHourEntriesWithStoryForIteration(int iterationId) {
criteria = criteria.createCriteria("task");
criteria.add(Restrictions.isNotNull("story"));
criteria = criteria.createCriteria("story");
criteria = criteria.createCriteria("backlog");
criteria = criteria.createCriteria("iteration");
criteria.add(Restrictions.idEq(iterationId));


Expand Down Expand Up @@ -273,7 +258,7 @@ private long getSumForStoryHourEntriesForIteration(int iterationId) {
criteria.setProjection(Projections.sum("minutesSpent"));

criteria = criteria.createCriteria("story");
criteria = criteria.createCriteria("backlog");
criteria = criteria.createCriteria("iteration");
criteria.add(Restrictions.idEq(iterationId));


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ private Criteria addIterationRestriction(Criteria criteria,
public List<Task> getAllTasksForIteration(Iteration iteration) {
Criteria storyTaskCrit = getCurrentSession().createCriteria(Task.class);
storyTaskCrit.setFetchMode("iteration",FetchMode.SELECT);
storyTaskCrit = storyTaskCrit.createCriteria("story").createCriteria("backlog");
storyTaskCrit = storyTaskCrit.createCriteria("story").createCriteria("iteration");
storyTaskCrit.add(Restrictions.idEq(iteration.getId()));

Criteria tasksWoStoryCrit = getCurrentSession().createCriteria(Task.class);
Expand All @@ -75,7 +75,7 @@ public List<Task> getAllTasksForIteration(Iteration iteration) {

public Map<StoryState, Integer> countIterationStoriesByState(int iterationId) {
Criteria criteria = getCurrentSession().createCriteria(Story.class);
criteria.add(Restrictions.eq("backlog.id", iterationId));
criteria.add(Restrictions.eq("iteration.id", iterationId));
criteria.setProjection(Projections.projectionList().add(
Projections.property("state")).add(Projections.rowCount(),
"storyCount").add(Projections.groupProperty("state"), "state"));
Expand Down Expand Up @@ -172,7 +172,7 @@ public Pair<Integer, Integer> getCountOfDoneAndAllTasks(Iteration iteration) {
Pair<Integer, Integer> noStory = getCounOfDoneAndAllNonDeffered(Task.class,
TaskState.DONE, Arrays.asList("iteration"), iteration);
Pair<Integer, Integer> inStory = getCounOfDoneAndAllNonDeffered(Task.class,
TaskState.DONE, Arrays.asList("story", "backlog"), iteration);
TaskState.DONE, Arrays.asList("story", "iteration"), iteration);
return Pair.create(noStory.first + inStory.first, noStory.second
+ inStory.second);
}
Expand All @@ -185,7 +185,7 @@ public Pair<Integer, Integer> getCountOfDoneAndNonDeferred(Iteration iteration)
public Pair<Integer, Integer> getCountOfDoneAndAllStories(
Iteration iteration) {
return getCounOfDoneAndAllNonDeffered(Story.class, StoryState.DONE, Arrays
.asList("backlog"), iteration);
.asList("iteration"), iteration);
}

public Map<Integer, Integer> getTotalAvailability(Set<Integer> iterationIds) {
Expand Down Expand Up @@ -230,7 +230,7 @@ public List<Iteration> retrieveEmptyIterationsWithPlannedSize(
crit.add(Restrictions.isNotNull("backlogSize"));

// must be empty
crit.add(Restrictions.isEmpty("stories"));
crit.add(Restrictions.isEmpty("assignedStories"));
crit.add(Restrictions.isEmpty("tasks"));

return asList(crit);
Expand Down Expand Up @@ -346,7 +346,7 @@ public Map<Integer, Long> calculateIterationTaskEffortSpent(Iteration iteration)
Criteria crit = getCurrentSession().createCriteria(TaskHourEntry.class);
Criteria taskCrit = crit.createCriteria("task");
taskCrit.createAlias("story", "story", CriteriaSpecification.LEFT_JOIN);
taskCrit.add(Restrictions.or(Restrictions.eq("iteration", iteration), Restrictions.eq("story.backlog", iteration)));
taskCrit.add(Restrictions.or(Restrictions.eq("iteration", iteration), Restrictions.eq("story.iteration", iteration)));
ProjectionList sumsProj = Projections.projectionList();
sumsProj.add(Projections.groupProperty("task"));
sumsProj.add(Projections.sum("minutesSpent"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,10 +162,11 @@ private void attachRootFilters(Criteria projectCrit,
Criterion parentFilter = Restrictions.or(Restrictions.isNull("parent"),
parentInProductBacklog);
projectCrit.add(parentFilter);
projectCrit.add(Restrictions.isNull("iteration"));
// Stories attached to iterations under the project
iterationCrit.createAlias("parent", "parentStory",
CriteriaSpecification.LEFT_JOIN);
iterationCrit.createCriteria("backlog", "iteration").add(
iterationCrit.createCriteria("iteration").add(
Restrictions.eq("parent.id", projectId)).createAlias("parent",
"project");
iterationCrit.add(parentFilter);
Expand Down
Loading

0 comments on commit 27141d2

Please sign in to comment.