54406b80d5d435970989acff7b22dd6146c6b411 braney Sat Jan 22 15:24:59 2022 -0800 adding chrom alias support to big files diff --git src/hg/lib/chromAlias.c src/hg/lib/chromAlias.c index 0ec22b8..c5c2a59 100644 --- src/hg/lib/chromAlias.c +++ src/hg/lib/chromAlias.c @@ -150,66 +150,103 @@ fprintf(f, "%s", el->chrom); fputc('"',f); fputc(',',f); fputc('"',f); fprintf(f,"source"); fputc('"',f); fputc(':',f); fputc('"',f); fprintf(f, "%s", el->source); fputc('"',f); fputc('}',f); } /* -------------------------------- End autoSql Generated Code -------------------------------- */ -struct hash *chromAliasMakeLookupTable(char *database) -/* Given a database name and a connection to that database, construct a lookup table - * that takes chromosome alias names to a matching struct chromAlias. Returns NULL - * if the given database does not have a chromAlias table. */ +/* our "global" data */ +static struct +{ +char *database; +struct hash *nameHash; +struct hash *forwardHash; +struct hash *reverseHash; +} chromHashes; + +static boolean checkDatabase(char *database) +/* Make sure we don't see different databases. */ +{ +if (database == NULL) + return TRUE; + +if (chromHashes.database != NULL) + { + if (!sameString(chromHashes.database, database)) + { + errAbort("chromAliasSetup: only works for one db. %s was passed in earlier, now %s.", chromHashes.database, database); + return FALSE; + } + return TRUE; + } + +chromHashes.database = cloneString(database); +return TRUE; +} + +void chromAliasSetup(char *database) +/* Read in the chromAlias file/table for this database. */ { -struct hash *hash = NULL; +if (!checkDatabase(database)) + return; + if (!hTableExists(database, "chromAlias")) - return NULL; + return; struct sqlConnection *conn = hAllocConn(database); -hash = hashNew(0); +chromHashes.forwardHash = hashNew(0); +chromHashes.reverseHash = hashNew(0); +chromHashes.nameHash = hashNew(0); + char query[2048]; sqlSafef(query, sizeof(query), "select * from chromAlias"); struct sqlResult *sr = sqlGetResult(conn, query); char **row; while ((row = sqlNextRow(sr)) != NULL) { struct chromAlias *new = chromAliasLoad(row); - hashAdd(hash, new->alias, new); + hashAdd(chromHashes.forwardHash, new->alias, new); + hashAdd(chromHashes.reverseHash, new->chrom, new); + hashAdd(chromHashes.nameHash, new->chrom, new->alias); } sqlFreeResult(&sr); hFreeConn(&conn); -return hash; +} + +struct hash *chromAliasMakeLookupTable(char *database) +/* Given a database name and a connection to that database, construct a lookup table + * that takes chromosome alias names to a matching struct chromAlias. Returns NULL + * if the given database does not have a chromAlias table. */ +{ +if (!checkDatabase(database)) + return NULL; +return chromHashes.forwardHash; } struct hash *chromAliasMakeReverseLookupTable(char *database) /* Given a database name and a connection to that database, construct a lookup table * that takes the actual assembly chromosome names to struct chromAliases. Because a * chromosome name may well have multiple aliases, repeated calls to hashLookupNext * may be required to see them all. Returns NULL if the given database does not have * a chromAlias table. */ { -struct hash *hash = NULL; -if (!hTableExists(database, "chromAlias")) +if (!checkDatabase(database)) return NULL; +return chromHashes.reverseHash; +} -struct sqlConnection *conn = hAllocConn(database); -hash = hashNew(0); -char query[2048]; -sqlSafef(query, sizeof(query), "select * from chromAlias"); -struct sqlResult *sr = sqlGetResult(conn, query); -char **row; -while ((row = sqlNextRow(sr)) != NULL) +struct hash *chromAliasGetHash(char *database) +/* Get the hash that maps chrom names to their aliases. */ { - struct chromAlias *new = chromAliasLoad(row); - hashAdd(hash, new->chrom, new); - } -sqlFreeResult(&sr); -hFreeConn(&conn); -return hash; +if (!checkDatabase(database)) + return NULL; + +return chromHashes.nameHash; }