9c6ef86df0c2a4358634bcd9dae49093e300ff29
angie
Wed Sep 26 15:28:10 2018 -0700
For multi-region alt/fix autocomplete, use {alt,fix}Locations insteaf of {alt,fix}SeqLiftOverPsl because the former are more stable at this point, and the *Locations tables are used by hgTracks. refs #22144
diff --git src/hg/hgSuggest/hgSuggest.c src/hg/hgSuggest/hgSuggest.c
index 97a3a18..c5a077f 100644
--- src/hg/hgSuggest/hgSuggest.c
+++ src/hg/hgSuggest/hgSuggest.c
@@ -96,42 +96,45 @@
}
char *escapeAltFixTerm(char *term)
/* Special tweaks for SQL search of alt/fix terms that may include '.' and '_' characters. */
{
// If there is a ".", make it into a single-character wildcard so that "GL383518.1"
// can match "chr1_GL383518v1_alt".
char termCpy[strlen(term)+1];
safecpy(termCpy, sizeof termCpy, term);
subChar(termCpy, '.', '?');
// Escape '_' because that is an important character in alt/fix sequence names, and support
// wildcards:
return sqlLikeFromWild(termCpy);
}
-struct slName *queryQNames(struct sqlConnection *conn, char *table, char *term, boolean prefixOnly)
-/* If table exists, return qNames in table that match term, otherwise NULL. Exclude items whose
- * tName contains '_' so the mappings between _alt and _fix sequences don't sneak into the wrong
- * category's results. */
+struct slName *queryAltFixNames(struct sqlConnection *conn, char *table, char *term,
+ char *excludeSuffix, boolean prefixOnly)
+/* If table exists, return names in table that match term, otherwise NULL.
+ * Chop after ':' if there is one and exclude items that end with excludeSuffix so the
+ * mappings between _alt and _fix sequences don't sneak into the wrong category's results. */
{
struct slName *names = NULL;
if (sqlTableExists(conn, table))
{
char query[2048];
- sqlSafef(query, sizeof query, "select distinct(qName) from %s where qName like '%s%s%%' "
- "and tName not rlike '.*_.*' order by qName",
- table, (prefixOnly ? "" : "%"), escapeAltFixTerm(term));
+ sqlSafef(query, sizeof query, "select distinct(substring_index(name, ':', 1)) from %s "
+ "where name like '%s%s%%' "
+ "and name not like '%%%s' and name not like '%%%s:%%'"
+ "order by name",
+ table, (prefixOnly ? "" : "%"), escapeAltFixTerm(term), excludeSuffix, excludeSuffix);
names = sqlQuickList(conn, query);
}
return names;
}
void writeAltFixMatches(struct jsonWrite *jw, struct slName *matches, char *category)
/* Append JSON objects containing alt or fix patch sequence names & optional category. */
{
struct slName *match;
for (match = matches; match != NULL; match = match->next)
{
if (strchr(match->name, '_'))
{
jsonWriteObjectStart(jw, NULL);
jsonWriteString(jw, "value", match->name);
@@ -178,40 +181,40 @@
if (isNotEmpty(category))
jsonWriteString(jw, "category", category);
jsonWriteObjectEnd(jw);
}
}
}
void suggestAltOrPatch(char *database, char *term)
/* Print out a Javascript list of objects describing alternate haplotype or fix patch sequences
* from database that match term. */
{
struct jsonWrite *jw = jsonWriteNew();
jsonWriteListStart(jw, NULL);
struct sqlConnection *conn = hAllocConn(database);
// First, search for prefix matches
-struct slName *fixMatches = queryQNames(conn, "fixSeqLiftOverPsl", term, TRUE);
-struct slName *altMatches = queryQNames(conn, "altSeqLiftOverPsl", term, TRUE);
+struct slName *fixMatches = queryAltFixNames(conn, "fixLocations", term, "alt", TRUE);
+struct slName *altMatches = queryAltFixNames(conn, "altLocations", term, "fix", TRUE);
// Add category labels only if we get both types of matches.
writeAltFixMatches(jw, fixMatches, altMatches ? "Fix Patches" : "");
writeAltFixMatches(jw, altMatches, fixMatches ? "Alt Patches" : "");
// If there are no prefix matches, look for partial matches
if (fixMatches == NULL && altMatches == NULL)
{
- fixMatches = queryQNames(conn, "fixSeqLiftOverPsl", term, FALSE);
- altMatches = queryQNames(conn, "altSeqLiftOverPsl", term, FALSE);
+ fixMatches = queryAltFixNames(conn, "fixLocations", term, "alt", FALSE);
+ altMatches = queryAltFixNames(conn, "altLocations", term, "fix", FALSE);
writeAltFixMatches(jw, fixMatches, altMatches ? "Fix Patches" : "");
writeAltFixMatches(jw, altMatches, fixMatches ? "Alt Patches" : "");
}
// If there are still no matches, try chromAlias.
if (fixMatches == NULL && altMatches == NULL)
{
struct slPair *aliasMatches = queryChromAlias(conn, term, TRUE);
writeValLabelMatches(jw, aliasMatches, "");
if (aliasMatches == NULL)
{
struct slPair *aliasMatches = queryChromAlias(conn, term, FALSE);
writeValLabelMatches(jw, aliasMatches, "");
}
}
hFreeConn(&conn);