2770a53d1e8e0e5773020965d19c2499439481ca
chmalee
Tue Feb 7 13:33:08 2023 -0800
Make hubApi return data from multiple tracks at once. Get trackDb tableBrowser setting working correctly in the api
diff --git src/hg/hubApi/hubApi.c src/hg/hubApi/hubApi.c
index 73cf62c..ae8d8d1 100644
--- src/hg/hubApi/hubApi.c
+++ src/hg/hubApi/hubApi.c
@@ -245,31 +245,31 @@
safef(errorPrint, sizeof(errorPrint), " ERROR: %s", errorString);
}
boolean superChild = tdbIsSuperTrackChild(tdb);
char *genome = NULL;
if (hub)
genome = hub->genomeList->name;
struct dyString *extraDyFlags = dyStringNew(128);
if (debug)
dyStringAppend(extraDyFlags, ";debug=1");
if (jsonOutputArrays)
dyStringAppend(extraDyFlags, ";jsonOutputArrays=1");
char *extraFlags = dyStringCannibalize(&extraDyFlags);
-if (protectedTrack(tdb, tdb->track))
+if (protectedTrack(db, tdb, tdb->track))
hPrintf("
%s : %s <protected data>\n", tdb->track, tdb->type);
else if (db)
{
if (hub)
{
char urlReference[2048];
safef(urlReference, sizeof(urlReference), " (sample data)%s\n", urlPrefix, hub->url, genome, tdb->track, extraFlags, errorPrint);
if (tdb->parent)
hPrintf("%s: %s subtrack of parent: %s%s\n", tdb->track, tdb->type, tdb->parent->track, urlReference);
else
hPrintf("%s: %s%s\n", tdb->track, tdb->type, urlReference);
}
else
{
@@ -286,61 +286,61 @@
}
else if (hub)
{
char urlReference[2048];
safef(urlReference, sizeof(urlReference), " (sample data)%s\n", urlPrefix, hub->url, genome, tdb->track, extraFlags, errorPrint);
if (tdb->parent)
hPrintf("%s: %s subtrack of parent: %s%s\n", tdb->track, tdb->type, tdb->parent->track, urlReference);
else
hPrintf("%s: %s%s\n", tdb->track, tdb->type, urlReference);
}
else
hPrintf("%s : %s not db hub track ?\n", tdb->track, tdb->type);
}
-static void hubSampleUrl(struct trackHub *hub, struct trackDb *tdb,
+static void hubSampleUrl(struct trackHub *hub, char *db, struct trackDb *tdb,
long chromCount, long itemCount, char *genome, char *errorString)
{
struct dyString *extraDyFlags = dyStringNew(128);
if (debug)
dyStringAppend(extraDyFlags, ";debug=1");
if (jsonOutputArrays)
dyStringAppend(extraDyFlags, ";jsonOutputArrays=1");
char *extraFlags = dyStringCannibalize(&extraDyFlags);
char errorPrint[2048];
errorPrint[0] = 0;
if (isNotEmpty(errorString))
{
safef(errorPrint, sizeof(errorPrint), " : ERROR: %s", errorString);
}
char countsMessage[512];
countsMessage[0] = 0;
if (chromCount > 0 || itemCount > 0)
{
if (allowedBigBedType(tdb->type))
safef(countsMessage, sizeof(countsMessage), " : %ld chroms : %ld item count ", chromCount, itemCount);
else if (startsWithWord("bigWig", tdb->type))
safef(countsMessage, sizeof(countsMessage), " : %ld chroms : %ld bases covered ", chromCount, itemCount);
else
safef(countsMessage, sizeof(countsMessage), " : %ld chroms : %ld count ", chromCount, itemCount);
}
-if (protectedTrack(tdb, tdb->track))
+if (protectedTrack(db, tdb, tdb->track))
hPrintf(" %s: %s protected data\n", tdb->track, tdb->type);
else if (isSupportedType(tdb->type))
{
char urlReference[2048];
safef(urlReference, sizeof(urlReference), "(sample data)%s\n", urlPrefix, hub->url, genome, tdb->track, extraFlags, errorPrint);
if (allowedBigBedType(tdb->type))
hPrintf(" %s: %s%s%s\n", tdb->track, tdb->type, countsMessage, urlReference);
else if (startsWithWord("bigWig", tdb->type))
hPrintf(" %s: %s%s%s\n", tdb->track, tdb->type, countsMessage, urlReference);
else
hPrintf(" %s: %s%s%s\n", tdb->track, tdb->type, countsMessage, urlReference);
}
else
{
@@ -503,31 +503,31 @@
if (relIdxUrl != NULL)
bigDataIndex = trackHubRelativeUrl(hub->genomeList->trackDbFile, relIdxUrl);
char *bigDataUrl = trackDbSetting(tdbEl, "bigDataUrl");
char *longName = NULL;
unsigned longSize = 0;
struct dyString *errors = dyStringNew(1024);
(void) bbiBriefMeasure(tdbEl->type, bigDataUrl, bigDataIndex, &chromCount, &itemCount, errors, &longName, &longSize);
chromSize = longSize;
chromName = longName;
}
if (tdbIsCompositeView(tdbEl))
hPrintf("%s: %s : composite view of parent: %s\n", tdbEl->track, tdbEl->type, tdbEl->parent->track);
else
{
if (isSupportedType(tdbEl->type))
- hubSampleUrl(hub, tdbEl, chromCount, itemCount, genome, errorString);
+ hubSampleUrl(hub, db, tdbEl, chromCount, itemCount, genome, errorString);
else
hPrintf("%s: %s : subtrack of parent: %s\n", tdbEl->track, tdbEl->type, tdbEl->parent->track);
}
hashCountTrack(tdbEl, countTracks);
if (tdbEl->subtracks)
hubSubTracks(hub, db, tdbEl, countTracks, chromCount, itemCount, chromName, chromSize, genome, errorString);
}
}
hPrintf(" \n");
} /* hubSubTracks() */
static void showSubTracks(struct trackHub *hub, char *db, struct trackDb *tdb, struct hash *countTracks,
char *chromName, unsigned chromSize, char *errorString)
/* tdb has subtracks, show only subTracks, no details */
{
@@ -544,61 +544,61 @@
else
{
if (isSupportedType(tdbEl->type))
sampleUrl(hub, db, tdbEl, errorString);
else
hPrintf("%s: %s : subtrack of parent: %s\n", tdbEl->track, tdbEl->type, tdbEl->parent->track);
}
hashCountTrack(tdbEl, countTracks);
if (tdbEl->subtracks)
showSubTracks(hub, db, tdbEl, countTracks, chromName, chromSize, errorString);
}
}
hPrintf(" \n");
}
-static void trackSettings(struct trackDb *tdb, struct hash *countTracks)
+static void trackSettings(char *db, struct trackDb *tdb, struct hash *countTracks)
/* process the settingsHash for a trackDb, recursive when subtracks */
{
hPrintf(" \n");
-boolean protectedData = protectedTrack(tdb, tdb->track);
+boolean protectedData = protectedTrack(db, tdb, tdb->track);
struct hashEl *hel;
struct hashCookie hc = hashFirst(tdb->settingsHash);
while ((hel = hashNext(&hc)) != NULL)
{
if (sameWord("track", hel->name))
continue; // already output in header
if (sameWord("tableBrowser", hel->name)
&& startsWithWord("off", (char*)hel->val))
hPrintf(" - protectedData: 'true'
\n");
else if (protectedData && sameWord("bigDataUrl", hel->name))
hPrintf(" - bigDataUrl: <protected data>
\n");
else if (isEmpty((char *)hel->val))
hPrintf(" - %s: <empty>
\n", hel->name);
else
hPrintf(" - %s: '%s'
\n", hel->name, (char *)hel->val);
}
if (tdb->subtracks)
{
struct trackDb *tdbEl = NULL;
if (debug)
hPrintf(" - has %d subtrack(s)
\n", slCount(tdb->subtracks));
for (tdbEl = tdb->subtracks; tdbEl; tdbEl = tdbEl->next)
{
hPrintf("- subtrack: %s of parent: %s : type: '%s' (TBD: sample data)
\n", tdbEl->track, tdbEl->parent->track, tdbEl->type);
hashCountTrack(tdbEl, countTracks);
- trackSettings(tdbEl, countTracks);
+ trackSettings(db, tdbEl, countTracks);
}
}
hPrintf("
\n");
}
static void hubCountOneTdb(struct trackHub *hub, char *db, struct trackDb *tdb,
char *bigDataIndex, struct hash *countTracks, char *chromName,
unsigned chromSize, char *genome)
{
char *bigDataUrl = trackDbSetting(tdb, "bigDataUrl");
boolean compositeContainer = tdbIsComposite(tdb);
boolean compositeView = tdbIsCompositeView(tdb);
boolean superChild = tdbIsSuperTrackChild(tdb);
boolean depthSearch = cartUsualBoolean(cart, "depthSearch", FALSE);
hashCountTrack(tdb, countTracks);
@@ -614,90 +614,90 @@
if (! (compositeContainer || compositeView) )
{
if (chromSize < 1 || depthSearch)
{
char *longName = NULL;
unsigned longSize = 0;
(void) bbiBriefMeasure(tdb->type, bigDataUrl, bigDataIndex, &chromCount, &itemCount, errors, &longName, &longSize);
chromSize = longSize;
chromName = longName;
}
}
if (depthSearch && bigDataUrl)
{
if (isSupportedType(tdb->type))
- hubSampleUrl(hub, tdb, chromCount, itemCount, genome, errors->string);
+ hubSampleUrl(hub, db, tdb, chromCount, itemCount, genome, errors->string);
}
else
{
if (compositeContainer)
hPrintf(" %s: %s : composite track container has %d subtracks\n", tdb->track, tdb->type, slCount(tdb->subtracks));
else if (compositeView)
hPrintf(" %s: %s : composite view of parent: %s\n", tdb->track, tdb->type, tdb->parent->track);
else if (superChild)
{
if (isSupportedType(tdb->type))
- hubSampleUrl(hub, tdb, chromCount, itemCount, genome, errors->string);
+ hubSampleUrl(hub, db, tdb, chromCount, itemCount, genome, errors->string);
else
hPrintf(" %s: %s : superTrack child of parent: %s\n", tdb->track, tdb->type, tdb->parent->track);
}
else if (! depthSearch && bigDataUrl)
{
if (isSupportedType(tdb->type))
{
- hubSampleUrl(hub, tdb, chromCount, itemCount, genome, errors->string);
+ hubSampleUrl(hub, db, tdb, chromCount, itemCount, genome, errors->string);
}
}
else
{
if (isSupportedType(tdb->type))
{
- hubSampleUrl(hub, tdb, chromCount, itemCount, genome, errors->string);
+ hubSampleUrl(hub, db, tdb, chromCount, itemCount, genome, errors->string);
}
else
hPrintf(" %s: %s (what is this)\n", tdb->track, tdb->type);
}
}
if (allTrackSettings)
{
hPrintf(" \n");
- trackSettings(tdb, countTracks); /* show all settings */
+ trackSettings(db, tdb, countTracks); /* show all settings */
hPrintf("
\n");
}
else if (tdb->subtracks)
{
hubSubTracks(hub, db, tdb, countTracks, chromCount, itemCount, chromName, chromSize, genome, errors->string);
}
return;
} /* static void hubCountOneTdb(char *db, struct trackDb *tdb,
* char *bigDataIndex, struct hash *countTracks,
* char *chromName, unsigned chromSize)
*/
static void countOneTdb(char *db, struct trackDb *tdb,
struct hash *countTracks, char *chromName, unsigned chromSize,
char *errorString)
/* for this tdb in this db, count it up and provide a sample */
{
char *bigDataUrl = trackDbSetting(tdb, "bigDataUrl");
boolean compositeContainer = tdbIsComposite(tdb);
boolean compositeView = tdbIsCompositeView(tdb);
boolean superChild = tdbIsSuperTrackChild(tdb);
boolean depthSearch = cartUsualBoolean(cart, "depthSearch", FALSE);
-boolean protectedData = protectedTrack(tdb, tdb->track);
+boolean protectedData = protectedTrack(db, tdb, tdb->track);
hashCountTrack(tdb, countTracks);
if (compositeContainer)
hPrintf(" %s: %s : composite track container has %d subtracks\n", tdb->track, tdb->type, slCount(tdb->subtracks));
else if (compositeView)
hPrintf(" %s: %s : composite view of parent: %s\n", tdb->track, tdb->type, tdb->parent->track);
else if (superChild)
{
if (isSupportedType(tdb->type))
sampleUrl(NULL, db, tdb, errorString);
else
hPrintf(" %s: %s : superTrack child of parent: %s\n", tdb->track, tdb->type, tdb->parent->track);
}
else if (! depthSearch && bigDataUrl)
{
@@ -705,31 +705,31 @@
hPrintf(" %s: %s : <protected data>\n", tdb->track, tdb->type);
else
hPrintf(" %s: %s : %s\n", tdb->track, tdb->type, bigDataUrl);
}
else
{
if (isSupportedType(tdb->type))
sampleUrl(NULL, db, tdb, errorString);
else
hPrintf(" %s: %s\n", tdb->track, tdb->type);
}
if (allTrackSettings)
{
hPrintf(" \n");
- trackSettings(tdb, countTracks); /* show all settings */
+ trackSettings(db, tdb, countTracks); /* show all settings */
hPrintf("
\n");
}
else if (tdb->subtracks)
{
showSubTracks(NULL, db, tdb, countTracks, chromName, chromSize, NULL);
}
return;
} /* static void countOneTdb(char *db, struct trackDb *tdb,
* struct hash *countTracks, char *chromName,
* unsigned chromSize)
*/
static unsigned largestChrom(char *db, char **nameReturn, int *chromCount)
/* return the length and get the chrom name for the largest chrom
* from chromInfo table. For use is sample getData URLs