Fix package list performance (#30520)

Fixes #28255

The new query uses the id field to sort by "newer". This most not be
correct (usually it is) but it's faster (see #28255).
If someone has a better idea, please propose changes.

Co-authored-by: Giteabot <teabot@gitea.io>
pull/30576/head
KN4CK3R 7 months ago committed by GitHub
parent 48d4580dd5
commit b06aac40e6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 22
      models/packages/package_version.go

@ -287,9 +287,10 @@ func (opts *PackageSearchOptions) configureOrderBy(e db.Engine) {
// SearchVersions gets all versions of packages matching the search options // SearchVersions gets all versions of packages matching the search options
func SearchVersions(ctx context.Context, opts *PackageSearchOptions) ([]*PackageVersion, int64, error) { func SearchVersions(ctx context.Context, opts *PackageSearchOptions) ([]*PackageVersion, int64, error) {
sess := db.GetEngine(ctx). sess := db.GetEngine(ctx).
Where(opts.ToConds()). Select("package_version.*").
Table("package_version"). Table("package_version").
Join("INNER", "package", "package.id = package_version.package_id") Join("INNER", "package", "package.id = package_version.package_id").
Where(opts.ToConds())
opts.configureOrderBy(sess) opts.configureOrderBy(sess)
@ -304,19 +305,18 @@ func SearchVersions(ctx context.Context, opts *PackageSearchOptions) ([]*Package
// SearchLatestVersions gets the latest version of every package matching the search options // SearchLatestVersions gets the latest version of every package matching the search options
func SearchLatestVersions(ctx context.Context, opts *PackageSearchOptions) ([]*PackageVersion, int64, error) { func SearchLatestVersions(ctx context.Context, opts *PackageSearchOptions) ([]*PackageVersion, int64, error) {
cond := opts.ToConds(). in := builder.
And(builder.Expr("pv2.id IS NULL")) Select("MAX(package_version.id)").
From("package_version").
joinCond := builder.Expr("package_version.package_id = pv2.package_id AND (package_version.created_unix < pv2.created_unix OR (package_version.created_unix = pv2.created_unix AND package_version.id < pv2.id))") InnerJoin("package", "package.id = package_version.package_id").
if opts.IsInternal.Has() { Where(opts.ToConds()).
joinCond = joinCond.And(builder.Eq{"pv2.is_internal": opts.IsInternal.Value()}) GroupBy("package_version.package_id")
}
sess := db.GetEngine(ctx). sess := db.GetEngine(ctx).
Select("package_version.*").
Table("package_version"). Table("package_version").
Join("LEFT", "package_version pv2", joinCond).
Join("INNER", "package", "package.id = package_version.package_id"). Join("INNER", "package", "package.id = package_version.package_id").
Where(cond) Where(builder.In("package_version.id", in))
opts.configureOrderBy(sess) opts.configureOrderBy(sess)

Loading…
Cancel
Save