82 lines
1.6 KiB
Go
82 lines
1.6 KiB
Go
package mqe
|
||
|
||
import (
|
||
"database/sql"
|
||
|
||
"gordenko.dev/dima/qb"
|
||
)
|
||
|
||
type RawMeasure struct {
|
||
Time int64 `json:"t"`
|
||
Value float64 `json:"v"`
|
||
}
|
||
|
||
type RawMeasuresFilter struct {
|
||
MetricID int64 `json:"metricID"`
|
||
MetricType qb.MetricType `json:"metricType"`
|
||
Since int64 `json:"since"` // уже учтен firstHourOfDay
|
||
Until int64 `json:"until"` // уже учтен firstHourOfDay
|
||
}
|
||
|
||
// ListRawMeasures - cписок показаний мгновенных метрик (Температура, Давление, Расход)
|
||
// за за интервал без группировки
|
||
func (s *MeasureQueryEngine) ListRawMeasures(req RawMeasuresFilter) (_ []RawMeasure, err error) {
|
||
tx, err := s.db.Driver().Begin()
|
||
if err != nil {
|
||
return
|
||
}
|
||
defer tx.Rollback()
|
||
|
||
rows, err := tx.Query(`
|
||
SELECT tm, value
|
||
FROM f64
|
||
WHERE metricID=? AND tm BETWEEN ? AND ?
|
||
ORDER BY tm ASC`,
|
||
req.MetricID, req.Since, req.Until)
|
||
if err != nil {
|
||
if err == sql.ErrNoRows {
|
||
err = nil
|
||
}
|
||
return
|
||
}
|
||
defer rows.Close()
|
||
|
||
var result []RawMeasure
|
||
|
||
for rows.Next() {
|
||
var (
|
||
tm int64
|
||
value float64
|
||
)
|
||
err = rows.Scan(&tm, &value)
|
||
if err != nil {
|
||
return
|
||
}
|
||
result = append(result, RawMeasure{
|
||
Time: tm,
|
||
Value: value,
|
||
})
|
||
}
|
||
|
||
if err = rows.Err(); err != nil {
|
||
return
|
||
}
|
||
|
||
if len(result) == 0 {
|
||
return
|
||
}
|
||
|
||
if req.MetricType == qb.Cumulative {
|
||
var corrections []_f64Correction
|
||
corrections, err = listF64CorrectionsTx(tx, req.MetricID)
|
||
if err != nil {
|
||
return
|
||
}
|
||
|
||
if len(corrections) > 0 {
|
||
applyCorrectionsToRawMeasures(corrections, result)
|
||
}
|
||
}
|
||
return result, nil
|
||
}
|