Files
query-orchestration/internal/document/service.go
T
Michael McGuinness 6b07844d46 collectscollector
2024-12-19 19:49:40 +00:00

117 lines
2.1 KiB
Go

package document
import (
"context"
"gotemplate/internal/database"
"gotemplate/internal/database/repository"
"log"
"github.com/google/uuid"
)
type Service struct {
db *repository.Queries
}
type Document struct {
ID uuid.UUID `json:"id"`
JobID uuid.UUID `json:"jobId"`
Name string `json:"name"`
}
type QueryType int
const (
QueryTypeJsonExtractor = iota
)
type query struct {
ID uuid.UUID
Type QueryType
RequiredQueryID uuid.UUID
Version int
}
func New(ctx context.Context, db *repository.Queries) *Service {
return &Service{
db: db,
}
}
func (s *Service) Sync(ctx context.Context, doc Document) error {
queries, err := s.getUnsyncedOrderedQueries(ctx, doc)
if err != nil {
return err
}
err = s.executeQueries(queries)
if err != nil {
return err
}
return nil
}
func (s *Service) getUnsyncedOrderedQueries(ctx context.Context, doc Document) ([]query, error) {
jobID, err := database.ToDBUUID(doc.JobID)
if err != nil {
return nil, err
}
collector, err := s.db.GetCollectorFromJobID(ctx, jobID)
if err != nil {
return nil, err
}
queries, err := s.db.GetCollectorQueries(ctx, collector.ID)
if err != nil {
return nil, err
}
docID, err := database.ToDBUUID(doc.ID)
if err != nil {
return nil, err
}
results, err := s.db.ListResultsByDocumentID(ctx, repository.ListResultsByDocumentIDParams{
Documentid: docID,
Textversion: collector.Mintextversion,
Cleanversion: collector.Mincleanversion,
})
if err != nil {
return nil, err
}
queue := []query{}
for _, query := range queries {
isSynced := false
for _, result := range results {
if result.Queryid != query.Queryid || int(result.Queryversion) != int(query.Queryversion.Int32) {
continue
}
isSynced = true
break
}
if isSynced {
continue
}
// TODO add query to beginning, add all dependents until one that is already in the queue
}
return queue, nil
}
func (s *Service) executeQueries(queries []query) error {
// TODO - get all results?
for _, query := range queries {
log.Print(query)
// TODO - get required field
// execute query
// store result fully
}
return nil
}