Versioned talkgroups
This commit is contained in:
parent
c48d1eaf8d
commit
5fd035561c
13 changed files with 149 additions and 154 deletions
|
@ -124,7 +124,7 @@ SET
|
||||||
alert_config = COALESCE($10, tg.alert_config),
|
alert_config = COALESCE($10, tg.alert_config),
|
||||||
weight = COALESCE($11, tg.weight),
|
weight = COALESCE($11, tg.weight),
|
||||||
learned = COALESCE($12, tg.learned)
|
learned = COALESCE($12, tg.learned)
|
||||||
RETURNING id, system_id, tgid, name, alpha_tag, tg_group, frequency, metadata, tags, alert, alert_config, weight, learned
|
RETURNING id, system_id, tgid, name, alpha_tag, tg_group, frequency, metadata, tags, alert, alert_config, weight, learned, ignored
|
||||||
`
|
`
|
||||||
|
|
||||||
type UpsertTalkgroupBatchResults struct {
|
type UpsertTalkgroupBatchResults struct {
|
||||||
|
@ -196,6 +196,7 @@ func (b *UpsertTalkgroupBatchResults) QueryRow(f func(int, Talkgroup, error)) {
|
||||||
&i.AlertConfig,
|
&i.AlertConfig,
|
||||||
&i.Weight,
|
&i.Weight,
|
||||||
&i.Learned,
|
&i.Learned,
|
||||||
|
&i.Ignored,
|
||||||
)
|
)
|
||||||
if f != nil {
|
if f != nil {
|
||||||
f(t, i, err)
|
f(t, i, err)
|
||||||
|
|
|
@ -123,22 +123,22 @@ func (_c *Store_AddCall_Call) RunAndReturn(run func(context.Context, database.Ad
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddLearnedTalkgroup provides a mock function with given fields: ctx, arg
|
// AddLearnedTalkgroup provides a mock function with given fields: ctx, arg
|
||||||
func (_m *Store) AddLearnedTalkgroup(ctx context.Context, arg database.AddLearnedTalkgroupParams) (int, error) {
|
func (_m *Store) AddLearnedTalkgroup(ctx context.Context, arg database.AddLearnedTalkgroupParams) (database.Talkgroup, error) {
|
||||||
ret := _m.Called(ctx, arg)
|
ret := _m.Called(ctx, arg)
|
||||||
|
|
||||||
if len(ret) == 0 {
|
if len(ret) == 0 {
|
||||||
panic("no return value specified for AddLearnedTalkgroup")
|
panic("no return value specified for AddLearnedTalkgroup")
|
||||||
}
|
}
|
||||||
|
|
||||||
var r0 int
|
var r0 database.Talkgroup
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(0).(func(context.Context, database.AddLearnedTalkgroupParams) (int, error)); ok {
|
if rf, ok := ret.Get(0).(func(context.Context, database.AddLearnedTalkgroupParams) (database.Talkgroup, error)); ok {
|
||||||
return rf(ctx, arg)
|
return rf(ctx, arg)
|
||||||
}
|
}
|
||||||
if rf, ok := ret.Get(0).(func(context.Context, database.AddLearnedTalkgroupParams) int); ok {
|
if rf, ok := ret.Get(0).(func(context.Context, database.AddLearnedTalkgroupParams) database.Talkgroup); ok {
|
||||||
r0 = rf(ctx, arg)
|
r0 = rf(ctx, arg)
|
||||||
} else {
|
} else {
|
||||||
r0 = ret.Get(0).(int)
|
r0 = ret.Get(0).(database.Talkgroup)
|
||||||
}
|
}
|
||||||
|
|
||||||
if rf, ok := ret.Get(1).(func(context.Context, database.AddLearnedTalkgroupParams) error); ok {
|
if rf, ok := ret.Get(1).(func(context.Context, database.AddLearnedTalkgroupParams) error); ok {
|
||||||
|
@ -169,12 +169,12 @@ func (_c *Store_AddLearnedTalkgroup_Call) Run(run func(ctx context.Context, arg
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *Store_AddLearnedTalkgroup_Call) Return(_a0 int, _a1 error) *Store_AddLearnedTalkgroup_Call {
|
func (_c *Store_AddLearnedTalkgroup_Call) Return(_a0 database.Talkgroup, _a1 error) *Store_AddLearnedTalkgroup_Call {
|
||||||
_c.Call.Return(_a0, _a1)
|
_c.Call.Return(_a0, _a1)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *Store_AddLearnedTalkgroup_Call) RunAndReturn(run func(context.Context, database.AddLearnedTalkgroupParams) (int, error)) *Store_AddLearnedTalkgroup_Call {
|
func (_c *Store_AddLearnedTalkgroup_Call) RunAndReturn(run func(context.Context, database.AddLearnedTalkgroupParams) (database.Talkgroup, error)) *Store_AddLearnedTalkgroup_Call {
|
||||||
_c.Call.Return(run)
|
_c.Call.Return(run)
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
|
@ -96,6 +96,7 @@ type Talkgroup struct {
|
||||||
AlertConfig rules.AlertRules `json:"alert_config"`
|
AlertConfig rules.AlertRules `json:"alert_config"`
|
||||||
Weight float32 `json:"weight"`
|
Weight float32 `json:"weight"`
|
||||||
Learned bool `json:"learned"`
|
Learned bool `json:"learned"`
|
||||||
|
Ignored bool `json:"ignored"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type TalkgroupVersion struct {
|
type TalkgroupVersion struct {
|
||||||
|
@ -116,16 +117,6 @@ type TalkgroupVersion struct {
|
||||||
Learned *bool `json:"learned"`
|
Learned *bool `json:"learned"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type TalkgroupsLearned struct {
|
|
||||||
ID int `json:"id"`
|
|
||||||
SystemID int `json:"system_id"`
|
|
||||||
TGID int `json:"tgid"`
|
|
||||||
Name string `json:"name"`
|
|
||||||
AlphaTag *string `json:"alpha_tag"`
|
|
||||||
TGGroup *string `json:"tg_group"`
|
|
||||||
Ignored *bool `json:"ignored"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type User struct {
|
type User struct {
|
||||||
ID int `json:"id"`
|
ID int `json:"id"`
|
||||||
Username string `json:"username"`
|
Username string `json:"username"`
|
||||||
|
|
|
@ -14,7 +14,7 @@ import (
|
||||||
type Querier interface {
|
type Querier interface {
|
||||||
AddAlert(ctx context.Context, arg AddAlertParams) error
|
AddAlert(ctx context.Context, arg AddAlertParams) error
|
||||||
AddCall(ctx context.Context, arg AddCallParams) error
|
AddCall(ctx context.Context, arg AddCallParams) error
|
||||||
AddLearnedTalkgroup(ctx context.Context, arg AddLearnedTalkgroupParams) (int, error)
|
AddLearnedTalkgroup(ctx context.Context, arg AddLearnedTalkgroupParams) (Talkgroup, error)
|
||||||
AddTalkgroupWithLearnedFlag(ctx context.Context, systemID int32, tGID int32) error
|
AddTalkgroupWithLearnedFlag(ctx context.Context, systemID int32, tGID int32) error
|
||||||
CreateAPIKey(ctx context.Context, owner int, expires pgtype.Timestamp, disabled *bool) (ApiKey, error)
|
CreateAPIKey(ctx context.Context, owner int, expires pgtype.Timestamp, disabled *bool) (ApiKey, error)
|
||||||
CreateUser(ctx context.Context, arg CreateUserParams) (User, error)
|
CreateUser(ctx context.Context, arg CreateUserParams) (User, error)
|
||||||
|
|
|
@ -41,20 +41,11 @@ func (t *TGTuples) Append(sys, tg uint32) {
|
||||||
// Below queries are here because sqlc refuses to parse unnest(x, y)
|
// Below queries are here because sqlc refuses to parse unnest(x, y)
|
||||||
|
|
||||||
const getTalkgroupsWithLearnedBySysTGID = `SELECT
|
const getTalkgroupsWithLearnedBySysTGID = `SELECT
|
||||||
tg.id, tg.system_id, tg.tgid, tg.name, tg.alpha_tag, tg.tg_group, tg.frequency, tg.metadata, tg.tags, tg.alert, tg.alert_config, tg.weight, sys.id, sys.name, tg.learned
|
tg.id, tg.system_id, tg.tgid, tg.name, tg.alpha_tag, tg.tg_group, tg.frequency, tg.metadata, tg.tags, tg.alert, tg.alert_config, tg.weight, sys.id, sys.name, tg.learned, tg.ignored
|
||||||
FROM talkgroups tg
|
FROM talkgroups tg
|
||||||
JOIN systems sys ON tg.system_id = sys.id
|
JOIN systems sys ON tg.system_id = sys.id
|
||||||
JOIN UNNEST($1::INT4[], $2::INT4[]) AS tgt(sys, tg) ON (tg.system_id = tgt.sys AND tg.tgid = tgt.tg)
|
JOIN UNNEST($1::INT4[], $2::INT4[]) AS tgt(sys, tg) ON (tg.system_id = tgt.sys AND tg.tgid = tgt.tg)
|
||||||
WHERE tg.learned IS NOT TRUE
|
WHERE tg.learned IS NOT TRUE;`
|
||||||
UNION
|
|
||||||
SELECT
|
|
||||||
tgl.id, tgl.system_id::INT4, tgl.tgid::INT4, tgl.name,
|
|
||||||
tgl.alpha_tag, tgl.tg_group, NULL::INTEGER, NULL::JSONB,
|
|
||||||
CASE WHEN tgl.tg_group IS NULL THEN NULL ELSE ARRAY[tgl.tg_group] END,
|
|
||||||
NOT tgl.ignored, NULL::JSONB, 1.0, sys.id, sys.name, TRUE learned
|
|
||||||
FROM talkgroups_learned tgl
|
|
||||||
JOIN systems sys ON tgl.system_id = sys.id
|
|
||||||
JOIN UNNEST($1::INT4[], $2::INT4[]) AS tgt(sys, tg) ON (tgl.system_id = tgt.sys AND tgl.tgid = tgt.tg);`
|
|
||||||
|
|
||||||
type GetTalkgroupsRow struct {
|
type GetTalkgroupsRow struct {
|
||||||
Talkgroup Talkgroup `json:"talkgroup"`
|
Talkgroup Talkgroup `json:"talkgroup"`
|
||||||
|
@ -86,6 +77,7 @@ func (q *Queries) GetTalkgroupsWithLearnedBySysTGID(ctx context.Context, ids TGT
|
||||||
&i.System.ID,
|
&i.System.ID,
|
||||||
&i.System.Name,
|
&i.System.Name,
|
||||||
&i.Talkgroup.Learned,
|
&i.Talkgroup.Learned,
|
||||||
|
&i.Talkgroup.Ignored,
|
||||||
); err != nil {
|
); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -97,7 +89,7 @@ func (q *Queries) GetTalkgroupsWithLearnedBySysTGID(ctx context.Context, ids TGT
|
||||||
return items, nil
|
return items, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
const getTalkgroupsBySysTGID = `SELECT tg.id, tg.system_id, tg.tgid, tg.name, tg.alpha_tag, tg.tg_group, tg.frequency, tg.metadata, tg.tags, tg.alert, tg.alert_config, tg.weight, sys.id, sys.name FROM talkgroups tg
|
const getTalkgroupsBySysTGID = `SELECT tg.id, tg.system_id, tg.tgid, tg.name, tg.alpha_tag, tg.tg_group, tg.frequency, tg.metadata, tg.tags, tg.alert, tg.alert_config, tg.weight, tg.learned, tg.ignored, sys.id, sys.name FROM talkgroups tg
|
||||||
JOIN systems sys ON tg.system_id = sys.id
|
JOIN systems sys ON tg.system_id = sys.id
|
||||||
JOIN UNNEST($1::INT4[], $2::INT4[]) AS tgt(sys, tg) ON (tg.system_id = tgt.sys AND tg.tgid = tgt.tg)
|
JOIN UNNEST($1::INT4[], $2::INT4[]) AS tgt(sys, tg) ON (tg.system_id = tgt.sys AND tg.tgid = tgt.tg)
|
||||||
WHERE tg.learned IS NOT TRUE;`
|
WHERE tg.learned IS NOT TRUE;`
|
||||||
|
@ -124,6 +116,8 @@ func (q *Queries) GetTalkgroupsBySysTGID(ctx context.Context, ids TGTuples) ([]G
|
||||||
&i.Talkgroup.Alert,
|
&i.Talkgroup.Alert,
|
||||||
&i.Talkgroup.AlertConfig,
|
&i.Talkgroup.AlertConfig,
|
||||||
&i.Talkgroup.Weight,
|
&i.Talkgroup.Weight,
|
||||||
|
&i.Talkgroup.Learned,
|
||||||
|
&i.Talkgroup.Ignored,
|
||||||
&i.System.ID,
|
&i.System.ID,
|
||||||
&i.System.Name,
|
&i.System.Name,
|
||||||
); err != nil {
|
); err != nil {
|
||||||
|
|
|
@ -13,30 +13,32 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const addLearnedTalkgroup = `-- name: AddLearnedTalkgroup :one
|
const addLearnedTalkgroup = `-- name: AddLearnedTalkgroup :one
|
||||||
INSERT INTO talkgroups_learned(
|
INSERT INTO talkgroups(
|
||||||
system_id,
|
system_id,
|
||||||
tgid,
|
tgid,
|
||||||
|
learned,
|
||||||
name,
|
name,
|
||||||
alpha_tag,
|
alpha_tag,
|
||||||
tg_group
|
tg_group
|
||||||
) VALUES (
|
) VALUES (
|
||||||
$1,
|
$1,
|
||||||
$2,
|
$2,
|
||||||
|
TRUE,
|
||||||
$3,
|
$3,
|
||||||
$4,
|
$4,
|
||||||
$5
|
$5
|
||||||
) RETURNING id
|
) RETURNING id, system_id, tgid, name, alpha_tag, tg_group, frequency, metadata, tags, alert, alert_config, weight, learned, ignored
|
||||||
`
|
`
|
||||||
|
|
||||||
type AddLearnedTalkgroupParams struct {
|
type AddLearnedTalkgroupParams struct {
|
||||||
SystemID int `json:"system_id"`
|
SystemID int32 `json:"system_id"`
|
||||||
TGID int `json:"tgid"`
|
TGID int32 `json:"tgid"`
|
||||||
Name *string `json:"name"`
|
Name *string `json:"name"`
|
||||||
AlphaTag *string `json:"alpha_tag"`
|
AlphaTag *string `json:"alpha_tag"`
|
||||||
TGGroup *string `json:"tg_group"`
|
TGGroup *string `json:"tg_group"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (q *Queries) AddLearnedTalkgroup(ctx context.Context, arg AddLearnedTalkgroupParams) (int, error) {
|
func (q *Queries) AddLearnedTalkgroup(ctx context.Context, arg AddLearnedTalkgroupParams) (Talkgroup, error) {
|
||||||
row := q.db.QueryRow(ctx, addLearnedTalkgroup,
|
row := q.db.QueryRow(ctx, addLearnedTalkgroup,
|
||||||
arg.SystemID,
|
arg.SystemID,
|
||||||
arg.TGID,
|
arg.TGID,
|
||||||
|
@ -44,9 +46,24 @@ func (q *Queries) AddLearnedTalkgroup(ctx context.Context, arg AddLearnedTalkgro
|
||||||
arg.AlphaTag,
|
arg.AlphaTag,
|
||||||
arg.TGGroup,
|
arg.TGGroup,
|
||||||
)
|
)
|
||||||
var id int
|
var i Talkgroup
|
||||||
err := row.Scan(&id)
|
err := row.Scan(
|
||||||
return id, err
|
&i.ID,
|
||||||
|
&i.SystemID,
|
||||||
|
&i.TGID,
|
||||||
|
&i.Name,
|
||||||
|
&i.AlphaTag,
|
||||||
|
&i.TGGroup,
|
||||||
|
&i.Frequency,
|
||||||
|
&i.Metadata,
|
||||||
|
&i.Tags,
|
||||||
|
&i.Alert,
|
||||||
|
&i.AlertConfig,
|
||||||
|
&i.Weight,
|
||||||
|
&i.Learned,
|
||||||
|
&i.Ignored,
|
||||||
|
)
|
||||||
|
return i, err
|
||||||
}
|
}
|
||||||
|
|
||||||
const addTalkgroupWithLearnedFlag = `-- name: AddTalkgroupWithLearnedFlag :exec
|
const addTalkgroupWithLearnedFlag = `-- name: AddTalkgroupWithLearnedFlag :exec
|
||||||
|
@ -78,7 +95,7 @@ func (q *Queries) GetSystemName(ctx context.Context, systemID int) (string, erro
|
||||||
}
|
}
|
||||||
|
|
||||||
const getTalkgroup = `-- name: GetTalkgroup :one
|
const getTalkgroup = `-- name: GetTalkgroup :one
|
||||||
SELECT talkgroups.id, talkgroups.system_id, talkgroups.tgid, talkgroups.name, talkgroups.alpha_tag, talkgroups.tg_group, talkgroups.frequency, talkgroups.metadata, talkgroups.tags, talkgroups.alert, talkgroups.alert_config, talkgroups.weight, talkgroups.learned FROM talkgroups
|
SELECT talkgroups.id, talkgroups.system_id, talkgroups.tgid, talkgroups.name, talkgroups.alpha_tag, talkgroups.tg_group, talkgroups.frequency, talkgroups.metadata, talkgroups.tags, talkgroups.alert, talkgroups.alert_config, talkgroups.weight, talkgroups.learned, talkgroups.ignored FROM talkgroups
|
||||||
WHERE (system_id, tgid) = ($1, $2)
|
WHERE (system_id, tgid) = ($1, $2)
|
||||||
`
|
`
|
||||||
|
|
||||||
|
@ -103,6 +120,7 @@ func (q *Queries) GetTalkgroup(ctx context.Context, systemID int32, tGID int32)
|
||||||
&i.Talkgroup.AlertConfig,
|
&i.Talkgroup.AlertConfig,
|
||||||
&i.Talkgroup.Weight,
|
&i.Talkgroup.Weight,
|
||||||
&i.Talkgroup.Learned,
|
&i.Talkgroup.Learned,
|
||||||
|
&i.Talkgroup.Ignored,
|
||||||
)
|
)
|
||||||
return i, err
|
return i, err
|
||||||
}
|
}
|
||||||
|
@ -153,19 +171,10 @@ func (q *Queries) GetTalkgroupTags(ctx context.Context, systemID int32, tGID int
|
||||||
|
|
||||||
const getTalkgroupWithLearned = `-- name: GetTalkgroupWithLearned :one
|
const getTalkgroupWithLearned = `-- name: GetTalkgroupWithLearned :one
|
||||||
SELECT
|
SELECT
|
||||||
tg.id, tg.system_id, tg.tgid, tg.name, tg.alpha_tag, tg.tg_group, tg.frequency, tg.metadata, tg.tags, tg.alert, tg.alert_config, tg.weight, tg.learned, sys.id, sys.name
|
tg.id, tg.system_id, tg.tgid, tg.name, tg.alpha_tag, tg.tg_group, tg.frequency, tg.metadata, tg.tags, tg.alert, tg.alert_config, tg.weight, tg.learned, tg.ignored, sys.id, sys.name
|
||||||
FROM talkgroups tg
|
FROM talkgroups tg
|
||||||
JOIN systems sys ON tg.system_id = sys.id
|
JOIN systems sys ON tg.system_id = sys.id
|
||||||
WHERE (tg.system_id, tg.tgid) = ($1, $2) AND tg.learned IS NOT TRUE
|
WHERE (tg.system_id, tg.tgid) = ($1, $2)
|
||||||
UNION
|
|
||||||
SELECT
|
|
||||||
tgl.id, tgl.system_id::INT4, tgl.tgid::INT4, tgl.name,
|
|
||||||
tgl.alpha_tag, tgl.tg_group, NULL::INTEGER, NULL::JSONB,
|
|
||||||
CASE WHEN tgl.tg_group IS NULL THEN NULL ELSE ARRAY[tgl.tg_group] END,
|
|
||||||
NOT tgl.ignored, NULL::JSONB, 1.0, TRUE learned, sys.id, sys.name
|
|
||||||
FROM talkgroups_learned tgl
|
|
||||||
JOIN systems sys ON tgl.system_id = sys.id
|
|
||||||
WHERE tgl.system_id = $1 AND tgl.tgid = $2 AND ignored IS NOT TRUE
|
|
||||||
`
|
`
|
||||||
|
|
||||||
type GetTalkgroupWithLearnedRow struct {
|
type GetTalkgroupWithLearnedRow struct {
|
||||||
|
@ -190,6 +199,7 @@ func (q *Queries) GetTalkgroupWithLearned(ctx context.Context, systemID int32, t
|
||||||
&i.Talkgroup.AlertConfig,
|
&i.Talkgroup.AlertConfig,
|
||||||
&i.Talkgroup.Weight,
|
&i.Talkgroup.Weight,
|
||||||
&i.Talkgroup.Learned,
|
&i.Talkgroup.Learned,
|
||||||
|
&i.Talkgroup.Ignored,
|
||||||
&i.System.ID,
|
&i.System.ID,
|
||||||
&i.System.Name,
|
&i.System.Name,
|
||||||
)
|
)
|
||||||
|
@ -197,7 +207,7 @@ func (q *Queries) GetTalkgroupWithLearned(ctx context.Context, systemID int32, t
|
||||||
}
|
}
|
||||||
|
|
||||||
const getTalkgroupsWithAllTags = `-- name: GetTalkgroupsWithAllTags :many
|
const getTalkgroupsWithAllTags = `-- name: GetTalkgroupsWithAllTags :many
|
||||||
SELECT talkgroups.id, talkgroups.system_id, talkgroups.tgid, talkgroups.name, talkgroups.alpha_tag, talkgroups.tg_group, talkgroups.frequency, talkgroups.metadata, talkgroups.tags, talkgroups.alert, talkgroups.alert_config, talkgroups.weight, talkgroups.learned FROM talkgroups
|
SELECT talkgroups.id, talkgroups.system_id, talkgroups.tgid, talkgroups.name, talkgroups.alpha_tag, talkgroups.tg_group, talkgroups.frequency, talkgroups.metadata, talkgroups.tags, talkgroups.alert, talkgroups.alert_config, talkgroups.weight, talkgroups.learned, talkgroups.ignored FROM talkgroups
|
||||||
WHERE tags && ARRAY[$1]
|
WHERE tags && ARRAY[$1]
|
||||||
`
|
`
|
||||||
|
|
||||||
|
@ -228,6 +238,7 @@ func (q *Queries) GetTalkgroupsWithAllTags(ctx context.Context, tags []string) (
|
||||||
&i.Talkgroup.AlertConfig,
|
&i.Talkgroup.AlertConfig,
|
||||||
&i.Talkgroup.Weight,
|
&i.Talkgroup.Weight,
|
||||||
&i.Talkgroup.Learned,
|
&i.Talkgroup.Learned,
|
||||||
|
&i.Talkgroup.Ignored,
|
||||||
); err != nil {
|
); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -240,7 +251,7 @@ func (q *Queries) GetTalkgroupsWithAllTags(ctx context.Context, tags []string) (
|
||||||
}
|
}
|
||||||
|
|
||||||
const getTalkgroupsWithAnyTags = `-- name: GetTalkgroupsWithAnyTags :many
|
const getTalkgroupsWithAnyTags = `-- name: GetTalkgroupsWithAnyTags :many
|
||||||
SELECT talkgroups.id, talkgroups.system_id, talkgroups.tgid, talkgroups.name, talkgroups.alpha_tag, talkgroups.tg_group, talkgroups.frequency, talkgroups.metadata, talkgroups.tags, talkgroups.alert, talkgroups.alert_config, talkgroups.weight, talkgroups.learned FROM talkgroups
|
SELECT talkgroups.id, talkgroups.system_id, talkgroups.tgid, talkgroups.name, talkgroups.alpha_tag, talkgroups.tg_group, talkgroups.frequency, talkgroups.metadata, talkgroups.tags, talkgroups.alert, talkgroups.alert_config, talkgroups.weight, talkgroups.learned, talkgroups.ignored FROM talkgroups
|
||||||
WHERE tags @> ARRAY[$1]
|
WHERE tags @> ARRAY[$1]
|
||||||
`
|
`
|
||||||
|
|
||||||
|
@ -271,6 +282,7 @@ func (q *Queries) GetTalkgroupsWithAnyTags(ctx context.Context, tags []string) (
|
||||||
&i.Talkgroup.AlertConfig,
|
&i.Talkgroup.AlertConfig,
|
||||||
&i.Talkgroup.Weight,
|
&i.Talkgroup.Weight,
|
||||||
&i.Talkgroup.Learned,
|
&i.Talkgroup.Learned,
|
||||||
|
&i.Talkgroup.Ignored,
|
||||||
); err != nil {
|
); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -284,18 +296,9 @@ func (q *Queries) GetTalkgroupsWithAnyTags(ctx context.Context, tags []string) (
|
||||||
|
|
||||||
const getTalkgroupsWithLearned = `-- name: GetTalkgroupsWithLearned :many
|
const getTalkgroupsWithLearned = `-- name: GetTalkgroupsWithLearned :many
|
||||||
SELECT
|
SELECT
|
||||||
tg.id, tg.system_id, tg.tgid, tg.name, tg.alpha_tag, tg.tg_group, tg.frequency, tg.metadata, tg.tags, tg.alert, tg.alert_config, tg.weight, tg.learned, sys.id, sys.name
|
tg.id, tg.system_id, tg.tgid, tg.name, tg.alpha_tag, tg.tg_group, tg.frequency, tg.metadata, tg.tags, tg.alert, tg.alert_config, tg.weight, tg.learned, tg.ignored, sys.id, sys.name
|
||||||
FROM talkgroups tg
|
FROM talkgroups tg
|
||||||
JOIN systems sys ON tg.system_id = sys.id
|
JOIN systems sys ON tg.system_id = sys.id
|
||||||
WHERE tg.learned IS NOT TRUE
|
|
||||||
UNION
|
|
||||||
SELECT
|
|
||||||
tgl.id, tgl.system_id::INT4, tgl.tgid::INT4, tgl.name,
|
|
||||||
tgl.alpha_tag, tgl.tg_group, NULL::INTEGER, NULL::JSONB,
|
|
||||||
CASE WHEN tgl.tg_group IS NULL THEN NULL ELSE ARRAY[tgl.tg_group] END,
|
|
||||||
NOT tgl.ignored, NULL::JSONB, 1.0, TRUE learned, sys.id, sys.name
|
|
||||||
FROM talkgroups_learned tgl
|
|
||||||
JOIN systems sys ON tgl.system_id = sys.id
|
|
||||||
WHERE ignored IS NOT TRUE
|
WHERE ignored IS NOT TRUE
|
||||||
`
|
`
|
||||||
|
|
||||||
|
@ -327,6 +330,7 @@ func (q *Queries) GetTalkgroupsWithLearned(ctx context.Context) ([]GetTalkgroups
|
||||||
&i.Talkgroup.AlertConfig,
|
&i.Talkgroup.AlertConfig,
|
||||||
&i.Talkgroup.Weight,
|
&i.Talkgroup.Weight,
|
||||||
&i.Talkgroup.Learned,
|
&i.Talkgroup.Learned,
|
||||||
|
&i.Talkgroup.Ignored,
|
||||||
&i.System.ID,
|
&i.System.ID,
|
||||||
&i.System.Name,
|
&i.System.Name,
|
||||||
); err != nil {
|
); err != nil {
|
||||||
|
@ -342,19 +346,10 @@ func (q *Queries) GetTalkgroupsWithLearned(ctx context.Context) ([]GetTalkgroups
|
||||||
|
|
||||||
const getTalkgroupsWithLearnedBySystem = `-- name: GetTalkgroupsWithLearnedBySystem :many
|
const getTalkgroupsWithLearnedBySystem = `-- name: GetTalkgroupsWithLearnedBySystem :many
|
||||||
SELECT
|
SELECT
|
||||||
tg.id, tg.system_id, tg.tgid, tg.name, tg.alpha_tag, tg.tg_group, tg.frequency, tg.metadata, tg.tags, tg.alert, tg.alert_config, tg.weight, tg.learned, sys.id, sys.name
|
tg.id, tg.system_id, tg.tgid, tg.name, tg.alpha_tag, tg.tg_group, tg.frequency, tg.metadata, tg.tags, tg.alert, tg.alert_config, tg.weight, tg.learned, tg.ignored, sys.id, sys.name
|
||||||
FROM talkgroups tg
|
FROM talkgroups tg
|
||||||
JOIN systems sys ON tg.system_id = sys.id
|
JOIN systems sys ON tg.system_id = sys.id
|
||||||
WHERE tg.system_id = $1 AND tg.learned IS NOT TRUE
|
WHERE tg.system_id = $1
|
||||||
UNION
|
|
||||||
SELECT
|
|
||||||
tgl.id, tgl.system_id::INT4, tgl.tgid::INT4, tgl.name,
|
|
||||||
tgl.alpha_tag, tgl.tg_group, NULL::INTEGER, NULL::JSONB,
|
|
||||||
CASE WHEN tgl.tg_group IS NULL THEN NULL ELSE ARRAY[tgl.tg_group] END,
|
|
||||||
NOT tgl.ignored, NULL::JSONB, 1.0, TRUE learned, sys.id, sys.name
|
|
||||||
FROM talkgroups_learned tgl
|
|
||||||
JOIN systems sys ON tgl.system_id = sys.id
|
|
||||||
WHERE tgl.system_id = $1 AND ignored IS NOT TRUE
|
|
||||||
`
|
`
|
||||||
|
|
||||||
type GetTalkgroupsWithLearnedBySystemRow struct {
|
type GetTalkgroupsWithLearnedBySystemRow struct {
|
||||||
|
@ -385,6 +380,7 @@ func (q *Queries) GetTalkgroupsWithLearnedBySystem(ctx context.Context, system i
|
||||||
&i.Talkgroup.AlertConfig,
|
&i.Talkgroup.AlertConfig,
|
||||||
&i.Talkgroup.Weight,
|
&i.Talkgroup.Weight,
|
||||||
&i.Talkgroup.Learned,
|
&i.Talkgroup.Learned,
|
||||||
|
&i.Talkgroup.Ignored,
|
||||||
&i.System.ID,
|
&i.System.ID,
|
||||||
&i.System.Name,
|
&i.System.Name,
|
||||||
); err != nil {
|
); err != nil {
|
||||||
|
@ -422,7 +418,7 @@ SET
|
||||||
weight = COALESCE($9, weight),
|
weight = COALESCE($9, weight),
|
||||||
learned = COALESCE($10, learned)
|
learned = COALESCE($10, learned)
|
||||||
WHERE id = $11 OR (system_id = $12 AND tgid = $13)
|
WHERE id = $11 OR (system_id = $12 AND tgid = $13)
|
||||||
RETURNING id, system_id, tgid, name, alpha_tag, tg_group, frequency, metadata, tags, alert, alert_config, weight, learned
|
RETURNING id, system_id, tgid, name, alpha_tag, tg_group, frequency, metadata, tags, alert, alert_config, weight, learned, ignored
|
||||||
`
|
`
|
||||||
|
|
||||||
type UpdateTalkgroupParams struct {
|
type UpdateTalkgroupParams struct {
|
||||||
|
@ -472,6 +468,7 @@ func (q *Queries) UpdateTalkgroup(ctx context.Context, arg UpdateTalkgroupParams
|
||||||
&i.AlertConfig,
|
&i.AlertConfig,
|
||||||
&i.Weight,
|
&i.Weight,
|
||||||
&i.Learned,
|
&i.Learned,
|
||||||
|
&i.Ignored,
|
||||||
)
|
)
|
||||||
return i, err
|
return i, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,64 +0,0 @@
|
||||||
package database
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
)
|
|
||||||
|
|
||||||
const getTalkgroupWithLearnedTest = `-- name: GetTalkgroupWithLearned :one
|
|
||||||
SELECT
|
|
||||||
tg.id, tg.system_id, tg.tgid, tg.name, tg.alpha_tag, tg.tg_group, tg.frequency, tg.metadata, tg.tags, tg.alert, tg.alert_config, tg.weight, tg.learned, sys.id, sys.name
|
|
||||||
FROM talkgroups tg
|
|
||||||
JOIN systems sys ON tg.system_id = sys.id
|
|
||||||
WHERE (tg.system_id, tg.tgid) = ($1, $2) AND tg.learned IS NOT TRUE
|
|
||||||
UNION
|
|
||||||
SELECT
|
|
||||||
tgl.id, tgl.system_id::INT4, tgl.tgid::INT4, tgl.name,
|
|
||||||
tgl.alpha_tag, tgl.tg_group, NULL::INTEGER, NULL::JSONB,
|
|
||||||
CASE WHEN tgl.tg_group IS NULL THEN NULL ELSE ARRAY[tgl.tg_group] END,
|
|
||||||
NOT tgl.ignored, NULL::JSONB, 1.0, TRUE learned, sys.id, sys.name
|
|
||||||
FROM talkgroups_learned tgl
|
|
||||||
JOIN systems sys ON tgl.system_id = sys.id
|
|
||||||
WHERE tgl.system_id = $1 AND tgl.tgid = $2 AND ignored IS NOT TRUE
|
|
||||||
`
|
|
||||||
|
|
||||||
const getTalkgroupsWithLearnedBySystemTest = `-- name: GetTalkgroupsWithLearnedBySystem :many
|
|
||||||
SELECT
|
|
||||||
tg.id, tg.system_id, tg.tgid, tg.name, tg.alpha_tag, tg.tg_group, tg.frequency, tg.metadata, tg.tags, tg.alert, tg.alert_config, tg.weight, tg.learned, sys.id, sys.name
|
|
||||||
FROM talkgroups tg
|
|
||||||
JOIN systems sys ON tg.system_id = sys.id
|
|
||||||
WHERE tg.system_id = $1 AND tg.learned IS NOT TRUE
|
|
||||||
UNION
|
|
||||||
SELECT
|
|
||||||
tgl.id, tgl.system_id::INT4, tgl.tgid::INT4, tgl.name,
|
|
||||||
tgl.alpha_tag, tgl.tg_group, NULL::INTEGER, NULL::JSONB,
|
|
||||||
CASE WHEN tgl.tg_group IS NULL THEN NULL ELSE ARRAY[tgl.tg_group] END,
|
|
||||||
NOT tgl.ignored, NULL::JSONB, 1.0, TRUE learned, sys.id, sys.name
|
|
||||||
FROM talkgroups_learned tgl
|
|
||||||
JOIN systems sys ON tgl.system_id = sys.id
|
|
||||||
WHERE tgl.system_id = $1 AND ignored IS NOT TRUE
|
|
||||||
`
|
|
||||||
|
|
||||||
const getTalkgroupsWithLearnedTest = `-- name: GetTalkgroupsWithLearned :many
|
|
||||||
SELECT
|
|
||||||
tg.id, tg.system_id, tg.tgid, tg.name, tg.alpha_tag, tg.tg_group, tg.frequency, tg.metadata, tg.tags, tg.alert, tg.alert_config, tg.weight, tg.learned, sys.id, sys.name
|
|
||||||
FROM talkgroups tg
|
|
||||||
JOIN systems sys ON tg.system_id = sys.id
|
|
||||||
WHERE tg.learned IS NOT TRUE
|
|
||||||
UNION
|
|
||||||
SELECT
|
|
||||||
tgl.id, tgl.system_id::INT4, tgl.tgid::INT4, tgl.name,
|
|
||||||
tgl.alpha_tag, tgl.tg_group, NULL::INTEGER, NULL::JSONB,
|
|
||||||
CASE WHEN tgl.tg_group IS NULL THEN NULL ELSE ARRAY[tgl.tg_group] END,
|
|
||||||
NOT tgl.ignored, NULL::JSONB, 1.0, TRUE learned, sys.id, sys.name
|
|
||||||
FROM talkgroups_learned tgl
|
|
||||||
JOIN systems sys ON tgl.system_id = sys.id
|
|
||||||
WHERE ignored IS NOT TRUE
|
|
||||||
`
|
|
||||||
|
|
||||||
func TestQueryColumnsMatch(t *testing.T) {
|
|
||||||
assert.Equal(t, getTalkgroupWithLearnedTest, getTalkgroupWithLearned)
|
|
||||||
assert.Equal(t, getTalkgroupsWithLearnedBySystemTest, getTalkgroupsWithLearnedBySystem)
|
|
||||||
assert.Equal(t, getTalkgroupsWithLearnedTest, getTalkgroupsWithLearned)
|
|
||||||
}
|
|
|
@ -16,6 +16,7 @@ import (
|
||||||
"dynatron.me/x/stillbox/pkg/database/mocks"
|
"dynatron.me/x/stillbox/pkg/database/mocks"
|
||||||
"dynatron.me/x/stillbox/pkg/talkgroups"
|
"dynatron.me/x/stillbox/pkg/talkgroups"
|
||||||
"dynatron.me/x/stillbox/pkg/talkgroups/importer"
|
"dynatron.me/x/stillbox/pkg/talkgroups/importer"
|
||||||
|
"dynatron.me/x/stillbox/pkg/talkgroups/tgstore"
|
||||||
)
|
)
|
||||||
|
|
||||||
func getFixture(fixture string) []byte {
|
func getFixture(fixture string) []byte {
|
||||||
|
@ -62,7 +63,7 @@ func TestImport(t *testing.T) {
|
||||||
dbMock.EXPECT().GetSystemName(mock.AnythingOfType("*context.valueCtx"), tc.sysID).Return(tc.sysName, nil)
|
dbMock.EXPECT().GetSystemName(mock.AnythingOfType("*context.valueCtx"), tc.sysID).Return(tc.sysName, nil)
|
||||||
}
|
}
|
||||||
ctx := database.CtxWithDB(context.Background(), dbMock)
|
ctx := database.CtxWithDB(context.Background(), dbMock)
|
||||||
ctx = talkgroups.CtxWithStore(ctx, talkgroups.NewCache())
|
ctx = tgstore.CtxWithStore(ctx, tgstore.NewCache())
|
||||||
ij := &importer.ImportJob{
|
ij := &importer.ImportJob{
|
||||||
Type: importer.ImportSource(tc.impType),
|
Type: importer.ImportSource(tc.impType),
|
||||||
SystemID: tc.sysID,
|
SystemID: tc.sysID,
|
||||||
|
|
2
pkg/talkgroups/importer/testdata/riscon.json
vendored
2
pkg/talkgroups/importer/testdata/riscon.json
vendored
File diff suppressed because one or more lines are too long
|
@ -40,7 +40,7 @@ type Store interface {
|
||||||
TGs(ctx context.Context, tgs tgsp.IDs) ([]*tgsp.Talkgroup, error)
|
TGs(ctx context.Context, tgs tgsp.IDs) ([]*tgsp.Talkgroup, error)
|
||||||
|
|
||||||
// LearnTG learns the talkgroup from a Call.
|
// LearnTG learns the talkgroup from a Call.
|
||||||
LearnTG(ctx context.Context, call *calls.Call) (learnedId int, err error)
|
LearnTG(ctx context.Context, call *calls.Call) (*tgsp.Talkgroup, error)
|
||||||
|
|
||||||
// SystemTGs retrieves all Talkgroups associated with a System.
|
// SystemTGs retrieves all Talkgroups associated with a System.
|
||||||
SystemTGs(ctx context.Context, systemID int32) ([]*tgsp.Talkgroup, error)
|
SystemTGs(ctx context.Context, systemID int32) ([]*tgsp.Talkgroup, error)
|
||||||
|
@ -305,20 +305,40 @@ func (t *cache) UpdateTG(ctx context.Context, input database.UpdateTalkgroupPara
|
||||||
return record, nil
|
return record, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *cache) LearnTG(ctx context.Context, c *calls.Call) (learnedId int, err error) {
|
func (t *cache) LearnTG(ctx context.Context, c *calls.Call) (*tgsp.Talkgroup, error) {
|
||||||
db := database.FromCtx(ctx)
|
db := database.FromCtx(ctx)
|
||||||
err = db.AddTalkgroupWithLearnedFlag(ctx, int32(c.System), int32(c.Talkgroup))
|
err := db.AddTalkgroupWithLearnedFlag(ctx, int32(c.System), int32(c.Talkgroup))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, fmt.Errorf("addTalkgroupWithLearnedFlag: %w", err)
|
return nil, fmt.Errorf("addTalkgroupWithLearnedFlag: %w", err)
|
||||||
|
}
|
||||||
|
sys, has := t.SystemName(ctx, c.System)
|
||||||
|
if !has {
|
||||||
|
return nil, ErrNoSuchSystem
|
||||||
}
|
}
|
||||||
|
|
||||||
return db.AddLearnedTalkgroup(ctx, database.AddLearnedTalkgroupParams{
|
tgm, err := db.AddLearnedTalkgroup(ctx, database.AddLearnedTalkgroupParams{
|
||||||
SystemID: c.System,
|
SystemID: int32(c.System),
|
||||||
TGID: c.Talkgroup,
|
TGID: int32(c.Talkgroup),
|
||||||
Name: c.TalkgroupLabel,
|
Name: c.TalkgroupLabel,
|
||||||
AlphaTag: c.TGAlphaTag,
|
AlphaTag: c.TGAlphaTag,
|
||||||
TGGroup: c.TalkgroupGroup,
|
TGGroup: c.TalkgroupGroup,
|
||||||
})
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
tg := &tgsp.Talkgroup{
|
||||||
|
Talkgroup: tgm,
|
||||||
|
System: database.System{
|
||||||
|
ID: c.System,
|
||||||
|
Name: sys,
|
||||||
|
},
|
||||||
|
Learned: tgm.Learned,
|
||||||
|
}
|
||||||
|
|
||||||
|
t.add(tg)
|
||||||
|
|
||||||
|
return tg, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *cache) UpsertTGs(ctx context.Context, system int, input []database.UpsertTalkgroupParams) ([]*tgsp.Talkgroup, error) {
|
func (t *cache) UpsertTGs(ctx context.Context, system int, input []database.UpsertTalkgroupParams) ([]*tgsp.Talkgroup, error) {
|
||||||
|
|
|
@ -1 +1,30 @@
|
||||||
|
CREATE TABLE IF NOT EXISTS talkgroups_learned(
|
||||||
|
id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
|
||||||
|
system_id INTEGER REFERENCES systems(id) NOT NULL,
|
||||||
|
tgid INTEGER NOT NULL,
|
||||||
|
name TEXT NOT NULL,
|
||||||
|
alpha_tag TEXT,
|
||||||
|
tg_group TEXT,
|
||||||
|
ignored BOOLEAN,
|
||||||
|
UNIQUE (system_id, tgid, name)
|
||||||
|
);
|
||||||
|
|
||||||
DROP TABLE IF EXISTS talkgroup_versions;
|
DROP TABLE IF EXISTS talkgroup_versions;
|
||||||
|
|
||||||
|
INSERT INTO talkgroups_learned(
|
||||||
|
system_id,
|
||||||
|
tgid,
|
||||||
|
name,
|
||||||
|
alpha_tag,
|
||||||
|
tg_group,
|
||||||
|
ignored
|
||||||
|
) SELECT
|
||||||
|
tg.system_id,
|
||||||
|
tg.tgid,
|
||||||
|
tg.name,
|
||||||
|
tg.alpha_tag,
|
||||||
|
tg.tg_group
|
||||||
|
tg.ignored
|
||||||
|
FROM talkgroups tg;
|
||||||
|
|
||||||
|
ALTER TABLE talkgroups DROP COLUMN ignored;
|
||||||
|
|
|
@ -1,3 +1,25 @@
|
||||||
|
ALTER TABLE talkgroups ADD COLUMN ignored BOOLEAN NOT NULL DEFAULT FALSE;
|
||||||
|
|
||||||
|
INSERT INTO talkgroups(
|
||||||
|
system_id,
|
||||||
|
tgid,
|
||||||
|
name,
|
||||||
|
alpha_tag,
|
||||||
|
tg_group,
|
||||||
|
alert,
|
||||||
|
ignored,
|
||||||
|
learned
|
||||||
|
) SELECT
|
||||||
|
tgl.system_id,
|
||||||
|
tgl.tgid,
|
||||||
|
tgl.name,
|
||||||
|
tgl.alpha_tag,
|
||||||
|
tgl.tg_group,
|
||||||
|
TRUE,
|
||||||
|
tgl.ignored,
|
||||||
|
TRUE
|
||||||
|
FROM talkgroups_learned tgl ON CONFLICT DO NOTHING;
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS talkgroup_versions(
|
CREATE TABLE IF NOT EXISTS talkgroup_versions(
|
||||||
-- version metadata
|
-- version metadata
|
||||||
id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
|
id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
|
||||||
|
@ -15,11 +37,12 @@ CREATE TABLE IF NOT EXISTS talkgroup_versions(
|
||||||
alert BOOLEAN,
|
alert BOOLEAN,
|
||||||
alert_config JSONB,
|
alert_config JSONB,
|
||||||
weight REAL,
|
weight REAL,
|
||||||
learned BOOLEAN
|
learned BOOLEAN,
|
||||||
|
ignored BOOLEAN
|
||||||
);
|
);
|
||||||
|
|
||||||
-- Store current version
|
-- Store current version
|
||||||
INSERT INTO talkgroup_versions(time, created_by,
|
INSERT INTO talkgroup_versions(time,
|
||||||
system_id,
|
system_id,
|
||||||
tgid,
|
tgid,
|
||||||
name,
|
name,
|
||||||
|
@ -32,7 +55,7 @@ INSERT INTO talkgroup_versions(time, created_by,
|
||||||
alert_config,
|
alert_config,
|
||||||
weight,
|
weight,
|
||||||
learned
|
learned
|
||||||
) SELECT NOW(), @submitter,
|
) SELECT NOW(),
|
||||||
tg.system_id,
|
tg.system_id,
|
||||||
tg.tgid,
|
tg.tgid,
|
||||||
tg.name,
|
tg.name,
|
||||||
|
@ -45,5 +68,6 @@ INSERT INTO talkgroup_versions(time, created_by,
|
||||||
tg.alert_config,
|
tg.alert_config,
|
||||||
tg.weight,
|
tg.weight,
|
||||||
tg.learned
|
tg.learned
|
||||||
FROM talkgroups;
|
FROM talkgroups tg;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS talkgroups_learned;
|
||||||
|
|
|
@ -136,16 +136,18 @@ INSERT INTO talkgroups (
|
||||||
);
|
);
|
||||||
|
|
||||||
-- name: AddLearnedTalkgroup :one
|
-- name: AddLearnedTalkgroup :one
|
||||||
INSERT INTO talkgroups_learned(
|
INSERT INTO talkgroups(
|
||||||
system_id,
|
system_id,
|
||||||
tgid,
|
tgid,
|
||||||
|
learned,
|
||||||
name,
|
name,
|
||||||
alpha_tag,
|
alpha_tag,
|
||||||
tg_group
|
tg_group
|
||||||
) VALUES (
|
) VALUES (
|
||||||
@system_id,
|
@system_id,
|
||||||
@tgid,
|
@tgid,
|
||||||
|
TRUE,
|
||||||
sqlc.narg('name'),
|
sqlc.narg('name'),
|
||||||
sqlc.narg('alpha_tag'),
|
sqlc.narg('alpha_tag'),
|
||||||
sqlc.narg('tg_group')
|
sqlc.narg('tg_group')
|
||||||
) RETURNING id;
|
) RETURNING *;
|
||||||
|
|
Loading…
Reference in a new issue