Improve performance of select-fixed-output-package-derivations-in-revision

This commit is contained in:
Christopher Baines 2023-03-11 18:19:19 +00:00
parent a20b929e90
commit 1a0eaeb672

View file

@ -35,6 +35,8 @@
#:use-module (guix-data-service utils) #:use-module (guix-data-service utils)
#:use-module (guix-data-service database) #:use-module (guix-data-service database)
#:use-module (guix-data-service model utils) #:use-module (guix-data-service model utils)
#:use-module (guix-data-service model guix-revision)
#:use-module (guix-data-service model guix-revision-package-derivation)
#:use-module (guix-data-service model system) #:use-module (guix-data-service model system)
#:export (valid-targets #:export (valid-targets
count-derivations count-derivations
@ -641,28 +643,12 @@ ORDER BY derivations.file_name
latest-build-status) latest-build-status)
(define query (define query
(string-append (string-append
(get-sql-to-select-package-and-related-derivations-for-revision
conn
(commit->revision-id conn commit)
#:system-id (system->system-id conn system)
#:target target)
" "
WITH RECURSIVE all_derivations(id) AS (
SELECT package_derivations.derivation_id
FROM package_derivations
INNER JOIN systems
ON package_derivations.system_id = systems.id
INNER JOIN guix_revision_package_derivations
ON package_derivations.id =
guix_revision_package_derivations.package_derivation_id
INNER JOIN guix_revisions
ON guix_revision_package_derivations.revision_id = guix_revisions.id
WHERE guix_revisions.commit = $1
AND systems.system = $2
AND package_derivations.target = $3
UNION
SELECT derivation_outputs.derivation_id
FROM all_derivations
INNER JOIN derivation_inputs
ON all_derivations.id = derivation_inputs.derivation_id
INNER JOIN derivation_outputs
ON derivation_inputs.derivation_output_id = derivation_outputs.id
)
SELECT DISTINCT ON (derivations.file_name) SELECT DISTINCT ON (derivations.file_name)
derivations.file_name, derivations.file_name,
( (
@ -679,9 +665,9 @@ SELECT DISTINCT ON (derivations.file_name)
) AS latest_build ) AS latest_build
FROM all_derivations FROM all_derivations
INNER JOIN derivations INNER JOIN derivations
ON all_derivations.id = derivations.id ON all_derivations.derivation_id = derivations.id
INNER JOIN derivation_outputs INNER JOIN derivation_outputs
ON all_derivations.id = derivation_outputs.derivation_id ON all_derivations.derivation_id = derivation_outputs.derivation_id
INNER JOIN derivation_output_details INNER JOIN derivation_output_details
ON derivation_outputs.derivation_output_details_id = derivation_output_details.id ON derivation_outputs.derivation_output_details_id = derivation_output_details.id
LEFT JOIN builds LEFT JOIN builds
@ -695,18 +681,18 @@ LEFT JOIN latest_build_status
WHERE derivation_output_details.hash IS NOT NULL" WHERE derivation_output_details.hash IS NOT NULL"
(if after-derivation-file-name (if after-derivation-file-name
" "
AND derivations.file_name > $5" AND derivations.file_name > $2"
"") "")
(if latest-build-status (if latest-build-status
(simple-format (simple-format
#f #f
" "
AND latest_build_status.status = $~A" AND latest_build_status.status = $~A"
(if after-derivation-file-name 6 5)) (if after-derivation-file-name 3 2))
"") "")
" "
ORDER BY derivations.file_name, latest_build_status.timestamp DESC ORDER BY derivations.file_name, latest_build_status.timestamp DESC
LIMIT $4")) LIMIT $1"))
(map (match-lambda (map (match-lambda
((derivation_file_name latest_build) ((derivation_file_name latest_build)
@ -721,10 +707,7 @@ LIMIT $4"))
(exec-query-with-null-handling (exec-query-with-null-handling
conn conn
query query
`(,commit `(,(number->string (or limit-results 999999)) ; TODO
,system
,target
,(number->string (or limit-results 999999)) ; TODO
,@(if after-derivation-file-name ,@(if after-derivation-file-name
(list after-derivation-file-name) (list after-derivation-file-name)
'()) '())