Optimise the fetch-data query

This commit is contained in:
Starbeamrainbowlabs 2019-06-20 22:12:33 +01:00
parent f8a577b099
commit 87c0eb90ba
Signed by: sbrl
GPG key ID: 1BE5172E637709C2

View file

@ -63,6 +63,11 @@ class MariaDBMeasurementDataRepository implements IMeasurementDataRepository {
} }
public function get_readings_by_date(\DateTime $datetime, int $type_id) { public function get_readings_by_date(\DateTime $datetime, int $type_id) {
$max_reading_timediff = $this->settings->get("data.max_reading_timediff");
$start_datetime = (clone $datetime)->sub(new \DateInterval("PT${max_reading_timediff}S"));
$end_datetime = (clone $datetime)->add(new \DateInterval("PT${max_reading_timediff}S"));
$s = $this->get_static; $s = $this->get_static;
$o = $this->get_static_extra; $o = $this->get_static_extra;
@ -80,22 +85,24 @@ class MariaDBMeasurementDataRepository implements IMeasurementDataRepository {
COUNT({$s("table_name_metadata")}.{$s("column_metadata_device_id")}) AS record_count COUNT({$s("table_name_metadata")}.{$s("column_metadata_device_id")}) AS record_count
FROM {$s("table_name_values")} FROM {$s("table_name_values")}
JOIN {$s("table_name_metadata")} ON {$s("table_name_values")}.{$s("column_values_reading_id")} = {$s("table_name_metadata")}.id JOIN {$s("table_name_metadata")} ON {$s("table_name_values")}.{$s("column_values_reading_id")} = {$s("table_name_metadata")}.id
WHERE ABS(TIME_TO_SEC(TIMEDIFF( WHERE
:datetime,
COALESCE( COALESCE(
{$s("table_name_metadata")}.{$s("column_metadata_recordedon")}, {$s("table_name_metadata")}.{$s("column_metadata_recordedon")},
{$s("table_name_metadata")}.{$s("column_metadata_storedon")} {$s("table_name_metadata")}.{$s("column_metadata_storedon")}
) ) >= :start_datetime AND
))) < :max_reading_timediff COALESCE(
{$s("table_name_metadata")}.{$s("column_metadata_recordedon")},
{$s("table_name_metadata")}.{$s("column_metadata_storedon")}
) <= :end_datetime
AND AND
{$s("table_name_values")}.{$s("column_values_reading_type")} = :reading_type {$s("table_name_values")}.{$s("column_values_reading_type")} = :reading_type
GROUP BY {$s("table_name_metadata")}.{$s("column_metadata_device_id")} GROUP BY {$s("table_name_metadata")}.{$s("column_metadata_device_id")}
ORDER BY {$s("table_name_metadata")}.{$s("column_metadata_recordedon")} ORDER BY {$s("table_name_metadata")}.{$s("column_metadata_recordedon")}
", [ ", [
// The database likes strings, not PHP DateTime() instances
"datetime" => $datetime->format(\DateTime::ISO8601),
"reading_type" => $type_id, "reading_type" => $type_id,
"max_reading_timediff" => $this->settings->get("data.max_reading_timediff") // The database likes strings, not PHP DateTime() instances
"start_datetime" => $start_datetime->format(\DateTime::ISO8601),
"end_datetime" => $end_datetime->format(\DateTime::ISO8601),
] ]
)->fetchAll(); )->fetchAll();
} }