e5297f22c5d7c1cb0b041b0ea4c66206a244c90b
hiram
  Mon Sep 30 10:36:52 2024 -0700
add multiple word search to the hgGateway assembly search box function refs #32596

diff --git src/hg/hgGateway/hgGateway.c src/hg/hgGateway/hgGateway.c
index ce0b9fe..94186b8 100644
--- src/hg/hgGateway/hgGateway.c
+++ src/hg/hgGateway/hgGateway.c
@@ -867,31 +867,31 @@
         for (dbName = matchDbList;  dbName != NULL;  dbName = dbName->next)
             if (! hashLookup(localDbs, dbName->name) && slNameInList(hubDbList, dbName->name))
                 {
                 char *label = hashFindVal(dbLabel, dbName->name);
                 if (label)
                     slAddHead(&aHubMatchList, aHubMatchNew(shortLabel, hubUrl, dbName->name, label));
                 else
                     slAddHead(&aHubMatchList, aHubMatchNew(shortLabel, hubUrl, dbName->name, NULL));
                 }
         }
     }
 slReverse(&aHubMatchList);
 hDisconnectCentral(&conn);
 dyStringFree(&query);
 return aHubMatchList;
-}
+}	/*	static struct aHubMatch *filterHubSearchTextMatches()	*/
 
 static void writeAssemblyHubMatches(struct jsonWrite *jw, struct aHubMatch *aHubMatchList)
 /* Write out JSON for each assembly in each assembly hub that matched the search term. */
 {
 struct aHubMatch *aHubMatch;
 for (aHubMatch = aHubMatchList;  aHubMatch != NULL;  aHubMatch = aHubMatch->next)
     {
     jsonWriteObjectStart(jw, NULL);
     jsonWriteString(jw, "genome", aHubMatch->shortLabel);
     jsonWriteString(jw, "db", aHubMatch->aDb);
     jsonWriteString(jw, "hubUrl", aHubMatch->hubUrl);
     jsonWriteString(jw, "hubName", hubNameFromUrl(aHubMatch->hubUrl));
     // Add a category label for customized autocomplete-with-categories.
     char category[PATH_LEN*4];
     safef(category, sizeof(category), "Assembly Hub: %s", aHubMatch->shortLabel);
@@ -992,31 +992,31 @@
     if (isGenArk(el->name))
 	{
 	++c;
 	char genarkUrl[PATH_MAX];
 	safef(genarkUrl, sizeof(genarkUrl), "%s/%s", genarkPrefix, el->hubUrl);
 	slAddHead(&ret, gHubMatchNew(el->name, genarkUrl, NULL, el->scientificName, el->commonName, *el->priority));
 	}
     if ( c > 20 )	/* allow only 20 genArk returns */
 	break;
     }
 sqlFreeResult(&sr);
 
 if (ret)
     slReverse(&ret);
 return ret;
-}
+}	/*	static struct gHubMatch *filterAssemblyListMatche	*/
 
 static struct gHubMatch *searchGenark(char *term)
 /* Search through the genark table (or assemblyList table) for hubs
    matches term */
 {
 char *genarkPrefix = cfgOption("genarkHubPrefix");
 if (genarkPrefix == NULL)
     return NULL;
 
 struct sqlConnection *conn = hConnectCentral();
 struct gHubMatch *gHubMatchList = NULL;
 char *genarkTbl = genarkTableName();
 int colCount = genArkColumnCount();
 int termLength = strlen(term);
 
@@ -1033,31 +1033,36 @@
 	long long matchCount = sqlQuickLongLong(conn, query->string);
 
 	dyStringFree(&query);
         boolean wildCard = FALSE;
         if (0 == matchCount)	/* try prefix search */
 	    {
 	    query = dyStringNew(64);
 	    sqlDyStringPrintf(query, "SELECT COUNT(*) FROM %s WHERE MATCH(name, commonName, scientificName, clade, description, refSeqCategory, versionStatus, assemblyLevel) AGAINST ('%s*' IN BOOLEAN MODE) AND browserExists=1", asmListTable, term);
 	    matchCount = sqlQuickLongLong(conn, query->string);
 	    dyStringFree(&query);
             if (matchCount > 0)
 		wildCard = TRUE;
 	    }
         if (matchCount > 0)
             gHubMatchList = filterAssemblyListMatches(conn, asmListTable, term, genarkPrefix, wildCard);
-	}	/* 1 == wordCout  */
+	}	/* 1 == wordCout single word search  */
+    else
+	{	/* multiple word search */
+        char *matchAllWords = asmListMatchAllWords(term);
+        gHubMatchList = filterAssemblyListMatches(conn, asmListTable, matchAllWords, genarkPrefix, FALSE);
+	}	/* multiple word search */
     }	/* termLength > 2	*/
 else if (sqlTableExists(conn, genarkTbl))
     {
     char query[1024];
     if (colCount > 6)
 	{
 	sqlSafef(query, sizeof(query), "select * from %s where "
              "(gcAccession like '%%%s%%' or scientificName like '%%%s%%' or commonName like '%%%s%%' or asmName like '%%%s%%') order by priority",
              genarkTbl, term, term, term, term);
 	}
     else
 	{
 	sqlSafef(query, sizeof(query), "select * from %s where "
              "(gcAccession like '%%%s%%' or scientificName like '%%%s%%' or commonName like '%%%s%%' or asmName like '%%%s%%') order by taxId ASC, commonName DESC",
              genarkTbl, term, term, term, term);