package resultset import ( "context" "database/sql" "errors" "log/slog" "queryorchestration/internal/database" "queryorchestration/internal/database/repository" "queryorchestration/internal/query/result" "github.com/google/uuid" ) type Set struct { DocumentID uuid.UUID `json:"document_id" validate:"required,uuid"` QueryID uuid.UUID `json:"query_id" validate:"required,uuid"` } func (s *Service) Set(ctx context.Context, params *Set) error { dbid := database.MustToDBUUID(params.DocumentID) textVersion, err := s.cfg.GetDBQueries().GetDocumentTextEntry(ctx, dbid) if err != nil { return err } query, err := s.svc.Query.Get(ctx, params.QueryID) if err != nil { return err } value, err := s.svc.Result.Process(ctx, &result.Process{ DocumentID: params.DocumentID, QueryID: query.ID, QueryVersion: query.ActiveVersion, }) if err != nil { return err } err = s.cfg.ExecuteDBTransaction(ctx, func(ctx context.Context, q *repository.Queries) error { id, err := q.AddResult(ctx, &repository.AddResultParams{ Queryid: database.MustToDBUUID(params.QueryID), Value: value.GetStoreValue(), Queryversion: query.ActiveVersion, Textentryid: textVersion.ID, }) if err != nil { return err } qResults, err := q.ListQueryRequirementValues(ctx, &repository.ListQueryRequirementValuesParams{ Queryid: database.MustToDBUUID(params.QueryID), Documentid: database.MustToDBUUID(params.DocumentID), Version: &query.ActiveVersion, }) if err != nil && !errors.Is(err, sql.ErrNoRows) { return err } for _, result := range qResults { err = q.AddResultDependency(ctx, &repository.AddResultDependencyParams{ Resultid: id, Requiredresultid: result.ID, }) if err != nil { return err } } return nil }) if err != nil { return err } slog.Debug("set query result", "query_id", params.QueryID.String(), "document_id", params.DocumentID.String()) return s.informQueryDependents(ctx, params) } func (s *Service) informQueryDependents(ctx context.Context, params *Set) error { ids, err := s.cfg.GetDBQueries().ListQueryDirectDependentsByDocumentID(ctx, &repository.ListQueryDirectDependentsByDocumentIDParams{ Documentid: database.MustToDBUUID(params.DocumentID), Queryid: database.MustToDBUUID(params.QueryID), }) if err != nil { return err } return s.svc.Sync.TriggerMultiSync(ctx, params.DocumentID, database.MustToUUIDArray(ids)) }