diff --git a/pift.cron.inc b/pift.cron.inc index 3121218..e3d3321 100644 --- a/pift.cron.inc +++ b/pift.cron.inc @@ -16,47 +16,47 @@ function pift_cron_retest() { return; } - // TODO: Refactor to use nid column from pift_test, so that this can be enabled - $api_versions = pift_core_api_versions(); $sids = variable_get('pift_status', array()); // Only attempt query if both values are not empty. if ($api_versions && $sids) { - $retest_time = time() - PIFT_RETEST; - - // Loop over 'ON' clause to remove an 'OR' which should be more efficient. - foreach (array('u.nid = pi.nid', 'cu.nid = pi.nid') as $clause) { - db_query("UPDATE {pift_test} - SET status = %d - WHERE type = %d - AND id IN ( - SELECT f.fid - FROM {files} f - LEFT JOIN {upload} u - ON f.fid = u.fid - LEFT JOIN {comment_upload} cu - ON f.fid = cu.fid - - JOIN {project_issues} pi - ON " . $clause . " - JOIN {pift_project} p - ON pi.pid = p.pid - JOIN {project_release_nodes} r - ON pi.rid = r.nid - - JOIN {node} n - ON r.nid = n.nid - JOIN {term_node} t - ON (n.vid = t.vid AND t.tid IN (" . db_placeholders($api_versions, 'int') . ")) - - WHERE pi.sid IN (" . db_placeholders($sids, 'int') . ") - ) - AND status > %d - AND last_tested < %d", - array_merge(array(PIFT_STATUS_QUEUE, PIFT_TYPE_FILE), $api_versions, $sids, - array(PIFT_STATUS_SENT, $retest_time))); + //$retest_time = time() - PIFT_RETEST; + $retest_time = 1; + + // Get last file test from each nid which is in 'needs review' or 'rtbc'. + $result = db_query( + "SELECT max(test_id) as test_id + FROM {pift_test} pt + JOIN {project_issues} pi ON pt.nid = pi.nid + JOIN {project_release_nodes} prn ON pi.rid = prn.nid + JOIN {node} n ON prn.nid = n.nid + JOIN {term_node} t + ON (n.vid = t.vid and t.tid in (" . db_placeholders($api_versions, 'int') . ")) + WHERE pt.type = %d + AND pi.sid IN (" . db_placeholders($sids, 'int') . ") + GROUP BY pt.nid", + array_merge($api_versions, (array) PIFT_TYPE_FILE, $sids) + ); + $retest_candidates = array(); + while ($data = db_fetch_array($result)) { + $retest_candidates[] = $data['test_id']; } + + // Update status for tests with final results (Passed or Failed) + // and which have not been tested in the retest period. + db_query( + "Update {pift_test} set status = %d + WHERE status > %d + AND last_tested < %d + AND test_id IN (" . db_placeholders($retest_candidates, 'int') . ") + ORDER BY test_id ASC + LIMIT 50", + array_merge((array) PIFT_STATUS_QUEUE, (array) PIFT_STATUS_SENT, (array) $retest_time, $retest_candidates) + ); + + // TODO: Remove 'Limit 50' above and DSM() before enabling in pift.module! + drupal_set_message("Re-Tests Queued: " . db_affected_rows()); } } diff --git a/pift.drush.inc b/pift.drush.inc index dd68511..bd13a04 100644 --- a/pift.drush.inc +++ b/pift.drush.inc @@ -26,7 +26,7 @@ function drush_pift_cron() { module_load_include('cron.inc', 'pift'); // Requeue all tests that have passed the re-test interval. -// pift_cron_retest(); TODO fix query. + pift_cron_retest(); // Send a batch of queued tests. pift_cron_queue_batch();