Dear,
As discussed here [1], the `relevance` in `guix/ui.scm` does not match
"inter-field".
Attached a fix.
Now, the example from the manual
$ guix search crypto library | \
recsel -e '! (name ~ "^(ghc|perl|python|ruby)")' -p name,synopsis
outputs the expected crypto libraries as `libb2`.
Please comment. :-)
Then, please indicate me how the commit has to be filled.
The commit 8874faaaac665100a095ef25e39c9a389f5a397f introducing the
logical AND says:
ui: 'relevance' considers regexps connected with a logical and.
* guix/ui.scm (relevance)[score]: Change to return 0 when one of REGEXPS
doesn't match.
* tests/ui.scm ("package-relevance"): New test.
Should another test be added?
[1] https://lists.gnu.org/archive/html/guix-devel/2019-07/msg00263.html
Thank you in advance,
simon
diff --git a/guix/ui.scm b/guix/ui.scm
index 7920335928..0e60eb6edc 100644
--- a/guix/ui.scm
+++ b/guix/ui.scm
@@ -1291,23 +1291,36 @@ score, the more relevant OBJ is to REGEXPS."
5 ;exact match
1)))))
regexps))
-
+ scores)
+
+ (define (update relevance weight scores)
+ (map + relevance
+ (map (lambda (score)
+ (* weight score))
+ scores)))
+
+ (let ((scores (fold (lambda (metric relevance)
+ (match metric
+ ((field . weight)
+ (match (field obj)
+ (#f relevance)
+ ((? string? str)
+ (update relevance weight (score str)))
+ ((lst ...)
+ (update relevance weight
+ (fold (lambda (elem prev)
+ (if (zero? (length elem))
+ prev
+ (map + elem prev)))
+ (make-list (length regexps) 0)
+ (map score lst)))
+ )))))
+ (make-list (length regexps) 0)
+ metrics)))
;; Return zero if one of REGEXPS doesn't match.
(if (any zero? scores)
0
- (reduce + 0 scores)))
-
- (fold (lambda (metric relevance)
- (match metric
- ((field . weight)
- (match (field obj)
- (#f relevance)
- ((? string? str)
- (+ relevance (* (score str) weight)))
- ((lst ...)
- (+ relevance (* weight (apply + (map score lst)))))))))
- 0
- metrics))
+ (reduce + 0 scores))))
(define %package-metrics
;; Metrics used to compute the "relevance score" of a package against a set