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);