Speed up querying for revision package derivations

By splitting it up by system.
This commit is contained in:
Christopher Baines 2024-06-21 15:08:37 +01:00
parent 4e7c2bcfbf
commit e6205e988a
2 changed files with 49 additions and 39 deletions

View file

@ -198,7 +198,7 @@ ORDER BY systems.system DESC,
(define* (select-package-derivations-in-revision conn (define* (select-package-derivations-in-revision conn
commit-hash commit-hash
#:key #:key
systems system
targets targets
minimum-builds minimum-builds
maximum-builds maximum-builds
@ -214,19 +214,25 @@ ORDER BY systems.system DESC,
(string-join (string-join
`(,@(filter-map `(,@(filter-map
(lambda (field values) (lambda (field values)
(if values (cond
(string-append ((list? values)
field " IN (" (string-append
(string-join (map (lambda (value) field " IN ("
(simple-format #f "'~A'" value)) (string-join (map (lambda (value)
values) (simple-format #f "'~A'" value))
",") values)
")") ",")
#f)) ")"))
'("systems.system" ((number? values)
"target") (string-append
(list systems field " = " (number->string values)))
targets)) (else
#f)))
'("package_derivations.system_id" "target")
(list
(and=> system (lambda (system)
(system->system-id conn system)))
targets))
,@(if minimum-builds ,@(if minimum-builds
(list (list
(string-append (string-append
@ -346,7 +352,6 @@ EXISTS (
(string-append (string-append
" "
SELECT derivations.file_name, SELECT derivations.file_name,
systems.system,
package_derivations.target" package_derivations.target"
(if include-builds? (if include-builds?
", ",
@ -371,8 +376,6 @@ SELECT derivations.file_name,
"") "")
" "
FROM derivations FROM derivations
INNER JOIN systems
ON derivations.system_id = systems.id
INNER JOIN derivations_by_output_details_set INNER JOIN derivations_by_output_details_set
ON derivations.id = derivations_by_output_details_set.derivation_id ON derivations.id = derivations_by_output_details_set.derivation_id
INNER JOIN package_derivations INNER JOIN package_derivations
@ -400,7 +403,7 @@ ORDER BY derivations.file_name
""))) "")))
(map (match-lambda (map (match-lambda
((file_name system target builds) ((file_name target builds)
(list file_name (list file_name
system system
target target
@ -408,7 +411,7 @@ ORDER BY derivations.file_name
(eq? #f builds)) (eq? #f builds))
#() #()
(json-string->scm builds)))) (json-string->scm builds))))
((file_name system target) ((file_name target)
(list file_name system target))) (list file_name system target)))
(exec-query conn (exec-query conn
query query

View file

@ -1069,8 +1069,8 @@
(assq-ref query-parameters 'field))) (assq-ref query-parameters 'field)))
(letpar& (letpar&
((derivations ((derivations
(with-resource-from-pool (connection-pool) conn (if search-query
(if search-query (with-resource-from-pool (connection-pool) conn
(search-package-derivations-in-revision (search-package-derivations-in-revision
conn conn
commit-hash commit-hash
@ -1088,24 +1088,31 @@
string->symbol) string->symbol)
#:limit-results limit-results #:limit-results limit-results
#:after-name (assq-ref query-parameters 'after_name) #:after-name (assq-ref query-parameters 'after_name)
#:include-builds? (member "builds" fields)) #:include-builds? (member "builds" fields)))
(select-package-derivations-in-revision (concatenate!
conn (par-map&
commit-hash (lambda (system)
#:systems (assq-ref query-parameters 'system) (with-resource-from-pool (connection-pool) conn
#:targets (assq-ref query-parameters 'target) (select-package-derivations-in-revision
#:maximum-builds (assq-ref query-parameters 'maximum_builds) conn
#:minimum-builds (assq-ref query-parameters 'minimum_builds) commit-hash
#:build-from-build-servers (assq-ref query-parameters #:system system
'build_from_build_server) #:targets (assq-ref query-parameters 'target)
#:no-build-from-build-servers (assq-ref query-parameters #:maximum-builds (assq-ref query-parameters 'maximum_builds)
'no_build_from_build_server) #:minimum-builds (assq-ref query-parameters 'minimum_builds)
#:build-status (and=> (assq-ref query-parameters #:build-from-build-servers (assq-ref query-parameters
'build_status) 'build_from_build_server)
string->symbol) #:no-build-from-build-servers (assq-ref query-parameters
#:limit-results limit-results 'no_build_from_build_server)
#:after-name (assq-ref query-parameters 'after_name) #:build-status (and=> (assq-ref query-parameters
#:include-builds? (member "builds" fields))))) 'build_status)
string->symbol)
#:limit-results limit-results
#:after-name (assq-ref query-parameters 'after_name)
#:include-builds? (member "builds" fields))))
(or (assq-ref query-parameters 'system)
(call-with-resource-from-pool (connection-pool)
list-systems))))))
(build-server-urls (build-server-urls
(call-with-resource-from-pool (connection-pool) (call-with-resource-from-pool (connection-pool)
select-build-server-urls-by-id))) select-build-server-urls-by-id)))