Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RHINENG-10791: deduplicate common joins #1441

Merged
merged 3 commits into from
Jul 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 35 additions & 8 deletions base/database/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,26 +54,31 @@ func SystemPackages(tx *gorm.DB, accountID int, groups map[string]string, joins

func Packages(tx *gorm.DB, joins ...join) *gorm.DB {
tx = tx.Table("package p").
Joins("JOIN package_name pn on p.name_id = pn.id").
Joins("JOIN strings descr ON p.description_hash = descr.id").
Joins("JOIN strings sum ON p.summary_hash = sum.id").
Joins("LEFT JOIN advisory_metadata am ON p.advisory_id = am.id")
Joins("JOIN package_name pn on p.name_id = pn.id")
return (joinsT)(joins).apply(tx)
}

func PackageByName(tx *gorm.DB, pkgName string) *gorm.DB {
return Packages(tx).Where("pn.name = ?", pkgName)
func PackageByName(tx *gorm.DB, pkgName string, joins ...join) *gorm.DB {
tx = Packages(tx).Where("pn.name = ?", pkgName)
return (joinsT)(joins).apply(tx)
}

func SystemAdvisoriesByInventoryID(tx *gorm.DB, accountID int, groups map[string]string, inventoryID string) *gorm.DB {
return SystemAdvisories(tx, accountID, groups).Where("sp.inventory_id = ?::uuid", inventoryID)
func SystemAdvisoriesByInventoryID(tx *gorm.DB, accountID int, groups map[string]string, inventoryID string,
joins ...join) *gorm.DB {
tx = SystemAdvisories(tx, accountID, groups).Where("sp.inventory_id = ?::uuid", inventoryID)
return (joinsT)(joins).apply(tx)
}

func SystemAdvisoriesBySystemID(tx *gorm.DB, accountID int, systemID int64) *gorm.DB {
query := systemAdvisoriesQuery(tx, accountID).Where("sp.id = ?", systemID)
return query
}

func AdvisoryMetadata(tx *gorm.DB) *gorm.DB {
tx = tx.Table("advisory_metadata am")
return JoinAdvisoryType(tx)
}

func systemAdvisoriesQuery(tx *gorm.DB, accountID int) *gorm.DB {
query := tx.Table("system_advisories sa").Select("sa.*").
Joins("join system_platform sp ON sa.rh_account_id = sp.rh_account_id AND sa.system_id = sp.id").
Expand Down Expand Up @@ -256,3 +261,25 @@ func JoinTemplates(tx *gorm.DB) *gorm.DB {
return tx.Joins("LEFT JOIN baseline bl ON sp.baseline_id = bl.id AND sp.rh_account_id = bl.rh_account_id").
Joins("LEFT JOIN template t ON sp.template_id = t.id AND sp.rh_account_id = t.rh_account_id")
}

// JOIN advisory_metadata to sa (system_advisories)
func JoinAdvisoryMetadata(tx *gorm.DB) *gorm.DB {
return tx.Joins("JOIN advisory_metadata am ON am.id = sa.advisory_id")
}

// JOIN advisory_type to am (advisory_metadata)
func JoinAdvisoryType(tx *gorm.DB) *gorm.DB {
return tx.Joins("JOIN advisory_type at ON am.advisory_type_id = at.id")
}

func JoinInstallableApplicablePackages(tx *gorm.DB) *gorm.DB {
return tx.Joins("LEFT JOIN package pi ON pi.id = spkg.installable_id").
Joins("LEFT JOIN package pa ON pa.id = spkg.applicable_id")
}

// JOIN package description, summary, advisory
func JoinPackageDetails(tx *gorm.DB) *gorm.DB {
return tx.Joins("JOIN strings descr ON p.description_hash = descr.id").
Joins("JOIN strings sum ON p.summary_hash = sum.id").
Joins("LEFT JOIN advisory_metadata am ON p.advisory_id = am.id")
}
6 changes: 2 additions & 4 deletions evaluator/package_cache.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,9 +82,8 @@ func (c *PackageCache) Load() {
defer tx.Rollback()

// load N last recently added packages, i.e. newest
rows, err := tx.Table("package p").
rows, err := database.Packages(tx).
Select("p.id, p.name_id, pn.name, p.evra, p.summary_hash, p.description_hash").
Joins("JOIN package_name pn ON pn.id = p.name_id").
Order("id DESC").
Limit(c.size).
Rows()
Expand Down Expand Up @@ -263,9 +262,8 @@ func readPackageFromDB(where string, order string, args ...interface{}) *Package
defer tx.Rollback()

var pkg PackageCacheMetadata
query := tx.Table("package p").
query := database.Packages(tx).
Select("p.id, p.name_id, pn.name, p.evra, p.summary_hash, p.description_hash").
Joins("JOIN package_name pn ON pn.id = p.name_id").
Where(where, args...)
if order != "" {
query = query.Order(order)
Expand Down
6 changes: 2 additions & 4 deletions manager/controllers/advisories.go
Original file line number Diff line number Diff line change
Expand Up @@ -207,10 +207,9 @@ func AdvisoriesListIDsHandler(c *gin.Context) {
}

func buildQueryAdvisories(db *gorm.DB, account int) *gorm.DB {
query := db.Table("advisory_metadata am").
query := database.AdvisoryMetadata(db).
Select(AdvisoriesSelect).
Joins("JOIN advisory_account_data aad ON am.id = aad.advisory_id").
Joins("JOIN advisory_type at ON am.advisory_type_id = at.id").
Where("aad.rh_account_id = ?", account)
return query
}
Expand All @@ -231,9 +230,8 @@ func buildQueryAdvisoriesTagged(db *gorm.DB, filters map[string]FilterData, acco
subq := buildAdvisoryAccountDataQuery(db, account, groups)
subq, _ = ApplyInventoryFilter(filters, subq, "sp.inventory_id")

query := db.Table("advisory_metadata am").
query := database.AdvisoryMetadata(db).
Select(AdvisoriesSelect).
Joins("JOIN advisory_type at ON am.advisory_type_id = at.id").
Joins("JOIN (?) aad ON am.id = aad.advisory_id", subq)

return query
Expand Down
3 changes: 1 addition & 2 deletions manager/controllers/advisory_systems.go
Original file line number Diff line number Diff line change
Expand Up @@ -272,9 +272,8 @@ func AdvisorySystemsListIDsHandler(c *gin.Context) {

func buildAdvisorySystemsQuery(db *gorm.DB, account int, groups map[string]string, advisoryName string) *gorm.DB {
selectQuery := AdvisorySystemsSelect
query := database.SystemAdvisories(db, account, groups, database.JoinTemplates).
query := database.SystemAdvisories(db, account, groups, database.JoinTemplates, database.JoinAdvisoryMetadata).
Select(selectQuery).
Joins("JOIN advisory_metadata am ON am.id = sa.advisory_id").
Joins("LEFT JOIN status st ON sa.status_id = st.id").
Where("am.name = ?", advisoryName).
Where("sp.stale = false")
Expand Down
4 changes: 2 additions & 2 deletions manager/controllers/package_detail.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ var PackageSelect = database.MustGetSelect(&PackageDetailAttributes{})

func packageLatestHandler(c *gin.Context, packageName string) {
db := middlewares.DBFromContext(c)
query := database.PackageByName(db, packageName)
query := database.PackageByName(db, packageName, database.JoinPackageDetails)
var pkg PackageDetailAttributes
// Perform 'soft-filtering' by ordering on boolean column first
err := query.Select(PackageSelect).
Expand Down Expand Up @@ -72,7 +72,7 @@ func packageEvraHandler(c *gin.Context, nevra *utils.Nevra) {
return
}

query := database.PackageByName(db, nevra.Name)
query := database.PackageByName(db, nevra.Name, database.JoinPackageDetails)
var pkg PackageDetailAttributes
err := query.Select(PackageSelect).Where("p.evra = ?", nevra.EVRAString()).Take(&pkg).Error
if err != nil {
Expand Down
13 changes: 3 additions & 10 deletions manager/controllers/package_systems.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,18 +54,11 @@ type PackageSystemsResponse struct {
Meta ListMeta `json:"meta"`
}

func packagesByNameQuery(db *gorm.DB, pkgName string) *gorm.DB {
return db.Table("package p").
Joins("INNER JOIN package_name pn ON p.name_id = pn.id").
Where("pn.name = ?", pkgName)
}

func packageSystemsQuery(db *gorm.DB, acc int, groups map[string]string, packageName string, packageIDs []int,
) *gorm.DB {
query := database.SystemPackages(db, acc, groups, database.JoinTemplates).
query := database.SystemPackages(db, acc, groups,
database.JoinTemplates, database.JoinInstallableApplicablePackages).
Select(PackageSystemsSelect).
Joins("LEFT JOIN package pi ON pi.id = spkg.installable_id").
Joins("LEFT JOIN package pa ON pa.id = spkg.applicable_id").
Where("sp.stale = false").
Where("pn.name = ?", packageName).
Where("spkg.package_id in (?)", packageIDs)
Expand All @@ -84,7 +77,7 @@ func packageSystemsCommon(db *gorm.DB, c *gin.Context) (*gorm.DB, *ListMeta, []s
}

var packageIDs []int
if err := packagesByNameQuery(db, packageName).Pluck("p.id", &packageIDs).Error; err != nil {
if err := database.PackageByName(db, packageName).Pluck("p.id", &packageIDs).Error; err != nil {
LogAndRespError(c, err, "database error")
return nil, nil, nil, err
}
Expand Down
3 changes: 2 additions & 1 deletion manager/controllers/package_systems_export.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package controllers

import (
"app/base/database"
"app/base/utils"
"app/manager/middlewares"
"errors"
Expand Down Expand Up @@ -42,7 +43,7 @@ func PackageSystemsExportHandler(c *gin.Context) {

db := middlewares.DBFromContext(c)
var packageIDs []int
if err := packagesByNameQuery(db, packageName).Pluck("p.id", &packageIDs).Error; err != nil {
if err := database.PackageByName(db, packageName).Pluck("p.id", &packageIDs).Error; err != nil {
LogAndRespError(c, err, "database error")
return
}
Expand Down
5 changes: 2 additions & 3 deletions manager/controllers/system_advisories.go
Original file line number Diff line number Diff line change
Expand Up @@ -190,9 +190,8 @@ func SystemAdvisoriesIDsHandler(c *gin.Context) {
}

func buildSystemAdvisoriesQuery(db *gorm.DB, account int, groups map[string]string, inventoryID string) *gorm.DB {
query := database.SystemAdvisoriesByInventoryID(db, account, groups, inventoryID).
Joins("JOIN advisory_metadata am on am.id = sa.advisory_id").
Joins("JOIN advisory_type at ON am.advisory_type_id = at.id").
query := database.SystemAdvisoriesByInventoryID(db, account, groups, inventoryID,
database.JoinAdvisoryMetadata, database.JoinAdvisoryType).
Joins("JOIN status ON sa.status_id = status.id").
Select(SystemAdvisoriesSelect)
return query
Expand Down
4 changes: 1 addition & 3 deletions manager/controllers/system_packages.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,7 @@ type SystemPackageDBLoad struct {
}

func systemPackageQuery(db *gorm.DB, account int, groups map[string]string, inventoryID string) *gorm.DB {
query := database.SystemPackages(db, account, groups).
Joins("LEFT JOIN package pi ON pi.id = spkg.installable_id").
Joins("LEFT JOIN package pa ON pa.id = spkg.applicable_id").
query := database.SystemPackages(db, account, groups, database.JoinInstallableApplicablePackages).
Joins("LEFT JOIN strings AS descr ON p.description_hash = descr.id").
Joins("LEFT JOIN strings AS sum ON p.summary_hash = sum.id").
Select(SystemPackagesSelect).
Expand Down
6 changes: 2 additions & 4 deletions manager/controllers/systems_advisories_view.go
Original file line number Diff line number Diff line change
Expand Up @@ -124,12 +124,10 @@ func advisoriesSystemsQuery(c *gin.Context, db *gorm.DB, acc int, groups map[str
systems := req.Systems
advisories := req.Advisories
// get all advisories for all systems in the account (with inventory.hosts join)
advq := database.Systems(db, acc, groups).
Distinct("am.id, am.name").
advq := database.SystemAdvisories(db, acc, groups, database.JoinAdvisoryMetadata).
Distinct("am.id, am.name")
// we need to join system_advisories to make `limit` work properly
// without this join it can happen that we display less items on some pages
Joins("JOIN system_advisories sa ON sp.id = sa.system_id AND sa.rh_account_id = ?", acc).
Joins("JOIN advisory_metadata am ON am.id = sa.advisory_id")
if len(advisories) > 0 {
advq = advq.Where("am.name in (?)", advisories)
}
Expand Down
Loading