/**
 * Compute the weekly summaries for the week starting at the given timestamp.
 *
 * @param $timestamp
 *   UNIX timestamp indicating the last time weekly stats were processed.
 */
function project_usage_process_weekly($timestamp)
{
    watchdog('project_usage', 'Starting to process weekly usage data.');
    $time_0 = microtime(TRUE);
    // Get all the weeks since we last ran.
    $weeks = project_usage_get_weeks_since($timestamp);
    // Skip the last entry since it's the current, incomplete week.
    $count = count($weeks) - 1;
    for ($i = 0; $i < $count; $i++) {
        $start = $weeks[$i];
        $end = $weeks[$i + 1];
        $date = format_date($start, 'custom', 'Y-m-d');
        $time_1 = microtime(TRUE);
        // Try to compute the usage tallies per project and per release. If there
        // is a problem--perhaps some rows existed from a previous, incomplete
        // run that are preventing inserts, throw a watchdog error.
        $sql = "INSERT INTO {project_usage_week_project} (nid, timestamp, version_api, count) SELECT project_nid as nid, :start, version_api, COUNT(DISTINCT site_key) FROM {project_usage_day} WHERE timestamp >= :start AND timestamp < :end AND project_nid <> 0 GROUP BY project_nid, version_api";
        $query_args = array(':start' => $start, ':end' => $end);
        $result = db_query($sql, $query_args);
        $time_2 = microtime(TRUE);
        $substitutions = array('!date' => $date, '!projects' => format_plural($result->rowCount(), '1 project', '@count projects'), '!delta' => format_interval($time_2 - $time_1));
        if (!$result) {
            watchdog('project_usage', 'Query failed inserting weekly project tallies for !date (!delta).', $substitutions, WATCHDOG_ERROR);
        } else {
            watchdog('project_usage', 'Computed weekly project tallies for !date for !projects (!delta).', $substitutions);
        }
        $sql = "INSERT INTO {project_usage_week_release} (nid, timestamp, count) SELECT release_nid as nid, :start, COUNT(DISTINCT site_key) FROM {project_usage_day} WHERE timestamp >= :start AND timestamp < :end AND release_nid <> 0 GROUP BY release_nid";
        $query_args = array(':start' => $start, ':end' => $end);
        $result = db_query($sql, $query_args);
        $time_3 = microtime(TRUE);
        $substitutions = array('!date' => $date, '!releases' => format_plural($result->rowCount(), '1 release', '@count releases'), '!delta' => format_interval($time_3 - $time_2));
        if (!$result) {
            watchdog('project_usage', 'Query failed inserting weekly release tallies for !date, query (!delta).', $substitutions, WATCHDOG_ERROR);
        } else {
            watchdog('project_usage', 'Computed weekly release tallies for !date for !releases (!delta).', $substitutions);
        }
    }
    // Remove any tallies that have aged out.
    $time_4 = microtime(TRUE);
    $project_life = config_get('project_usage.settings', 'life_weekly_project');
    $result = db_query("DELETE FROM {project_usage_week_project} WHERE timestamp < :timestamp", array(':timestamp' => REQUEST_TIME - $project_life));
    $time_5 = microtime(TRUE);
    $substitutions = array('!rows' => format_plural($result->rowCount(), '1 old weekly project row', '@count old weekly project rows'), '!delta' => format_interval($time_5 - $time_4));
    watchdog('project_usage', 'Removed !rows (!delta).', $substitutions);
    $release_life = config_get('project_usage.settings', 'life_weekly_release');
    $result = db_query("DELETE FROM {project_usage_week_release} WHERE timestamp < :timestamp", array(':timestamp' => REQUEST_TIME - $release_life));
    $time_6 = microtime(TRUE);
    $substitutions = array('!rows' => format_plural($result->rowCount(), '1 old weekly release row', '@count old weekly release rows'), '!delta' => format_interval($time_6 - $time_5));
    watchdog('project_usage', 'Removed !rows (!delta).', $substitutions);
    watchdog('project_usage', 'Completed weekly usage data processing (total time: !delta).', array('!delta' => format_interval($time_6 - $time_0)));
}
/**
 * Compute the weekly summaries for the week starting at the given timestamp.
 *
 * @param $timestamp
 *   UNIX timestamp indicating the last time weekly stats were processed.
 */
function project_usage_process_weekly($timestamp)
{
    watchdog('project_usage', 'Starting to process weekly usage data.');
    $time_0 = time();
    // Get all the weeks since we last ran.
    $weeks = project_usage_get_weeks_since($timestamp);
    // Skip the last entry since it's the current, incomplete week.
    $count = count($weeks) - 1;
    for ($i = 0; $i < $count; $i++) {
        $start = $weeks[$i];
        $end = $weeks[$i + 1];
        $date = format_date($start, 'custom', 'Y-m-d');
        $time_1 = time();
        // Try to compute the usage tallies per project and per release. If there
        // is a problem--perhaps some rows existed from a previous, incomplete
        // run that are preventing inserts, throw a watchdog error.
        $sql = "INSERT INTO {project_usage_week_project} (nid, timestamp, tid, count) SELECT pid, %d, tid, COUNT(DISTINCT site_key) FROM {project_usage_day} WHERE timestamp >= %d AND timestamp < %d AND pid <> 0 GROUP BY pid, tid";
        $query_args = array($start, $start, $end);
        $result = db_query($sql, $query_args);
        $time_2 = time();
        _db_query_callback($query_args, TRUE);
        $substitutions = array('!date' => $date, '%query' => preg_replace_callback(DB_QUERY_REGEXP, '_db_query_callback', $sql), '!projects' => format_plural(db_affected_rows(), '1 project', '@count projects'), '!delta' => format_interval($time_2 - $time_1));
        if (!$result) {
            watchdog('project_usage', 'Query failed inserting weekly project tallies for !date, query: %query (!delta).', $substitutions, WATCHDOG_ERROR);
        } else {
            watchdog('project_usage', 'Computed weekly project tallies for !date for !projects (!delta).', $substitutions);
        }
        $sql = "INSERT INTO {project_usage_week_release} (nid, timestamp, count) SELECT nid, %d, COUNT(DISTINCT site_key) FROM {project_usage_day} WHERE timestamp >= %d AND timestamp < %d AND nid <> 0 GROUP BY nid";
        $query_args = array($start, $start, $end);
        $result = db_query($sql, $query_args);
        $time_3 = time();
        _db_query_callback($query_args, TRUE);
        $substitutions = array('!date' => $date, '!releases' => format_plural(db_affected_rows(), '1 release', '@count releases'), '%query' => preg_replace_callback(DB_QUERY_REGEXP, '_db_query_callback', $sql), '!delta' => format_interval($time_3 - $time_2));
        if (!$result) {
            watchdog('project_usage', 'Query failed inserting weekly release tallies for !date, query: %query (!delta).', $substitutions, WATCHDOG_ERROR);
        } else {
            watchdog('project_usage', 'Computed weekly release tallies for !date for !releases (!delta).', $substitutions);
        }
    }
    // Remove any tallies that have aged out.
    $time_4 = time();
    $project_life = variable_get('project_usage_life_weekly_project', PROJECT_USAGE_YEAR);
    db_query("DELETE FROM {project_usage_week_project} WHERE timestamp < %d", $now - $project_life);
    $time_5 = time();
    $substitutions = array('!rows' => format_plural(db_affected_rows(), '1 old weekly project row', '@count old weekly project rows'), '!delta' => format_interval($time_5 - $time_4));
    watchdog('project_usage', 'Removed !rows (!delta).', $substitutions);
    $release_life = variable_get('project_usage_life_weekly_release', 26 * PROJECT_USAGE_WEEK);
    db_query("DELETE FROM {project_usage_week_release} WHERE timestamp < %d", $now - $release_life);
    $time_6 = time();
    $substitutions = array('!rows' => format_plural(db_affected_rows(), '1 old weekly release row', '@count old weekly release rows'), '!delta' => format_interval($time_6 - $time_5));
    watchdog('project_usage', 'Removed !rows (!delta).', $substitutions);
    watchdog('project_usage', 'Completed weekly usage data processing (total time: !delta).', array('!delta' => format_interval($time_6 - $time_0)));
}