Optimize QSO statistics retrieval with consolidated query

Replaced multiple individual queries for QSO statistics in Dashboard controller with a single consolidated query in Logbook_model. This improves performance by reducing database calls when fetching today's, total, monthly, and yearly QSO counts.
pull/3318/head
Peter Goodhall 2025-08-09 21:10:04 +01:00
rodzic 3bd31bd65d
commit 278a4b384c
2 zmienionych plików z 63 dodań i 5 usunięć

Wyświetl plik

@ -85,11 +85,12 @@ class Dashboard extends CI_Controller
$data['radio_status'] = $this->cat->recent_status();
// Store info
$data['todays_qsos'] = $this->logbook_model->todays_qsos($logbooks_locations_array);
$data['total_qsos'] = $this->logbook_model->total_qsos($logbooks_locations_array);
$data['month_qsos'] = $this->logbook_model->month_qsos($logbooks_locations_array);
$data['year_qsos'] = $this->logbook_model->year_qsos($logbooks_locations_array);
// Store info - Use consolidated query for QSO statistics
$qso_stats = $this->logbook_model->get_qso_statistics_consolidated($logbooks_locations_array);
$data['todays_qsos'] = $qso_stats['todays_qsos'];
$data['total_qsos'] = $qso_stats['total_qsos'];
$data['month_qsos'] = $qso_stats['month_qsos'];
$data['year_qsos'] = $qso_stats['year_qsos'];
// Load Countries Breakdown data into array
$CountriesBreakdown = $this->logbook_model->total_countries_confirmed($logbooks_locations_array);

Wyświetl plik

@ -4980,6 +4980,63 @@ class Logbook_model extends CI_Model
// If all parsing fails, return the original input and let the database handle it
return $date_input;
}
/* Consolidated QSO Statistics - Get all basic counts in a single query */
function get_qso_statistics_consolidated($StationLocationsArray = null)
{
if ($StationLocationsArray == null) {
$this->load->model('logbooks_model');
$logbooks_locations_array = $this->logbooks_model->list_logbook_relationships($this->session->userdata('active_station_logbook'));
} else {
$logbooks_locations_array = $StationLocationsArray;
}
if (!$logbooks_locations_array) {
return array(
'total_qsos' => 0,
'todays_qsos' => 0,
'month_qsos' => 0,
'year_qsos' => 0
);
}
// Calculate date ranges
$today_morning = date('Y-m-d 00:00:00');
$today_night = date('Y-m-d 23:59:59');
$month_morning = date('Y-m-01 00:00:00');
$date = new DateTime('now');
$date->modify('last day of this month');
$month_night = $date->format('Y-m-d') . " 23:59:59";
$year_morning = date('Y-01-01 00:00:00');
$year_night = date('Y-12-31 23:59:59');
// Build the consolidated query
$this->db->select("
COUNT(*) as total_qsos,
COUNT(CASE WHEN COL_TIME_ON >= '$today_morning' AND COL_TIME_ON <= '$today_night' THEN 1 END) as todays_qsos,
COUNT(CASE WHEN COL_TIME_ON >= '$month_morning' AND COL_TIME_ON <= '$month_night' THEN 1 END) as month_qsos,
COUNT(CASE WHEN COL_TIME_ON >= '$year_morning' AND COL_TIME_ON <= '$year_night' THEN 1 END) as year_qsos
", FALSE);
$this->db->where_in('station_id', $logbooks_locations_array);
$query = $this->db->get($this->config->item('table_name'));
if ($query->num_rows() > 0) {
$row = $query->row();
return array(
'total_qsos' => (int)$row->total_qsos,
'todays_qsos' => (int)$row->todays_qsos,
'month_qsos' => (int)$row->month_qsos,
'year_qsos' => (int)$row->year_qsos
);
}
return array(
'total_qsos' => 0,
'todays_qsos' => 0,
'month_qsos' => 0,
'year_qsos' => 0
);
}
}
// Function to validate ADIF date format