From 0ac156f0e1ee44fe098db54dcb5e365a64a504c2 Mon Sep 17 00:00:00 2001 From: Michael McGuinness Date: Fri, 3 Jan 2025 10:35:42 +0000 Subject: [PATCH] firstroundgetquery --- database/queries/query.sql | 14 +++++- internal/database/repository/query.sql.go | 34 +++++++++++++++ internal/query/database.go | 10 +++-- internal/query/service.go | 25 ++++++++++- test/unit/internal/query/get_test.go | 53 +++++++++++++++++++++++ test/unit/internal/query/parse_test.go | 19 +++++--- 6 files changed, 144 insertions(+), 11 deletions(-) create mode 100644 test/unit/internal/query/get_test.go diff --git a/database/queries/query.sql b/database/queries/query.sql index aa2aca7b..541f958d 100644 --- a/database/queries/query.sql +++ b/database/queries/query.sql @@ -1,2 +1,14 @@ -- name: GetQueryConfig :one -SELECT id, config FROM queryConfigs where queryId = $1 and addedVersion >= $2 and COALESCE(removedVersion, $2 - 1) < $2; \ No newline at end of file +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; \ No newline at end of file diff --git a/internal/database/repository/query.sql.go b/internal/database/repository/query.sql.go index 47592cdd..edd998b1 100644 --- a/internal/database/repository/query.sql.go +++ b/internal/database/repository/query.sql.go @@ -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 ` diff --git a/internal/query/database.go b/internal/query/database.go index 41a1e13f..28afeb29 100644 --- a/internal/query/database.go +++ b/internal/query/database.go @@ -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: diff --git a/internal/query/service.go b/internal/query/service.go index 011136dd..2d076832 100644 --- a/internal/query/service.go +++ b/internal/query/service.go @@ -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) { diff --git a/test/unit/internal/query/get_test.go b/test/unit/internal/query/get_test.go new file mode 100644 index 00000000..4760e76d --- /dev/null +++ b/test/unit/internal/query/get_test.go @@ -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) +} diff --git a/test/unit/internal/query/parse_test.go b/test/unit/internal/query/parse_test.go index 542b6369..b3423fb5 100644 --- a/test/unit/internal/query/parse_test.go +++ b/test/unit/internal/query/parse_test.go @@ -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)