4c4bf5f31b6f0aa1549778dc06caad4d84ed4966
jcasper
  Tue Feb 20 18:02:40 2018 -0800
hgHubConnect now assembles search results a bit faster (turns out there can be enough hits per hub that head vs tail insertion makes a difference). refs #18865

diff --git src/hg/hgHubConnect/hgHubConnect.c src/hg/hgHubConnect/hgHubConnect.c
index 81455f0..996e864 100644
--- src/hg/hgHubConnect/hgHubConnect.c
+++ src/hg/hgHubConnect/hgHubConnect.c
@@ -1138,33 +1138,37 @@
     struct hubSearchText *hubSearchResults = getHubSearchResults(conn, hubSearchTableName,
             hubSearchTerms, checkDescriptions, lcDbFilter, hubLookup);
     searchResultHash = newHash(5);
     struct hubSearchText *hst = hubSearchResults;
     while (hst != NULL)
         {
         struct hubSearchText *nextHst = hst->next;
         hst->next = NULL;
         struct hashEl *hubHashEnt = hashLookup(searchResultHash, hst->hubUrl);
         if (hubHashEnt == NULL)
             {
             slNameAddHead(&hubsToPrint, hst->hubUrl);
             hashAdd(searchResultHash, hst->hubUrl, hst);
             }
         else
-            slAddTail(&(hubHashEnt->val), hst);
+            slAddHead(&(hubHashEnt->val), hst);
         hst = nextHst;
         }
+    struct hashEl *hel;
+    struct hashCookie cookie = hashFirst(searchResultHash);
+    while ((hel = hashNext(&cookie)) != NULL)
+        slReverse(&(hel->val));
     }
 else
     {
     // There is no active search, so just add all hubs to the list
     struct hashEl *hel;
     struct hashEl *helList;
     helList = hashElListHash(hubLookup);
     for (hel = helList; hel != NULL; hel = hel->next)
         {
         if (isNotEmpty(lcDbFilter))
             {
             struct hubEntry *hubEnt = (struct hubEntry *) hel->val;
             char *lcDbList = cloneString(hubEnt->dbList);
             if (isNotEmpty(lcDbList))
                 tolowers(lcDbList);