package query import ( "context" "gotemplate/internal/database" "gotemplate/internal/database/repository" "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, query Query) error { requiredQueryIDs := []uuid.UUID{} for _, entry := range *q.collectorQueries { if entry.ID == query.ID && entry.RequiredQueryID != uuid.Nil { requiredQueryIDs = append(requiredQueryIDs, entry.RequiredQueryID) } } 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 } } } values, err := q.db.ListResultValuesByID(ctx, resultIDs) if err != nil { return err } cleanValues := make([]ResultValue, len(values)) for _, result := range values { cleanValue := q.parseResultValue(result) cleanValues = append(cleanValues, cleanValue) } err = q.getResult(ctx, query, &cleanValues) if err != nil { return err } return nil } func (q *Queue) parseResultValue(result repository.ListResultValuesByIDRow) ResultValue { return ResultValue{ ID: database.MustToUUID(result.ID), QueryID: database.MustToUUID(result.Queryid), Value: result.Value, } } func (q *Queue) getResult(ctx context.Context, query Query, resultValues *[]ResultValue) error { value, err := q.prepareResult(ctx, query, resultValues) if err != nil { return err } id := uuid.New() err = q.db.SetResult(ctx, repository.SetResultParams{ ID: database.MustToDBUUID(id), Queryid: database.MustToDBUUID(query.ID), Documentid: database.MustToDBUUID(q.documentId), Value: value, Cleanversion: q.cleanVersion, Textversion: q.textVersion, Queryversion: query.Version, }) if err != nil { return err } *q.results = append(*q.results, Result{ ID: id, QueryID: query.ID, QueryVersion: query.Version, }) return nil }