From 872967db8498a5052d11493a41e23b76bbb4a0a0 Mon Sep 17 00:00:00 2001 From: Michael McGuinness Date: Thu, 2 Jan 2025 16:07:35 +0000 Subject: [PATCH] base --- api/controllers/parse.go | 42 +++++++++++++++++++++++++++++++ api/controllers/query.go | 36 ++++++++++++++++++++++++-- internal/contextFull/service.go | 2 +- internal/jsonExtractor/service.go | 2 +- internal/query/database.go | 4 +-- internal/query/service.go | 23 +++++++++++++++-- internal/queryQueue/create.go | 14 +++++------ internal/queryQueue/execute.go | 2 +- internal/queryQueue/result.go | 2 +- internal/queryQueue/service.go | 6 ++--- scripts/proto.yml | 2 +- 11 files changed, 114 insertions(+), 21 deletions(-) create mode 100644 api/controllers/parse.go diff --git a/api/controllers/parse.go b/api/controllers/parse.go new file mode 100644 index 00000000..45f16d57 --- /dev/null +++ b/api/controllers/parse.go @@ -0,0 +1,42 @@ +package controllers + +import ( + serviceinterfaces "queryorchestration/api/serviceInterfaces" + "queryorchestration/internal/query" +) + +func ParseQuery(query *query.Query) *serviceinterfaces.Query { + requiredQueries := make([]string, len(query.RequiredQueryIDs)) + for index, id := range query.RequiredQueryIDs { + requiredQueries[index] = id.String() + } + + return &serviceinterfaces.Query{ + Id: query.ID.String(), + Type: ParseQueryType(query.Type), + ActiveVersion: query.Version, + RequiredQueries: requiredQueries, + } +} + +func ParseQueryType(qType query.Type) serviceinterfaces.QueryType { + switch qType { + case query.TypeJsonExtractor: + return serviceinterfaces.QueryType_QUERY_TYPE_JSON_EXTRACTOR + case query.TypeContextFull: + return serviceinterfaces.QueryType_QUERY_TYPE_CONTEXT_FULL + default: + return serviceinterfaces.QueryType_QUERY_TYPE_UNSPECIFIED + } +} + +func ParseSpecQueryType(qType serviceinterfaces.QueryType) query.Type { + switch qType { + case serviceinterfaces.QueryType_QUERY_TYPE_JSON_EXTRACTOR: + return query.TypeJsonExtractor + case serviceinterfaces.QueryType_QUERY_TYPE_CONTEXT_FULL: + return query.TypeContextFull + default: + return query.TypeContextFull + } +} diff --git a/api/controllers/query.go b/api/controllers/query.go index d72aad9b..2d038524 100644 --- a/api/controllers/query.go +++ b/api/controllers/query.go @@ -6,6 +6,7 @@ import ( "queryorchestration/internal/query" "github.com/go-playground/validator/v10" + "github.com/google/uuid" "google.golang.org/protobuf/types/known/emptypb" ) @@ -24,11 +25,42 @@ func NewQueryController(querySvc query.Service, validator *validator.Validate) * } func (s *QueryController) List(ctx context.Context, req *serviceinterfaces.QueryFilter) (*serviceinterfaces.Queries, error) { - return &serviceinterfaces.Queries{}, nil + types := make([]query.Type, len(req.GetTypes())) + for index, t := range req.GetTypes() { + types[index] = query.Type(ParseSpecQueryType(t)) + } + + filters := query.ListFilters{ + Types: types, + } + + queries, err := s.query.List(ctx, filters) + if err != nil { + return nil, err + } + + outQueries := make([]*serviceinterfaces.Query, len(*queries)) + for index, query := range *queries { + outQueries[index] = ParseQuery(&query) + } + + return &serviceinterfaces.Queries{ + Queries: outQueries, + }, nil } func (s *QueryController) Get(ctx context.Context, req *serviceinterfaces.IdMessage) (*serviceinterfaces.Query, error) { - return &serviceinterfaces.Query{}, nil + id, err := uuid.Parse(req.GetId()) + if err != nil { + return nil, err + } + + query, err := s.query.Get(ctx, id) + if err != nil { + return nil, err + } + + return ParseQuery(query), nil } func (s *QueryController) Create(ctx context.Context, req *serviceinterfaces.QueryCreate) (*serviceinterfaces.IdMessage, error) { diff --git a/internal/contextFull/service.go b/internal/contextFull/service.go index 549ceb3e..59e7c159 100644 --- a/internal/contextFull/service.go +++ b/internal/contextFull/service.go @@ -14,7 +14,7 @@ func New() *Extractor { return &Extractor{} } -func (e *Extractor) Process(ctx context.Context, query query.Query, values *[]result.Value) (string, error) { +func (e *Extractor) Process(ctx context.Context, query query.QueryRow, values *[]result.Value) (string, error) { if len(*values) > 0 { return "", fmt.Errorf("no requirements expected") } diff --git a/internal/jsonExtractor/service.go b/internal/jsonExtractor/service.go index 6b4e4ce2..ed9609d7 100644 --- a/internal/jsonExtractor/service.go +++ b/internal/jsonExtractor/service.go @@ -24,7 +24,7 @@ func New(db *repository.Queries) *Extractor { return &Extractor{db} } -func (e *Extractor) Process(ctx context.Context, query query.Query, values *[]result.Value) (string, error) { +func (e *Extractor) Process(ctx context.Context, query query.QueryRow, values *[]result.Value) (string, error) { if len(*values) != 1 { return "", fmt.Errorf("JSON Extraction requires 1 result") } diff --git a/internal/query/database.go b/internal/query/database.go index 5c9a0ece..41a1e13f 100644 --- a/internal/query/database.go +++ b/internal/query/database.go @@ -6,13 +6,13 @@ import ( "queryorchestration/internal/database/repository" ) -func ParseDBQuery(dbQuery *repository.GetCollectorQueriesRow) (*Query, error) { +func ParseDBQueryRow(dbQuery *repository.GetCollectorQueriesRow) (*QueryRow, error) { t, err := ParseDBType(dbQuery.Type) if err != nil { return nil, err } - return &Query{ + return &QueryRow{ ID: database.MustToUUID(dbQuery.Queryid), Type: t, RequiredQueryID: database.MustToUUID(dbQuery.Requiredqueryid), diff --git a/internal/query/service.go b/internal/query/service.go index 796ed47a..3ddba863 100644 --- a/internal/query/service.go +++ b/internal/query/service.go @@ -15,15 +15,26 @@ const ( TypeContextFull ) -type Query struct { +type QueryRow struct { ID uuid.UUID Type Type RequiredQueryID uuid.UUID Version int32 } +type Query struct { + ID uuid.UUID + Type Type + RequiredQueryIDs []uuid.UUID + Version int32 +} + +type ListFilters struct { + Types []Type +} + type Processor interface { - Process(ctx context.Context, query Query, values *[]result.Value) (string, error) + Process(ctx context.Context, query QueryRow, values *[]result.Value) (string, error) } type Service struct { @@ -33,3 +44,11 @@ type Service struct { func New(db *repository.Queries) *Service { return &Service{db} } + +func (s *Service) Get(ctx context.Context, id uuid.UUID) (*Query, error) { + return nil, nil +} + +func (s *Service) List(ctx context.Context, filters ListFilters) (*[]Query, error) { + return nil, nil +} diff --git a/internal/queryQueue/create.go b/internal/queryQueue/create.go index 498856f6..37cbf181 100644 --- a/internal/queryQueue/create.go +++ b/internal/queryQueue/create.go @@ -36,9 +36,9 @@ func (c *Queue) getCollectorQueries(ctx context.Context) error { return err } - cleanQueries := make([]query.Query, len(queries)) + cleanQueries := make([]query.QueryRow, len(queries)) for index, dbQuery := range queries { - cleanQuery, err := query.ParseDBQuery(&dbQuery) + cleanQuery, err := query.ParseDBQueryRow(&dbQuery) if err != nil { return err } @@ -51,12 +51,12 @@ func (c *Queue) getCollectorQueries(ctx context.Context) error { return nil } -func (q *Queue) Add(qu *query.Query) { - dependentQueries := []query.Query{} +func (q *Queue) Add(qu *query.QueryRow) { + dependentQueries := []query.QueryRow{} requiredIndex := -1 if q.unsyncedQueue == nil { - q.unsyncedQueue = &[]query.Query{} + q.unsyncedQueue = &[]query.QueryRow{} } else { for index, entry := range *q.unsyncedQueue { if entry.ID == qu.ID { @@ -75,9 +75,9 @@ func (q *Queue) Add(qu *query.Query) { } if requiredIndex != -1 { - *q.unsyncedQueue = append((*q.unsyncedQueue)[:requiredIndex+1], append([]query.Query{*qu}, (*q.unsyncedQueue)[requiredIndex+1:]...)...) + *q.unsyncedQueue = append((*q.unsyncedQueue)[:requiredIndex+1], append([]query.QueryRow{*qu}, (*q.unsyncedQueue)[requiredIndex+1:]...)...) } else { - *q.unsyncedQueue = append([]query.Query{*qu}, *q.unsyncedQueue...) + *q.unsyncedQueue = append([]query.QueryRow{*qu}, *q.unsyncedQueue...) } for _, entry := range dependentQueries { diff --git a/internal/queryQueue/execute.go b/internal/queryQueue/execute.go index 080bc6b1..3829b733 100644 --- a/internal/queryQueue/execute.go +++ b/internal/queryQueue/execute.go @@ -31,7 +31,7 @@ func (q *Queue) Execute(ctx context.Context) error { return nil } -func (q *Queue) executeQuery(ctx context.Context, qu query.Query) error { +func (q *Queue) executeQuery(ctx context.Context, qu query.QueryRow) error { requiredQueryIDs := []uuid.UUID{} for _, entry := range *q.collectorQueries { if entry.ID == qu.ID && entry.RequiredQueryID != uuid.Nil { diff --git a/internal/queryQueue/result.go b/internal/queryQueue/result.go index bb776509..6e350953 100644 --- a/internal/queryQueue/result.go +++ b/internal/queryQueue/result.go @@ -9,7 +9,7 @@ import ( "queryorchestration/internal/result" ) -func (q *Queue) setResult(ctx context.Context, qu query.Query, resultValues *[]result.Value) error { +func (q *Queue) setResult(ctx context.Context, qu query.QueryRow, resultValues *[]result.Value) error { processor, err := q.getProcessor(qu.Type) if err != nil { return err diff --git a/internal/queryQueue/service.go b/internal/queryQueue/service.go index f83fc39d..88070874 100644 --- a/internal/queryQueue/service.go +++ b/internal/queryQueue/service.go @@ -11,8 +11,8 @@ import ( ) type Queue struct { - unsyncedQueue *[]query.Query - collectorQueries *[]query.Query + unsyncedQueue *[]query.QueryRow + collectorQueries *[]query.QueryRow results *[]result.Result collector *collector.Collector db *repository.Queries @@ -41,6 +41,6 @@ func New(ctx context.Context, db *repository.Queries, coll *collector.Collector, return &queue, nil } -func (q *Queue) GetQueue() []query.Query { +func (q *Queue) GetQueue() []query.QueryRow { return *q.unsyncedQueue } diff --git a/scripts/proto.yml b/scripts/proto.yml index 19086050..02dea2b9 100644 --- a/scripts/proto.yml +++ b/scripts/proto.yml @@ -17,4 +17,4 @@ tasks: cmds: - pwd - mkdir -p {{.API_DIR}}/serviceInterfaces - - protoc --proto_path={{.PROTO_DIR}} --go_out={{.API_DIR}}/serviceInterfaces --go-grpc_out={{.API_DIR}} --go_opt=paths=source_relative --experimental_allow_proto3_optional main.proto \ No newline at end of file + - protoc --proto_path={{.PROTO_DIR}} --go_out={{.API_DIR}}/serviceInterfaces --go-grpc_out={{.API_DIR}} --go_opt=paths=source_relative --experimental_allow_proto3_optional main.proto