package queryqueue import ( "context" "queryorchestration/internal/database" queryprocessor "queryorchestration/internal/query/processor" "queryorchestration/internal/query/result" "github.com/google/uuid" "github.com/jackc/pgx/v5/pgtype" ) func (q *Queue) Execute(ctx context.Context) error { if q.unsyncedQueue == nil { return nil } for _, query := range q.unsyncedQueue { err := q.executeQuery(ctx, query) if err != nil { return err } } q.unsyncedQueue = nil return nil } func (q *Queue) executeQuery(ctx context.Context, qu *queryprocessor.Query) error { values, err := q.getRequiredResults(ctx, qu.RequiredQueryIDs) if err != nil { return err } err = q.setResult(ctx, qu, values) if err != nil { return err } return nil } func (q *Queue) getRequiredResults(ctx context.Context, requiredQueryIDs *[]uuid.UUID) (*[]result.Value, error) { var values *[]result.Value if requiredQueryIDs != nil { resultIDs := make([]pgtype.UUID, len(*requiredQueryIDs)) for index, id := range *requiredQueryIDs { var queryVersion int32 for _, entry := range q.collectorQueries { if entry.ID == id { queryVersion = entry.Version break } } for _, entry := range q.results { if entry.QueryID == id && entry.QueryVersion == queryVersion { resultIDs[index] = database.MustToDBUUID(entry.ID) break } } } resultValues, err := q.db.Queries.ListResultValuesByID(ctx, resultIDs) if err != nil { return nil, err } rValues := make([]result.Value, len(resultValues)) for index, r := range resultValues { cleanValue, err := q.getResultValue(r) if err != nil { return nil, err } rValues[index] = cleanValue } values = &rValues } return values, nil }