all messages for Guix-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* bug#36763: `guix search` does unexpected logical and
@ 2019-07-22 17:11 zimoun
  2019-07-25 17:35 ` Ludovic Courtès
  0 siblings, 1 reply; 6+ messages in thread
From: zimoun @ 2019-07-22 17:11 UTC (permalink / raw)
  To: 36763

[-- Attachment #1: Type: text/plain, Size: 808 bytes --]

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

[-- Attachment #2: search.patch --]
[-- Type: text/x-patch, Size: 2101 bytes --]

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

^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2019-09-19 20:01 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-07-22 17:11 bug#36763: `guix search` does unexpected logical and zimoun
2019-07-25 17:35 ` Ludovic Courtès
2019-09-13 18:23   ` zimoun
2019-09-16  8:17     ` Ludovic Courtès
2019-09-19 17:32       ` zimoun
2019-09-19 19:56         ` Ludovic Courtès

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/guix.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.