aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2020-01-04 21:45:27 +0000
committerChristopher Baines <mail@cbaines.net>2020-01-04 21:45:27 +0000
commitceb1f95a1900509d02cafc1b97eae50d3232aefa (patch)
tree7862cc71ef1a531811c3538b66f51b0d0549efa6
parent0ceb62cbc8240debd1ebac63c27815bb94078f0a (diff)
downloaddata-service-ceb1f95a1900509d02cafc1b97eae50d3232aefa.tar
data-service-ceb1f95a1900509d02cafc1b97eae50d3232aefa.tar.gz
Add a function to search for derivations in a revision
-rw-r--r--guix-data-service/model/derivation.scm125
1 files changed, 125 insertions, 0 deletions
diff --git a/guix-data-service/model/derivation.scm b/guix-data-service/model/derivation.scm
index a1770c9..7416512 100644
--- a/guix-data-service/model/derivation.scm
+++ b/guix-data-service/model/derivation.scm
@@ -47,6 +47,7 @@
select-derivation-by-output-filename
select-derivations-using-output
select-derivations-in-revision
+ search-derivations-in-revision
select-derivation-outputs-in-revision
fix-derivation-output-details-hash-encoding
select-derivations-by-revision-name-and-version
@@ -295,6 +296,130 @@ ORDER BY derivations.file_name
(list after-name)
'())))))
+(define* (search-derivations-in-revision conn
+ commit-hash
+ search-query
+ #:key
+ systems
+ targets
+ minimum-builds
+ maximum-builds
+ limit-results
+ after-name)
+ (define criteria
+ (string-join
+ `(,@(filter-map
+ (lambda (field values)
+ (if values
+ (string-append
+ field " IN ("
+ (string-join (map (lambda (value)
+ (simple-format #f "'~A'" value))
+ values)
+ ",")
+ ")")
+ #f))
+ '("derivations.system"
+ "target")
+ (list systems
+ targets))
+ ,@(if minimum-builds
+ (list
+ (string-append
+ "
+(
+ SELECT COUNT(*)
+ FROM builds
+ WHERE builds.derivation_output_details_set_id =
+ derivations_by_output_details_set.derivation_output_details_set_id
+) >= "
+ (number->string minimum-builds)))
+ '())
+ ,@(if maximum-builds
+ (list
+ (string-append
+ "
+(
+ SELECT COUNT(*)
+ FROM builds
+ WHERE builds.derivation_output_details_set_id =
+ derivations_by_output_details_set.derivation_output_details_set_id
+) <= "
+ (number->string maximum-builds)))
+ '()))
+ " AND "))
+
+ (define query
+ (string-append
+ "
+SELECT derivations.file_name,
+ derivations.system,
+ package_derivations.target,
+ (
+ SELECT JSON_AGG(
+ json_build_object(
+ 'build_server_id', builds.build_server_id,
+ 'status', latest_build_status.status,
+ 'timestamp', latest_build_status.timestamp,
+ 'build_for_equivalent_derivation',
+ builds.derivation_file_name != derivations.file_name
+ )
+ ORDER BY latest_build_status.timestamp
+ )
+ FROM builds
+ INNER JOIN (
+ SELECT DISTINCT ON (build_id) *
+ FROM build_status
+ ORDER BY build_id, timestamp DESC
+ ) AS latest_build_status
+ ON builds.id = latest_build_status.build_id
+ WHERE builds.derivation_output_details_set_id =
+ derivations_by_output_details_set.derivation_output_details_set_id
+ ) AS builds
+FROM derivations
+INNER JOIN derivations_by_output_details_set
+ ON derivations.id = derivations_by_output_details_set.derivation_id
+INNER JOIN package_derivations
+ ON derivations.id = package_derivations.derivation_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
+INNER JOIN packages
+ ON package_derivations.package_id = packages.id
+WHERE guix_revisions.commit = $1
+ AND derivations.file_name LIKE $2
+"
+ (if after-name
+ " AND derivations.file_name > $3"
+ "")
+ (if (string-null? criteria)
+ ""
+ (string-append " AND " criteria))
+ "
+ORDER BY derivations.file_name
+"
+ (if limit-results
+ (string-append
+ " LIMIT " (number->string limit-results))
+ "")))
+
+ (map (match-lambda
+ ((file_name system target builds)
+ (list file_name
+ system
+ target
+ (if (string-null? builds)
+ #()
+ (json-string->scm builds)))))
+ (exec-query conn
+ query
+ `(,commit-hash
+ ,(string-append "%" search-query "%")
+ ,@(if after-name
+ (list after-name)
+ '())))))
+
(define* (select-derivation-outputs-in-revision conn
commit-hash
#:key