41d305a15ff5aec9ee260f1aabe2876f0c5163c8
jcasper
  Tue Aug 1 19:44:25 2017 -0700
hgHubConnect now includes context for hub assembly description hits in
searches, and following the link to configure composite subtracks goes to the composite page,
refs #19758

diff --git src/hg/hgHubConnect/hgHubConnect.c src/hg/hgHubConnect/hgHubConnect.c
index 41fa255..02188e0 100644
--- src/hg/hgHubConnect/hgHubConnect.c
+++ src/hg/hgHubConnect/hgHubConnect.c
@@ -391,31 +391,30 @@
         char *hyphenatedTerms[1024];
         int hyphenTerms = chopString(splitTerms[i], "-", hyphenatedTerms, sizeof(hyphenatedTerms));
         int j;
         for (j=0; j<hyphenTerms-1; j++)
             {
             dyStringPrintf(modifiedTerms, "+%s ", hyphenatedTerms[j]);
             }
         if (isStrictSearch)
             dyStringPrintf(modifiedTerms, "+%s ", hyphenatedTerms[j]);
         else
             {
             dyStringPrintf(modifiedTerms, "+%s* ", hyphenatedTerms[j]);
             }
         }
     }
-fprintf(stderr, "Final search terms: %s\n", dyStringContents(modifiedTerms));
 return dyStringCannibalize(&modifiedTerms);
 }
 
 
 struct hubSearchText *getHubSearchResults(struct sqlConnection *conn, char *hubSearchTableName,
         char *hubSearchTerms, bool checkLongText, char *dbFilter, struct hash *hubLookup)
 /* Find hubs, genomes, and tracks that match the provided search terms.
  * Return all hits that satisfy the (optional) supplied assembly filter.
  * if checkLongText is FALSE, skip searching within the long description text entries */
 {
 char *cleanSearchTerms = cloneString(hubSearchTerms);
 if (isNotEmpty(cleanSearchTerms))
     tolowers(cleanSearchTerms);
 bool isStrictSearch = FALSE;
 char *modifiedSearchTerms = modifyTermsForHubSearch(cleanSearchTerms, isStrictSearch);
@@ -749,32 +748,41 @@
     struct trackDb *trackInfo = (struct trackDb *) hashFindVal(tdbHash, track);
     if (trackInfo == NULL)
         {
         // Some tracks are prefixed with the hub name; try that
         char withHubName[4096];
         safef(withHubName, sizeof(withHubName), "%s_%s", hub->name, track);
         trackInfo = hashMustFindVal(tdbHash, withHubName);
         }
     if (isNotEmpty(trackInfo->longLabel))
         dyStringPrintf(tdbOut->shortLabel, "%s", trackInfo->longLabel);
     else if (isNotEmpty(trackInfo->shortLabel))
         dyStringPrintf(tdbOut->shortLabel, "%s", trackInfo->shortLabel);
     else
         dyStringPrintf(tdbOut->shortLabel, "%s", trackHubSkipHubName(trackInfo->track));
 
+    if (tdbIsCompositeView(trackInfo) || tdbIsCompositeChild(trackInfo))
+        {
+        struct trackDb *parentTdb = tdbGetComposite(trackInfo);
+        dyStringPrintf(tdbOut->configUrl, "../cgi-bin/hgTrackUi?hubUrl=%s&db=%s&g=%s&hgsid=%s&%s", hub->url,
+                genomeOut->genomeName, parentTdb->track, cartSessionId(cart), genomeOut->positionString);
+        }
+    else
+        {
         dyStringPrintf(tdbOut->configUrl, "../cgi-bin/hgTrackUi?hubUrl=%s&db=%s&g=%s&hgsid=%s&%s", hub->url,
                 genomeOut->genomeName, trackInfo->track, cartSessionId(cart), genomeOut->positionString);
+        }
 
     if (trackInfo->parent != NULL)
         {
         struct trackDb *parent = trackInfo->parent;
         struct tdbOutputStructure *parentOut = addOrUpdateTrackOut(parent->track, genomeOut, tdbHash, hub);
         slAddTail(&(parentOut->children), tdbOut);
         parentOut->childCount++;
         }
     else
         slAddTail(&(genomeOut->tracks), tdbOut);
     hashAdd(genomeOut->tdbOutHash, track, tdbOut);
     }
 return tdbOut;
 }
 
@@ -862,30 +870,35 @@
         genomeOut->positionString = getPositionStringForDb(genome);
         dyStringPrintf(genomeOut->assemblyLink, "../cgi-bin/hgTracks?hubUrl=%s&db=%s&hgsid=%s&%s",
                 hub->url, genome->name, cartSessionId(cart), genomeOut->positionString);
         char *name = trackHubSkipHubName(genome->name);
         if (isNotEmpty(genome->description))
             dyStringPrintf(genomeOut->shortLabel, "%s (%s)", genome->description, name);
         else if (isNotEmpty(genome->organism))
             dyStringPrintf(genomeOut->shortLabel, "%s %s", genome->organism, name);
         else
             dyStringPrintf(genomeOut->shortLabel, "%s", name);
         genomeOut->genomeName = cloneString(genome->name);
         hashAdd(hubOut->genomeOutHash, db, genomeOut);
         slAddTail(&(hubOut->genomes), genomeOut);
         hubOut->genomeCount++;
         }
+    if (isEmpty(hst->track) && hst->textLength == hubSearchTextLong)
+        {
+        // Genome description match
+        dyStringPrintf(genomeOut->descriptionMatch, "%s", hst->text);
+        }
 
     if (isNotEmpty(hst->track))
         {
         // Time to add a track! (or add info to one, maybe)
         struct hash *tdbHash = (struct hash *) hashFindVal(tdbHashHash, db);
         if (tdbHash == NULL)
             {
             tdbHash = newHash(5);
             hashAdd(tdbHashHash, db, tdbHash);
             struct trackDb *tdbList = trackHubTracksForGenome(hub, genome);
             tdbList = trackDbLinkUpGenerations(tdbList);
             tdbList = trackDbPolishAfterLinkup(tdbList, db);
             trackHubPolishTrackNames(hub, tdbList);
             buildTdbHash(tdbHash, tdbList);
             }