Initial commit
This commit is contained in:
commit
6bc66975db
10 changed files with 407 additions and 0 deletions
21
app/db.go
Normal file
21
app/db.go
Normal file
|
@ -0,0 +1,21 @@
|
|||
package app
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
|
||||
"git.ultraware.nl/NiseVoid/qb/driver/autoqb"
|
||||
"git.ultraware.nl/NiseVoid/qb/qbdb"
|
||||
_ "github.com/lib/pq" // PostgreSQL driver
|
||||
)
|
||||
|
||||
var db *qbdb.DB
|
||||
|
||||
// InitDB initializes the database connection
|
||||
func InitDB() {
|
||||
d, err := sql.Open(`postgres`, `host=/tmp dbname=power_quality`)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
db = autoqb.New(d)
|
||||
}
|
175
app/internal/model/db.json
Normal file
175
app/internal/model/db.json
Normal file
|
@ -0,0 +1,175 @@
|
|||
[
|
||||
{
|
||||
"name": "public.measurement",
|
||||
"fields": [
|
||||
{
|
||||
"name": "c_gem_1",
|
||||
"type": "double precision",
|
||||
"null": false,
|
||||
"size": 8
|
||||
},
|
||||
{
|
||||
"name": "c_gem_2",
|
||||
"type": "double precision",
|
||||
"null": false,
|
||||
"size": 8
|
||||
},
|
||||
{
|
||||
"name": "c_gem_3",
|
||||
"type": "double precision",
|
||||
"null": false,
|
||||
"size": 8
|
||||
},
|
||||
{
|
||||
"name": "ep_1",
|
||||
"type": "double precision",
|
||||
"null": false,
|
||||
"size": 8
|
||||
},
|
||||
{
|
||||
"name": "ep_2",
|
||||
"type": "double precision",
|
||||
"null": false,
|
||||
"size": 8
|
||||
},
|
||||
{
|
||||
"name": "ep_3",
|
||||
"type": "double precision",
|
||||
"null": false,
|
||||
"size": 8
|
||||
},
|
||||
{
|
||||
"name": "i_gem_1",
|
||||
"type": "double precision",
|
||||
"null": false,
|
||||
"size": 8
|
||||
},
|
||||
{
|
||||
"name": "i_gem_2",
|
||||
"type": "double precision",
|
||||
"null": false,
|
||||
"size": 8
|
||||
},
|
||||
{
|
||||
"name": "i_gem_3",
|
||||
"type": "double precision",
|
||||
"null": false,
|
||||
"size": 8
|
||||
},
|
||||
{
|
||||
"name": "i_max_1",
|
||||
"type": "double precision",
|
||||
"null": false,
|
||||
"size": 8
|
||||
},
|
||||
{
|
||||
"name": "i_max_2",
|
||||
"type": "double precision",
|
||||
"null": false,
|
||||
"size": 8
|
||||
},
|
||||
{
|
||||
"name": "i_max_3",
|
||||
"type": "double precision",
|
||||
"null": false,
|
||||
"size": 8
|
||||
},
|
||||
{
|
||||
"name": "p_gem_1",
|
||||
"type": "double precision",
|
||||
"null": false,
|
||||
"size": 8
|
||||
},
|
||||
{
|
||||
"name": "p_gem_2",
|
||||
"type": "double precision",
|
||||
"null": false,
|
||||
"size": 8
|
||||
},
|
||||
{
|
||||
"name": "p_gem_3",
|
||||
"type": "double precision",
|
||||
"null": false,
|
||||
"size": 8
|
||||
},
|
||||
{
|
||||
"name": "p_max_1",
|
||||
"type": "double precision",
|
||||
"null": false,
|
||||
"size": 8
|
||||
},
|
||||
{
|
||||
"name": "p_max_2",
|
||||
"type": "double precision",
|
||||
"null": false,
|
||||
"size": 8
|
||||
},
|
||||
{
|
||||
"name": "p_max_3",
|
||||
"type": "double precision",
|
||||
"null": false,
|
||||
"size": 8
|
||||
},
|
||||
{
|
||||
"name": "s_gem_1",
|
||||
"type": "double precision",
|
||||
"null": false,
|
||||
"size": 8
|
||||
},
|
||||
{
|
||||
"name": "s_gem_2",
|
||||
"type": "double precision",
|
||||
"null": false,
|
||||
"size": 8
|
||||
},
|
||||
{
|
||||
"name": "s_gem_3",
|
||||
"type": "double precision",
|
||||
"null": false,
|
||||
"size": 8
|
||||
},
|
||||
{
|
||||
"name": "s_max_1",
|
||||
"type": "double precision",
|
||||
"null": false,
|
||||
"size": 8
|
||||
},
|
||||
{
|
||||
"name": "s_max_2",
|
||||
"type": "double precision",
|
||||
"null": false,
|
||||
"size": 8
|
||||
},
|
||||
{
|
||||
"name": "s_max_3",
|
||||
"type": "double precision",
|
||||
"null": false,
|
||||
"size": 8
|
||||
},
|
||||
{
|
||||
"name": "time",
|
||||
"type": "timestamp with time zone",
|
||||
"null": false,
|
||||
"size": 8
|
||||
},
|
||||
{
|
||||
"name": "u_gem_1",
|
||||
"type": "double precision",
|
||||
"null": false,
|
||||
"size": 8
|
||||
},
|
||||
{
|
||||
"name": "u_gem_2",
|
||||
"type": "double precision",
|
||||
"null": false,
|
||||
"size": 8
|
||||
},
|
||||
{
|
||||
"name": "u_gem_3",
|
||||
"type": "double precision",
|
||||
"null": false,
|
||||
"size": 8
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
3
app/internal/model/model.go
Normal file
3
app/internal/model/model.go
Normal file
|
@ -0,0 +1,3 @@
|
|||
package model
|
||||
|
||||
//go:generate qb-generator db.json tables.go
|
71
app/stats.go
Normal file
71
app/stats.go
Normal file
|
@ -0,0 +1,71 @@
|
|||
package app
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"time"
|
||||
|
||||
"git.fuyu.moe/5GPowerQuality/api/app/internal/model"
|
||||
"git.ultraware.nl/NiseVoid/qb"
|
||||
"git.ultraware.nl/NiseVoid/qb/qc"
|
||||
"git.ultraware.nl/NiseVoid/qb/qf"
|
||||
)
|
||||
|
||||
// Count returns the number of measurements
|
||||
func Count() int {
|
||||
m := model.Measurement()
|
||||
|
||||
q := m.Select(qf.CountAll())
|
||||
|
||||
var count *int
|
||||
err := db.QueryRow(q).Scan(&count)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if count == nil {
|
||||
return 0
|
||||
}
|
||||
|
||||
return *count
|
||||
}
|
||||
|
||||
// GetAttribute returns the specified attribute for all phases since the specified date
|
||||
func GetAttribute(attr string, date time.Time) (data []Phases) {
|
||||
m := model.Measurement()
|
||||
|
||||
f := reflect.ValueOf(m).Elem().FieldByName(attr + `1`)
|
||||
if !f.IsValid() || f.Type().Name() != `Field` {
|
||||
return nil
|
||||
}
|
||||
f1 := f.Interface().(*qb.TableField)
|
||||
f2 := reflect.ValueOf(m).Elem().FieldByName(attr + `2`).Interface().(*qb.TableField)
|
||||
f3 := reflect.ValueOf(m).Elem().FieldByName(attr + `3`).Interface().(*qb.TableField)
|
||||
|
||||
q := m.Select(m.Time, f1, f2, f3).
|
||||
OrderBy(qb.Desc(m.Time)).
|
||||
Where(qc.Gte(m.Time, date))
|
||||
|
||||
rows, err := db.Query(q)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
for rows.Next() {
|
||||
var phases Phases
|
||||
err := rows.Scan(&phases.Time, &phases.P1, &phases.P2, &phases.P3)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
data = append(data, phases)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// Phases contains data for all phases
|
||||
type Phases struct {
|
||||
Time time.Time `json:"time"`
|
||||
P1 float64 `json:"phase_1"`
|
||||
P2 float64 `json:"phase_2"`
|
||||
P3 float64 `json:"phase_3"`
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue