a52bdc2dcb5068501fbc48696d7ad85e8fb2608e hiram Tue Aug 13 17:57:48 2024 -0700 eliminate the DBG statements and get the query string construction into a dyPrintf refs #32897 diff --git src/hg/hubApi/findGenome.c src/hg/hubApi/findGenome.c index 4efd1d1..267e352 100644 --- src/hg/hubApi/findGenome.c +++ src/hg/hubApi/findGenome.c @@ -80,90 +80,93 @@ static long long multipleWordSearch(struct sqlConnection *conn, char **words, int wordCount, struct jsonWrite *jw, long long *totalMatchCount) /* perform search on multiple words, prepare json and return number of matches */ { long long itemCount = 0; *totalMatchCount = 0; if (wordCount < 0) return itemCount; /* get the words[] into a single string */ struct dyString *queryDy = dyStringNew(128); dyStringPrintf(queryDy, "%s", words[0]); for (int i = 1; i < wordCount; ++i) dyStringPrintf(queryDy, " %s", words[i]); -char query[4096]; -if (allowAll) - sqlSafef(query, sizeof(query), "SELECT COUNT(*) FROM %s WHERE MATCH(name, commonName, scientificName, clade, description) AGAINST ('%s' IN BOOLEAN MODE);", asmListTable, queryDy->string); -else - sqlSafef(query, sizeof(query), "SELECT COUNT(*) FROM %s WHERE MATCH(name, commonName, scientificName, clade, description) AGAINST ('%s' IN BOOLEAN MODE) AND browserExists=1;", asmListTable, queryDy->string); -long long matchCount = sqlQuickLongLong(conn, query); +struct dyString *query = dyStringNew(64); +sqlDyStringPrintf(query, "SELECT COUNT(*) FROM %s WHERE MATCH(name, commonName, scientificName, clade, description) AGAINST ('%s' IN BOOLEAN MODE)", asmListTable, queryDy->string); +if (!allowAll) + sqlDyStringPrintf(query, " AND browserExists=1"); +long long matchCount = sqlQuickLongLong(conn, query->string); if (matchCount > 0) { - verbose(1, "DBG: matchCount: %lld from search '%s'\n", matchCount, query); *totalMatchCount = matchCount; - if (allowAll) - sqlSafef(query, sizeof(query), "SELECT * FROM %s WHERE MATCH(name, commonName, scientificName, clade, description) AGAINST ('%s' IN BOOLEAN MODE) ORDER BY priority LIMIT %d;", asmListTable, queryDy->string, maxItemsOutput); - else - sqlSafef(query, sizeof(query), "SELECT * FROM %s WHERE MATCH(name, commonName, scientificName, clade, description) AGAINST ('%s' IN BOOLEAN MODE) AND browserExists=1 ORDER BY priority LIMIT %d;", asmListTable, queryDy->string, maxItemsOutput); - struct sqlResult *sr = sqlGetResult(conn, query); + dyStringFree(&query); + query = dyStringNew(64); + sqlDyStringPrintf(query, "SELECT * FROM %s WHERE MATCH(name, commonName, scientificName, clade, description) AGAINST ('%s' IN BOOLEAN MODE)", asmListTable, queryDy->string); + if (!allowAll) + sqlDyStringPrintf(query, " AND browserExists=1"); + sqlDyStringPrintf(query, " ORDER BY priority LIMIT %d;", maxItemsOutput); + struct sqlResult *sr = sqlGetResult(conn, query->string); itemCount = sqlJsonOut(jw, sr); - verbose(1, "DBG: itemCount: %lld from search '%s'\n", itemCount, query); sqlFreeResult(&sr); + dyStringFree(&query); } return itemCount; } static long long oneWordSearch(struct sqlConnection *conn, char *searchWord, struct jsonWrite *jw, long long *totalMatchCount) /* perform search on a single word, prepare json and return number of matches * and number of potential matches totalMatchCount */ { -char query[4096]; long long itemCount = 0; *totalMatchCount = 0; -if (allowAll) - sqlSafef(query, sizeof(query), "SELECT COUNT(*) FROM %s WHERE MATCH(name, commonName, scientificName, clade, description) AGAINST ('%s' IN BOOLEAN MODE);", asmListTable, searchWord); -else - sqlSafef(query, sizeof(query), "SELECT COUNT(*) FROM %s WHERE MATCH(name, commonName, scientificName, clade, description) AGAINST ('%s' IN BOOLEAN MODE) AND browserExists=1;", asmListTable, searchWord); +struct dyString *query = dyStringNew(64); +sqlDyStringPrintf(query, "SELECT COUNT(*) FROM %s WHERE MATCH(name, commonName, scientificName, clade, description) AGAINST ('%s' IN BOOLEAN MODE)", asmListTable, searchWord); +if (!allowAll) + sqlDyStringPrintf(query, " AND browserExists=1"); -verbose(1, "DBG '%s'\n", query); -long long matchCount = sqlQuickLongLong(conn, query); +long long matchCount = sqlQuickLongLong(conn, query->string); boolean prefixSearch = FALSE; if (matchCount < 1) /* no match, add the * wild card match to make a prefix match */ { - if (allowAll) - sqlSafef(query, sizeof(query), "SELECT COUNT(*) FROM %s WHERE MATCH(name, commonName, scientificName, clade, description) AGAINST ('%s*' IN BOOLEAN MODE);", asmListTable, searchWord); - else - sqlSafef(query, sizeof(query), "SELECT COUNT(*) FROM %s WHERE MATCH(name, commonName, scientificName, clade, description) AGAINST ('%s*' IN BOOLEAN MODE) AND browserExists=1;", asmListTable, searchWord); - matchCount = sqlQuickLongLong(conn, query); + dyStringFree(&query); + query = dyStringNew(64); + sqlDyStringPrintf(query, "SELECT COUNT(*) FROM %s WHERE MATCH(name, commonName, scientificName, clade, description) AGAINST ('%s*' IN BOOLEAN MODE)", asmListTable, searchWord); + if (!allowAll) + sqlDyStringPrintf(query, " AND browserExists=1"); + matchCount = sqlQuickLongLong(conn, query->string); if (matchCount > 0) prefixSearch = TRUE; } if (matchCount < 1) return itemCount; *totalMatchCount = matchCount; -if (allowAll) - sqlSafef(query, sizeof(query), "SELECT * FROM %s WHERE MATCH(name, commonName, scientificName, clade, description) AGAINST ('%s%s' IN BOOLEAN MODE) ORDER BY priority LIMIT %d;", asmListTable, searchWord, prefixSearch ? "*" : "", maxItemsOutput); -else - sqlSafef(query, sizeof(query), "SELECT * FROM %s WHERE MATCH(name, commonName, scientificName, clade, description) AGAINST ('%s%s' IN BOOLEAN MODE) AND browserExists=1 ORDER BY priority LIMIT %d;", asmListTable, searchWord, prefixSearch ? "*" : "", maxItemsOutput); -struct sqlResult *sr = sqlGetResult(conn, query); +dyStringFree(&query); +query = dyStringNew(64); + +sqlDyStringPrintf(query, "SELECT * FROM %s WHERE MATCH(name, commonName, scientificName, clade, description) AGAINST ('%s%s' IN BOOLEAN MODE)", asmListTable, searchWord, prefixSearch ? "*" : ""); +if (!allowAll) + sqlDyStringPrintf(query, " AND browserExists=1"); +sqlDyStringPrintf(query, " ORDER BY priority LIMIT %d;", maxItemsOutput); +struct sqlResult *sr = sqlGetResult(conn, query->string); itemCount = sqlJsonOut(jw, sr); sqlFreeResult(&sr); +dyStringFree(&query); return itemCount; } /* static long long oneWordSearch(struct sqlConnection *conn, char *searchWord, struct jsonWrite *jw) */ static void elapsedTime(struct jsonWrite *jw) { long nowTime = clock1000(); long elapsedTimeMs = nowTime - enteredMainTime; jsonWriteNumber(jw, "elapsedTimeMs", elapsedTimeMs); } void apiFindGenome(char *pathString[MAX_PATH_INFO]) /* 'findGenome' function */ { char *searchString = cgiOptionalString(argGenomeSearchTerm);