Skip to content

Commit

Permalink
perf: update only game_version using the existing SML dependency (#81)
Browse files Browse the repository at this point in the history
  • Loading branch information
mircearoata authored Aug 13, 2024
1 parent ad47b63 commit d13695d
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 6 deletions.
54 changes: 53 additions & 1 deletion migrations/code/20240614131600_sml_as_mod.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,21 @@ import (
"encoding/json"
"fmt"
"io"
"log/slog"
"net/http"
"net/url"
"path"
"sort"

"github.com/Masterminds/semver/v3"
"github.com/Vilsol/slox"
"github.com/lab259/go-migration"
"github.com/pkg/errors"

"github.com/satisfactorymodding/smr-api/db"
"github.com/satisfactorymodding/smr-api/generated/ent"
"github.com/satisfactorymodding/smr-api/generated/ent/mod"
"github.com/satisfactorymodding/smr-api/generated/ent/versiondependency"
"github.com/satisfactorymodding/smr-api/migrations/utils"
"github.com/satisfactorymodding/smr-api/storage"
"github.com/satisfactorymodding/smr-api/validation"
Expand All @@ -37,7 +41,55 @@ func init() {
}

// Add the game version
err = utils.ReindexAllModFiles(ctx, false, nil, nil)
smlQuery := db.From(ctx).Mod.Query().Where(mod.ModReferenceEQ("SML")).WithVersions()
smlMod, err := smlQuery.First(ctx)
if err != nil {
return fmt.Errorf("failed to get SML mod: %w", err)
}

smlVersions := smlMod.Edges.Versions

// Sort increasing by version
sort.Slice(smlVersions, func(a, b int) bool {
return semver.MustParse(smlVersions[a].Version).Compare(semver.MustParse(smlVersions[b].Version)) < 0
})

err = utils.ExecuteOnVersions(ctx, func(m *ent.Mod) bool {
return m.ModReference != "SML"
}, nil, func(mod *ent.Mod, version *ent.Version) {
smlDependency, err := version.QueryVersionDependencies().Where(versiondependency.ModID("SML")).First(ctx)
if err != nil {
slox.Error(ctx, "failed to get SML dependency", slog.String("mod", mod.ModReference), slog.String("version", version.Version), slog.Any("err", err))
return
}

constraint, err := semver.NewConstraint(smlDependency.Condition)
if err != nil {
slox.Error(ctx, "failed to get SML dependency", slog.String("mod", mod.ModReference), slog.String("version", version.Version), slog.Any("err", err))
return
}

gameVersion := ""
for _, v := range smlVersions {
if constraint.Check(semver.MustParse(v.Version)) {
gameVersion = v.GameVersion
break
}
}

if gameVersion == "" {
slox.Error(ctx, "no SML version matches constraint", slog.String("mod", mod.ModReference), slog.String("version", version.Version), slog.String("constraint", smlDependency.Condition))
return
}

err = version.Update().
SetGameVersion(gameVersion).
Exec(ctx)
if err != nil {
slox.Error(ctx, "failed to update game version", slog.String("mod", mod.ModReference), slog.String("version", version.Version), slog.Any("err", err))
return
}
})
if err != nil {
return fmt.Errorf("failed to reindex all mod files: %w", err)
}
Expand Down
16 changes: 11 additions & 5 deletions migrations/utils/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,16 @@ import (
)

func ReindexAllModFiles(ctx context.Context, withMetadata bool, modFilter func(*ent.Mod) bool, versionFilter func(version *ent.Version) bool) error {
return ExecuteOnVersions(ctx, modFilter, versionFilter, func(m *ent.Mod, v *ent.Version) {
if withMetadata {
jobs.SubmitJobUpdateDBFromModVersionFileTask(ctx, m.ID, v.ID)
} else {
jobs.SubmitJobUpdateDBFromModVersionJSONFileTask(ctx, m.ID, v.ID)
}
})
}

func ExecuteOnVersions(ctx context.Context, modFilter func(*ent.Mod) bool, versionFilter func(version *ent.Version) bool, f func(mod *ent.Mod, version *ent.Version)) error {
offset := 0

for {
Expand Down Expand Up @@ -51,11 +61,7 @@ func ReindexAllModFiles(ctx context.Context, withMetadata bool, modFilter func(*
}
}

if withMetadata {
jobs.SubmitJobUpdateDBFromModVersionFileTask(ctx, m.ID, v.ID)
} else {
jobs.SubmitJobUpdateDBFromModVersionJSONFileTask(ctx, m.ID, v.ID)
}
f(m, v)
}
} else {
break
Expand Down

0 comments on commit d13695d

Please sign in to comment.