# HG changeset patch
# User Pierre-Yves David <pierre-yves.david@octobus.net>
# Date 1679578303 0
#      Thu Mar 23 13:31:43 2023 +0000
# Node ID 8665188fd93995cb6872575858349b8c4abe5bae
# Parent  e2a31b27845cba9f62388520545c588ac28cf79a
resulte-compare: make the key comparison more flexible

We want to be able to configure it.

diff --git a/python-libs/poulpe/bin/result-compare b/python-libs/poulpe/bin/result-compare
--- a/python-libs/poulpe/bin/result-compare
+++ b/python-libs/poulpe/bin/result-compare
@@ -9,43 +9,68 @@
     ('data-env-vars', 'name'),
     ('benchmark', 'name'),
     ('bin-env-vars', 'hg', 'flavor'),
+    ('bin-env-vars', 'hg', 'changeset', 'node'),
 ]
 
 
-def key_result(result):
-    headers = []
-    for key in HEADERS_KEYS:
-        treck = list(key[::-1])
-        current = result
-        while treck and current is not None:
-            k = treck.pop()
-            current = current.get(k)
-        if current is not None:
-            headers.append((".".join(key), current))
+def get_value(key, result):
+    treck = list(key[::-1])
+    current = result
+    while treck and current is not None:
+        k = treck.pop()
+        current = current.get(k)
+    return current
+
+
+def make_key_result(compare_key):
+    headers_keys = [k for k in HEADERS_KEYS if k != compare_key]
 
-    variants = result['benchmark'].get('variants', {})
-    for key, value in sorted(variants.items()):
-        headers.append((f"benchmark.variants.{key}", value))
-    return tuple(headers)
+    def key_result(result):
+        headers = []
+        for key in headers_keys:
+            value = get_value(key, result)
+            if value is not None:
+                headers.append((".".join(key), value))
+
+        variant_cmp_key = ".".join(compare_key)
+        variants = result['benchmark'].get('variants', {})
+        for key, value in sorted(variants.items()):
+            key = f"benchmark.variants.{key}"
+            if key == variant_cmp_key:
+                continue
+            headers.append((key, value))
+        return tuple(headers)
+
+    return key_result
 
 
 def _rank(result):
     return result['bin-env-vars']['hg']['changeset']['rank']
 
 
-def dispatch_results(results):
+def dispatch_results(results, compare_key):
+    key_func = make_key_result(compare_key)
     dispatched = collections.defaultdict(list)
     for r in results:
-        headers = key_result(r)
+        headers = key_func(r)
         dispatched[headers].append(r)
 
     for some_results in dispatched.values():
-        some_results.sort(key=_rank)
+        key = SORT_KEYS.get(compare_key)
+        if key is None:
+
+            def key(res):
+                val = get_value(compare_key, res)
+                if val is None:
+                    val = ''
+                return val
+
+        some_results.sort(key=key)
 
     return dispatched
 
 
-def display_results(results):
+def display_results(results, compare_key):
     for headers, some_results in sorted(results.items()):
         key_size = max(len(k) for k, v in headers)
         prefix = "###"
@@ -57,7 +82,9 @@
         base = None
         # display the result now
         for r in some_results:
-            key = r['bin-env-vars']['hg']['changeset']['node'][:12]
+            key = get_value(compare_key, r)
+            if compare_key[-1] == 'node':
+                key = key[:12]
             median = r['result']['time']['median']
             if base is None:
                 base = median
@@ -75,6 +102,9 @@
             click.echo(f"{key}: {median:6.6f} {display}")
 
 
+SORT_KEYS = {('bin-env-vars', 'hg', 'changeset', 'node'): _rank}
+
+
 @click.command()
 @click.argument("file", type=click.File(), default="-")
 def result_compare(file):
@@ -82,8 +112,9 @@
 
     `poulpe result-search --content-as-json | poulpe result-compare`"""
     all_results = json.load(file)
-    results = dispatch_results(all_results)
-    display_results(results)
+    compare_key = ('bin-env-vars', 'hg', 'changeset', 'node')
+    results = dispatch_results(all_results, compare_key)
+    display_results(results, compare_key)
 
 
 if __name__ == "__main__":