Files
beacon-server/db/sqlc/signal.sql.go
T

100 lines
3.3 KiB
Go

// Code generated by sqlc. DO NOT EDIT.
// versions:
// sqlc v1.31.1
// source: signal.sql
package db
import (
"context"
"github.com/jackc/pgx/v5/pgtype"
)
const getSignalStats = `-- name: GetSignalStats :many
WITH readings AS (
SELECT iata, hour, kind, snr_bin, rssi_bin, receptions, snr_samples, snr_sum, rssi_samples, rssi_sum FROM mv_signal_stats_hourly
WHERE hour >= $1::timestamptz AND hour < $2::timestamptz
AND COALESCE(cardinality($3::bpchar[]), 0) = 0
UNION ALL
SELECT iata, hour, kind, snr_bin, rssi_bin, receptions, snr_samples, snr_sum, rssi_samples, rssi_sum FROM mv_signal_stats_hourly
WHERE hour >= $1::timestamptz AND hour < $2::timestamptz
AND cardinality($3::bpchar[]) > 0 AND iata = ANY($3::bpchar[])
)
SELECT (3 + 4 * grouping(hour))::integer AS kind,
COALESCE(hour, 'epoch'::timestamptz)::timestamptz AS hour,
-1::integer AS snr_bin, -1::integer AS rssi_bin,
COALESCE(sum(receptions), 0)::bigint AS receptions,
COALESCE(sum(snr_samples), 0)::bigint AS snr_samples,
COALESCE(sum(snr_sum) / NULLIF(sum(snr_samples), 0), 0)::double precision AS snr_average,
COALESCE(sum(rssi_samples), 0)::bigint AS rssi_samples,
COALESCE(sum(rssi_sum) / NULLIF(sum(rssi_samples), 0), 0)::double precision AS rssi_average
FROM readings WHERE kind = 3
GROUP BY GROUPING SETS ((), (hour))
UNION ALL
SELECT (kind + 4)::integer, 'epoch'::timestamptz, snr_bin, rssi_bin,
sum(receptions)::bigint, 0::bigint, 0::double precision, 0::bigint, 0::double precision
FROM readings WHERE kind IN (1, 2)
GROUP BY kind, snr_bin, rssi_bin
ORDER BY kind, hour, snr_bin, rssi_bin
`
type GetSignalStatsParams struct {
Since pgtype.Timestamptz `json:"since"`
Until pgtype.Timestamptz `json:"until"`
Iatas []string `json:"iatas"`
}
type GetSignalStatsRow struct {
Kind int32 `json:"kind"`
Hour pgtype.Timestamptz `json:"hour"`
SnrBin int32 `json:"snr_bin"`
RssiBin int32 `json:"rssi_bin"`
Receptions int64 `json:"receptions"`
SnrSamples int64 `json:"snr_samples"`
SnrAverage float64 `json:"snr_average"`
RssiSamples int64 `json:"rssi_samples"`
RssiAverage float64 `json:"rssi_average"`
}
// Read compact hourly snapshots, never observations on an HTTP request.
// Weight averages by sample counts instead of averaging regional/hourly means.
func (q *Queries) GetSignalStats(ctx context.Context, arg GetSignalStatsParams) ([]GetSignalStatsRow, error) {
rows, err := q.db.Query(ctx, getSignalStats, arg.Since, arg.Until, arg.Iatas)
if err != nil {
return nil, err
}
defer rows.Close()
items := []GetSignalStatsRow{}
for rows.Next() {
var i GetSignalStatsRow
if err := rows.Scan(
&i.Kind,
&i.Hour,
&i.SnrBin,
&i.RssiBin,
&i.Receptions,
&i.SnrSamples,
&i.SnrAverage,
&i.RssiSamples,
&i.RssiAverage,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const refreshSignalStats = `-- name: RefreshSignalStats :exec
REFRESH MATERIALIZED VIEW CONCURRENTLY mv_signal_stats_hourly
`
func (q *Queries) RefreshSignalStats(ctx context.Context) error {
_, err := q.db.Exec(ctx, refreshSignalStats)
return err
}