c6ce277e36a537437a04146c8fa7adebb40428ff
chmalee
  Wed May 15 12:10:42 2024 -0700
Libify some searching code so checkHgFindSpec can use it. Make checkHgFindSpec use the same code path as hgSearch so it can correctly test the search correctly, refs #33731

diff --git src/hg/hubApi/search.c src/hg/hubApi/search.c
index 3258ac2..a0695fa 100644
--- src/hg/hubApi/search.c
+++ src/hg/hubApi/search.c
@@ -1,89 +1,25 @@
 #include "dataApi.h"
 #include "hgFind.h"
 #include "cartTrackDb.h"
 #include "cartJson.h"
 
-static struct trackDb *addSupers(struct trackDb *trackList)
-/* Insert supertracks into the hierarchy. */
-{
-struct trackDb *newList = NULL;
-struct trackDb *tdb, *nextTdb;
-struct hash *superHash = newHash(5);
-
-for(tdb = trackList; tdb;  tdb = nextTdb)
-    {
-    nextTdb = tdb->next;
-    if (tdb->parent)
-        {
-        // part of a super track
-        if (hashLookup(superHash, tdb->parent->track) == NULL)
-            {
-            hashStore(superHash, tdb->parent->track);
-
-            slAddHead(&newList, tdb->parent);
-            }
-        slAddTail(&tdb->parent->subtracks, tdb);
-        }
-    else
-        slAddHead(&newList, tdb);
-    }
-slReverse(&newList);
-return newList;
-}
-
-static void hashTdbNames(struct trackDb *tdb, struct hash *trackHash)
-/* Store the track names for lookup, except for knownGene which gets its own special
- * category in the UI */
-{
-struct trackDb *tmp;
-for (tmp = tdb; tmp != NULL; tmp = tmp->next)
-    {
-    if (tmp->subtracks)
-        hashTdbNames(tmp->subtracks, trackHash);
-    if (!sameString(tmp->table, tmp->track))
-        hashAdd(trackHash, tmp->track, tmp);
-    hashAdd(trackHash, tmp->table, tmp);
-    }
-}
-
-void hashTracksAndGroups(struct cart *cart, char *db)
-/* get the list of tracks available for this assembly. Note that this implicitly
- * makes connected hubs show up in the trackList struct, which means we get item
- * search for connected hubs for free */
-{
-static struct trackDb *tdbList = NULL;
-static struct grp *grpList = NULL;
-if (tdbList != NULL && grpList != NULL)
-    return;
-
-// hgFindTrackHash/hgFindGroupHash are globals from hgFind.h
-if (!hgFindTrackHash)
-    hgFindTrackHash = hashNew(0);
-if (!hgFindGroupHash)
-    hgFindGroupHash  = hashNew(0);
-cartTrackDbInit(cart, &tdbList, &grpList, FALSE);
-if (!tdbList)
-    errAbort("Error getting tracks for %s", db);
-struct trackDb *superList = addSupers(tdbList);
-tdbList = superList;
-hashTdbNames(superList, hgFindTrackHash);
-struct grp *g;
-for (g = grpList; g != NULL; g = g->next)
-    if (!sameString(g->name, "allTracks") && !sameString(g->name, "allTables"))
-        hashStore(hgFindGroupHash, g->name);
-}
+/* Caches used by hgFind.c */
+extern struct trackDb *hgFindTdbList;
+extern struct grp *hgFindGrpList;
+extern struct hash *hgFindGroupHash;
+extern struct hash *hgFindTrackHash;
 
 struct searchCategory *makeCategsFromString(char *categoriesString, char *db, struct cart *bogusCart)
 /* Turn a ';' separated string of table names into a list of searchCategory */
 {
 struct searchCategory *ret = NULL, *category = NULL;
 int maxCategs = 1024;
 char *chopped[maxCategs];
 int numCategs = chopString(categoriesString, ",", chopped, maxCategs);
 int i;
 for (i = 0; i < numCategs; i++)
     {
     char *categName = chopped[i];
     if (!sameString(categName, "allTracks"))
         category = makeCategory(bogusCart, categName, NULL, db, hgFindGroupHash);
     else