guix: Include synopsis and description in filesearch database.

This commit is contained in:
Pierre Neidhardt 2020-09-26 13:48:35 +02:00
parent 25147f983b
commit 0127cfa5d0
No known key found for this signature in database
GPG key ID: 9BDCF497A4BBCC7F
2 changed files with 73 additions and 13 deletions

View file

@ -59,17 +59,37 @@ (define* (add-files db
(path (error "Missing argument"))
(files (error "Missing argument"))
(version (error "Missing argument"))
(synopsis (error "Missing argument"))
(description (error "Missing argument"))
(guix-version (error "Missing argument")))
"FILES is a list of path underneath PATH."
(sqlite-exec
db
(string-append "insert into Packages (name, system, output, path, version, guix)"
;; "insert or replace into Packages (name, system, output, path, version, guix)"
(format #f " values (~s, ~s, ~s, ~s, ~s, ~s)"
name system output path version guix-version)
;; " on conflict (path) do nothing"
))
(with-statement
db
(string-append "insert into Packages (name, system, output, version, path, guix)"
" values (:name, :system, :output, :version, :path, :guix)")
stmt
(sqlite-bind-arguments stmt
#:name name
#:system system
#:output output
#:path path
#:version version
#:guix guix-version)
(map vector->list
(sqlite-fold cons '() stmt)))
(let ((id ((@@ (guix store database) last-insert-row-id) db))) ; TODO: Export?
(with-statement
db
(string-append "insert into Info (name, synopsis, description, package)"
" values (:name, :synopsis, :description, :id)")
stmt
(sqlite-bind-arguments stmt
#:name name
#:synopsis synopsis
#:description description
#:id id)
(map vector->list
(sqlite-fold cons '() stmt)))
(for-each
(lambda (file)
(sqlite-exec
@ -134,6 +154,8 @@ (define (persist-package-files db package)
#:output output
#:path path ; Storing /gnu/store for all packages has no significant size cost.
#:version (package-version package)
#:synopsis (package-synopsis package)
#:description (package-description package)
#:guix-version %guix-version
#:files (directory-files path)))))
output-path-pairs)))
@ -166,6 +188,29 @@ (define (search-file-package pattern . more-patterns)
(map vector->list
(sqlite-fold cons '() stmt)))))
(define (search-package pattern . more-patterns)
"Return corresponding packages.
Search is performed over name, synopsis, description.
Packages or ordered by most relevant last.
Search is subject to SQLite \"full-text search\" pattern matching.
See https://www.sqlite.org/fts5.html."
(let ((pattern (string-concatenate
(map (lambda (s)
(format #f "~s*" s))
(cons pattern more-patterns)))))
(with-database %db db
(with-statement
db
(string-append
"SELECT name FROM Info WHERE Info MATCH :pattern ORDER BY RANK")
stmt
(sqlite-bind-arguments
stmt
#:pattern (format #f "name:~a OR synopsis:~a OR description:~a"
pattern pattern pattern))
(map vector->list
(sqlite-fold cons '() stmt))))))
(define (format-search search-result)
(for-each
(match-lambda
@ -213,14 +258,21 @@ (define (test-search)
;; Measures
;;
;; Context:
;; - 14,000 packages
;; - 1700 store items
;; - 15005 packages
;; - 1796 store items
;; - CPU 3.5 GHz
;; - SSD
;;
;; Results:
;; Data with synopsis and description:
;; - Database generation time: 30 seconds.
;; - Database size: 31 MiB.
;; - Database Zstd-compressed size: 6.1 MiB.
;; - Database size: 37 MiB.
;; - Database Zstd-compressed size: 6.4 MiB.
;; - Zstd-compression time: 0.13 seconds.
;; - FTS queries: < 0.01 seconds.
;;
;; Data without synopsis and description:
;; - Database generation time: 30 seconds.
;; - Database size: 36 MiB.
;; - Database Zstd-compressed size: 6.0 MiB.
;; - Zstd-compression time: 0.13 seconds.
;; - FTS queries: < 0.01 seconds.

View file

@ -9,6 +9,14 @@ create table if not exists Packages (
guix text not null
);
create virtual table if not exists Info using fts5(
name,
synopsis,
description,
package
);
create virtual table if not exists Files using fts5(
subpath,
package