217c8a80da9dfabfda95956e5b9b40435f0a9a79 kent Thu Jan 13 19:56:32 2011 -0800 Making hub work with table browser. diff --git src/hg/hgTables/hgTables.c src/hg/hgTables/hgTables.c index e6eb298..017c2f8 100644 --- src/hg/hgTables/hgTables.c +++ src/hg/hgTables/hgTables.c @@ -43,30 +43,31 @@ "options:\n" " -xxx=XXX\n" ); } /* Global variables. */ struct cart *cart; /* This holds cgi and other variables between clicks. */ struct hash *oldVars; /* The cart before new cgi stuff added. */ char *genome; /* Name of genome - mouse, human, etc. */ char *database; /* Current genome database - hg17, mm5, etc. */ char *freezeName; /* Date of assembly. */ struct grp *fullGroupList; /* List of all groups. */ struct grp *curGroup; /* Currently selected group. */ struct trackDb *fullTrackList; /* List of all tracks in database. */ struct hash *fullTrackHash; /* Hash of all tracks in fullTrackList keyed by ->track field. */ +struct hash *fullTrackAndSubtrackHash; /* All tracks and subtracks keyed by track field. */ struct trackDb *forbiddenTrackList; /* List of tracks with 'tableBrowser off' setting. */ struct trackDb *curTrack; /* Currently selected track. */ char *curTable; /* Currently selected table. */ struct joiner *allJoiner; /* Info on how to join tables. */ static struct pipeline *compressPipeline = (struct pipeline *)NULL; boolean allowAllTables(void) /* determine if all tables should is allowed by configuration */ { return !cfgOptionBooleanDefault("hgta.disableAllTables", FALSE); } /* --------------- HTML Helpers ----------------- */ @@ -520,51 +521,35 @@ { char dbTable[256]; safef(dbTable, sizeof(dbTable), "%s.%s", wikiDbName(), WIKI_TRACK_TABLE); return cloneString(dbTable); } else if (strchr(table, '.') != NULL) return cloneString(table); else { char dbTable[256]; safef(dbTable, sizeof(dbTable), "%s.%s", db, table); return cloneString(dbTable); } } -#ifdef UNUSED -char *trackTable(char *rawTable) -/* Return table name for track, substituting all_mrna - * for mRNA if need be. */ -{ -char *table = rawTable; -return table; -} -#endif /* UNUSED */ char *connectingTableForTrack(char *rawTable) /* Return table name to use with all.joiner for track. * You can freeMem this when done. */ { -#ifdef UNUSED -if (sameString(rawTable, "mrna")) - return cloneString("all_mrna"); -else if (sameString(rawTable, "est")) - return cloneString("all_est"); -else -#endif /* UNUSED */ return cloneString(rawTable); } char *chromTable(struct sqlConnection *conn, char *table) /* Get chr1_table if it exists, otherwise table. * You can freeMem this when done. */ { char *chrom = hDefaultChrom(database); if (sqlTableExists(conn, table)) return cloneString(table); else { char buf[256]; safef(buf, sizeof(buf), "%s_%s", chrom, table); return cloneString(buf); @@ -584,44 +569,60 @@ return cloneString(buf); } else return splitTable; } void checkTableExists(struct sqlConnection *conn, char *table) /* Check that table exists, or put up an error message. */ { char *splitTable = chromTable(conn, table); if (!sqlTableExists(conn, table)) errAbort("Table %s doesn't exist", table); freeMem(splitTable); } +struct hTableInfo *hubTrackTableInfo(struct trackDb *tdb) +/* Given trackDb entry for a hub track, wrap table info around it. */ +{ +struct hTableInfo *hti; +AllocVar(hti); +hti->rootName = cloneString(tdb->track); +hti->isPos = TRUE; +hti->type = cloneString(tdb->type); +return hti; +} + struct hTableInfo *maybeGetHti(char *db, char *table, struct sqlConnection *conn) /* Return primary table info, but don't abort if table not there. Conn should be open to db. */ { struct hTableInfo *hti = NULL; if (hIsBigBed(database, table, curTrack, ctLookupName)) { hti = bigBedToHti(table, conn); } else if (isCustomTrack(table)) { struct customTrack *ct = ctLookupName(table); hti = ctToHti(ct); } +else if (isHubTrack(table)) + { + struct trackDb *tdb = hashMustFindVal(fullTrackAndSubtrackHash, table); + hti = hubTrackTableInfo(tdb); + } else if (sameWord(table, WIKI_TRACK_TABLE)) { hti = wikiHti(); } else { char *track; if (startsWith("chrN_", table)) track = table + strlen("chrN_"); else track = table; hti = hFindTableInfo(db, NULL, track); } return(hti); } @@ -1776,47 +1777,63 @@ else if (cartVarExists(cart, hgtaDoSubmitUserRegions)) doSubmitUserRegions(conn); else if (cartVarExists(cart, hgtaDoClearSetUserRegionsText)) doClearSetUserRegionsText(conn); else if (cartVarExists(cart, hgtaDoClearUserRegions)) doClearUserRegions(conn); else if (cartVarExists(cart, hgtaDoMetaData)) doMetaData(conn); else /* Default - put up initial page. */ doMainPage(conn); cartRemovePrefix(cart, hgtaDo); } char *excludeVars[] = {"Submit", "submit", NULL}; +static void rAddTracksToHash(struct trackDb *tdbList, struct hash *hash) +/* Add tracks in list to hash */ +{ +struct trackDb *tdb; +for (tdb = tdbList; tdb != NULL; tdb = tdb->next) + { + hashAdd(hash, tdb->track, tdb); + if (tdb->subtracks) + rAddTracksToHash(tdb->subtracks, hash); + } +} + static struct hash *hashTrackList(struct trackDb *tdbList) /* Return hash full of trackDb's from list, keyed by tdb->track */ { struct hash *hash = hashNew(0); struct trackDb *tdb; for (tdb = tdbList; tdb != NULL; tdb = tdb->next) + { hashAdd(hash, tdb->track, tdb); + } return hash; } void initGroupsTracksTables() /* Get list of groups that actually have something in them. */ { -struct hubConnectStatus *hubList = NULL; // hubConnectStatusListFromCart(cart); +struct hubConnectStatus *hubList = hubConnectStatusListFromCart(cart); struct grp *hubGrpList = NULL; fullTrackList = getFullTrackList(hubList, &hubGrpList); fullTrackHash = hashTrackList(fullTrackList); +fullTrackAndSubtrackHash = hashNew(0); +rAddTracksToHash(fullTrackList, fullTrackAndSubtrackHash); curTrack = findSelectedTrack(fullTrackList, NULL, hgtaTrack); fullGroupList = makeGroupList(fullTrackList, &hubGrpList, allowAllTables()); curGroup = findSelectedGroup(fullGroupList, hgtaGroup); if (sameString(curGroup->name, "allTables")) curTrack = NULL; curTable = findSelectedTable(curTrack, hgtaTable); if (curTrack == NULL) { struct trackDb *tdb = hTrackDbForTrack(database, curTable); struct trackDb *cTdb = hCompositeTrackDbForSubtrack(database, tdb); if (cTdb) curTrack = cTdb; else curTrack = tdb; }