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