function fetch_associated_data_for_tasks($db, &$tasks)
{
    $task_ids = array();
    $task_by_id = array();
    foreach ($tasks as &$task) {
        array_push($task_ids, $task['id']);
        $task_by_id[$task['id']] =& $task;
    }
    $bugs = $db->query_and_fetch_all('SELECT bug_id AS "id", bug_task AS "task", bug_tracker AS "bugTracker", bug_number AS "number"
        FROM bugs WHERE bug_task = ANY ($1)', array('{' . implode(', ', $task_ids) . '}'));
    if (!is_array($bugs)) {
        exit_with_error('FailedToFetchBugs');
    }
    foreach ($bugs as $bug) {
        $associated_task =& $task_by_id[$bug['task']];
        array_push($associated_task['bugs'], $bug['id']);
    }
    $commit_log_fetcher = new CommitLogFetcher($db);
    $commits = $commit_log_fetcher->fetch_for_tasks($task_ids, $task_by_id);
    if (!is_array($commits)) {
        exit_with_error('FailedToFetchCommits');
    }
    $task_build_counts = $db->query_and_fetch_all('SELECT
        testgroup_task AS "task",
        count(testgroup_id) as "total",
        sum(case when request_status = \'failed\' or request_status = \'completed\' or request_status = \'canceled\' then 1 else 0 end) as "finished"
        FROM analysis_test_groups, build_requests
        WHERE request_group = testgroup_id AND testgroup_task = ANY($1) GROUP BY testgroup_task', array('{' . implode(', ', $task_ids) . '}'));
    if (!is_array($task_build_counts)) {
        exit_with_error('FailedToFetchTestGroups');
    }
    foreach ($task_build_counts as $build_count) {
        $task =& $task_by_id[$build_count['task']];
        $task['buildRequestCount'] = $build_count['total'];
        $task['finishedBuildRequestCount'] = $build_count['finished'];
        $task['category'] = determine_category($task);
    }
    return array('analysisTasks' => $tasks, 'bugs' => $bugs, 'commits' => $commits);
}