firstroundgetquery

This commit is contained in:
Michael McGuinness
2025-01-03 10:35:42 +00:00
parent 382e01052f
commit 0ac156f0e1
6 changed files with 144 additions and 11 deletions
+13 -1
View File
@@ -1,2 +1,14 @@
-- name: GetQueryConfig :one
SELECT id, config FROM queryConfigs where queryId = $1 and addedVersion >= $2 and COALESCE(removedVersion, $2 - 1) < $2;
SELECT id, config FROM queryConfigs where queryId = $1 and addedVersion >= $2 and COALESCE(removedVersion, $2 - 1) < $2;
-- name: GetQuery :one
SELECT q.id, q.type, q.activeVersion, c.config, ARRAY_AGG(r.requiredQueryId) AS requiredIds
FROM queries AS q
JOIN queryConfigs AS c ON q.id = c.queryId
JOIN requiredQueries AS r ON q.id = r.queryId
WHERE q.id = $1
and c.addedVersion >= q.activeVersion
and COALESCE(c.removedVersion, q.activeVersion - 1) < q.activeVersion
and r.addedVersion >= q.activeVersion
and COALESCE(r.removedVersion, q.activeVersion - 1) < q.activeVersion
GROUP BY q.id, c.config;
+34
View File
@@ -11,6 +11,40 @@ import (
"github.com/jackc/pgx/v5/pgtype"
)
const getQuery = `-- name: GetQuery :one
SELECT q.id, q.type, q.activeVersion, c.config, ARRAY_AGG(r.requiredQueryId) AS requiredIds
FROM queries AS q
JOIN queryConfigs AS c ON q.id = c.queryId
JOIN requiredQueries AS r ON q.id = r.queryId
WHERE q.id = $1
and c.addedVersion >= q.activeVersion
and COALESCE(c.removedVersion, q.activeVersion - 1) < q.activeVersion
and r.addedVersion >= q.activeVersion
and COALESCE(r.removedVersion, q.activeVersion - 1) < q.activeVersion
GROUP BY q.id, c.config
`
type GetQueryRow struct {
ID pgtype.UUID
Type Querytype
Activeversion int32
Config []byte
Requiredids []pgtype.UUID
}
func (q *Queries) GetQuery(ctx context.Context, id pgtype.UUID) (GetQueryRow, error) {
row := q.db.QueryRow(ctx, getQuery, id)
var i GetQueryRow
err := row.Scan(
&i.ID,
&i.Type,
&i.Activeversion,
&i.Config,
&i.Requiredids,
)
return i, err
}
const getQueryConfig = `-- name: GetQueryConfig :one
SELECT id, config FROM queryConfigs where queryId = $1 and addedVersion >= $2 and COALESCE(removedVersion, $2 - 1) < $2
`
+7 -3
View File
@@ -7,7 +7,7 @@ import (
)
func ParseDBQueryRow(dbQuery *repository.GetCollectorQueriesRow) (*QueryRow, error) {
t, err := ParseDBType(dbQuery.Type)
t, err := ParseDBNullType(dbQuery.Type)
if err != nil {
return nil, err
}
@@ -20,12 +20,16 @@ func ParseDBQueryRow(dbQuery *repository.GetCollectorQueriesRow) (*QueryRow, err
}, nil
}
func ParseDBType(qType repository.NullQuerytype) (Type, error) {
func ParseDBNullType(qType repository.NullQuerytype) (Type, error) {
if !qType.Valid {
return TypeJsonExtractor, fmt.Errorf("invalid database query type")
}
switch qType.Querytype {
return ParseDBType(qType.Querytype)
}
func ParseDBType(qType repository.Querytype) (Type, error) {
switch qType {
case repository.QuerytypeJsonExtractor:
return TypeJsonExtractor, nil
case repository.QuerytypeContextFull:
+24 -1
View File
@@ -2,6 +2,7 @@ package query
import (
"context"
"queryorchestration/internal/database"
"queryorchestration/internal/database/repository"
"queryorchestration/internal/result"
@@ -27,6 +28,7 @@ type Query struct {
Type Type
RequiredQueryIDs []uuid.UUID
Version int32
Config interface{}
}
type ListFilters struct {
@@ -59,7 +61,28 @@ func New(db *repository.Queries) *Service {
}
func (s *Service) Get(ctx context.Context, id uuid.UUID) (*Query, error) {
return nil, nil
query, err := s.db.GetQuery(ctx, database.MustToDBUUID(id))
if err != nil {
return nil, err
}
queryType, err := ParseDBType(query.Type)
if err != nil {
return nil, err
}
reqIDs := make([]uuid.UUID, len(query.Requiredids))
for index, id := range query.Requiredids {
reqIDs[index] = database.MustToUUID(id)
}
return &Query{
ID: id,
Type: queryType,
Version: query.Activeversion,
RequiredQueryIDs: reqIDs,
Config: string(query.Config),
}, nil
}
func (s *Service) List(ctx context.Context, filters ListFilters) (*[]Query, error) {
+53
View File
@@ -0,0 +1,53 @@
package document_test
import (
"context"
"queryorchestration/internal/database"
"queryorchestration/internal/database/repository"
"queryorchestration/internal/query"
"testing"
"github.com/google/uuid"
"github.com/jackc/pgx/v5/pgtype"
"github.com/pashagolub/pgxmock/v3"
"github.com/stretchr/testify/assert"
)
func TestGet(t *testing.T) {
ctx := context.Background()
db, err := pgxmock.NewConn()
if err != nil {
t.Fatalf("failed to open pgxmock database: %v", err)
}
defer db.Close(ctx)
queries := repository.New(db)
svc := query.New(queries)
config := "{\"path\":\"example_path\"}"
query := query.Query{
ID: uuid.New(),
Type: query.TypeJsonExtractor,
Version: int32(1),
RequiredQueryIDs: []uuid.UUID{
uuid.New(),
},
Config: config,
}
dbReqIDs := make([]pgtype.UUID, len(query.RequiredQueryIDs))
for index, id := range query.RequiredQueryIDs {
dbReqIDs[index] = database.MustToDBUUID(id)
}
db.ExpectQuery("name: GetQuery :one").WithArgs(database.MustToDBUUID(query.ID)).WillReturnRows(
pgxmock.NewRows([]string{"id", "type", "activeVersion", "config", "requiredIds"}).
AddRow(database.MustToDBUUID(query.ID), repository.QuerytypeJsonExtractor, int32(1), []byte(config), dbReqIDs),
)
returnQuery, err := svc.Get(ctx, query.ID)
assert.Nil(t, err)
assert.EqualExportedValues(t, query, *returnQuery)
}
+13 -6
View File
@@ -10,7 +10,7 @@ import (
"github.com/stretchr/testify/assert"
)
func TestParseDBQuery(t *testing.T) {
func TestParseDBQueryRow(t *testing.T) {
dbResult := repository.GetCollectorQueriesRow{
Collectorid: pgtype.UUID{},
Queryid: pgtype.UUID{},
@@ -30,21 +30,28 @@ func TestParseDBQuery(t *testing.T) {
assert.EqualError(t, err, "invalid database query type")
}
func TestParseDBType(t *testing.T) {
func TestParseDBNullType(t *testing.T) {
qType := repository.NullQuerytype{Valid: true, Querytype: repository.QuerytypeJsonExtractor}
value, err := query.ParseDBType(qType)
value, err := query.ParseDBNullType(qType)
assert.Nil(t, err)
assert.Equal(t, query.Type(query.TypeJsonExtractor), value)
qType = repository.NullQuerytype{}
_, err = query.ParseDBType(qType)
_, err = query.ParseDBNullType(qType)
assert.EqualError(t, err, "invalid database query type")
qType = repository.NullQuerytype{Valid: true}
_, err = query.ParseDBType(qType)
_, err = query.ParseDBNullType(qType)
assert.EqualError(t, err, "invalid database query type")
}
qType = repository.NullQuerytype{Valid: true, Querytype: repository.QuerytypeContextFull}
func TestParseDBType(t *testing.T) {
qType := repository.QuerytypeJsonExtractor
value, err := query.ParseDBType(qType)
assert.Nil(t, err)
assert.Equal(t, query.Type(query.TypeJsonExtractor), value)
qType = repository.QuerytypeContextFull
value, err = query.ParseDBType(qType)
assert.Nil(t, err)
assert.Equal(t, query.Type(query.TypeContextFull), value)