0615451d856749db2e4febb4995ff8aee72a8f25 angie Wed Jan 7 12:04:18 2015 -0800 Adding cartJson lib module (to be used by hgAi). It parses JSON commands andreturns information in JSON to support moving more UI actions into Javascript. The lib supports basic queries and actions like getting a list of the groups, tracks and tables (incl. hubs & CTs) and changing the clade/genome/db. Apps/CGIs can extend it to handle new commands by registering handler functions. diff --git src/hg/lib/hdb.c src/hg/lib/hdb.c index 62d12c8..b98ce0e 100644 --- src/hg/lib/hdb.c +++ src/hg/lib/hdb.c @@ -4379,30 +4379,111 @@ struct dbDb *hGetIndexedDatabases() /* Get list of all active databases. * Dispose of this with dbDbFreeList. */ { return hGetIndexedDbsMaybeClade(NULL); } struct dbDb *hGetIndexedDatabasesForClade(char *db) /* Get list of active databases in db's clade. * Dispose of this with dbDbFreeList. */ { return hGetIndexedDbsMaybeClade(db); } +struct slPair *hGetCladeOptions() +/* Return a list of slPairs, each containing clade menu value (hgcentral.clade.name, e.g. 'mammal') + * and clade menu label (hgcentral.clade.label, e.g. 'Mammal'), + * useful for constructing a clade menu. */ +{ +// get only the clades that have actual active genomes +char *query = "NOSQLINJ " + "SELECT DISTINCT(c.name), c.label " + "FROM clade c, genomeClade g, dbDb d " + "WHERE c.name=g.clade AND d.organism=g.genome AND d.active=1 " + "ORDER BY c.priority"; +struct sqlConnection *conn = hConnectCentral(); +struct slPair *nativeClades = sqlQuickPairList(conn, query); +hDisconnectCentral(&conn); + +struct slPair *trackHubClades = trackHubGetCladeLabels(); + +return slCat(nativeClades, trackHubClades); +} + +struct slPair *hGetGenomeOptionsForClade(char *clade) +/* Return a list of slPairs, each containing genome menu value and menu label, + * useful for constructing a genome menu for the given clade. */ +{ +struct slPair *pairList = NULL; +if (isHubTrack(clade)) + { + struct dbDb *hubDbDbList = trackHubGetDbDbs(clade), *dbDb; + for (dbDb = hubDbDbList; dbDb != NULL; dbDb = dbDb->next) + slAddHead(&pairList, slPairNew(dbDb->genome, cloneString(dbDb->genome))); + } +else + { + struct dyString *dy = + sqlDyStringCreate("select distinct(dbDb.genome) from dbDb,genomeClade " + "where dbDb.genome=genomeClade.genome and genomeClade.clade = '%s' " + "order by orderKey", clade); + // Although clade and db menus have distinct values vs. labels, we actually use the + // same strings for values and labels in the genome menu! So we get a plain list + // from the query and turn it into a pair list. + struct sqlConnection *conn = hConnectCentral(); + struct slName *nativeGenomes = sqlQuickList(conn, dy->string), *g; + hDisconnectCentral(&conn); + dyStringFree(&dy); + for (g = nativeGenomes; g != NULL; g = g->next) + slAddHead(&pairList, slPairNew(g->name, cloneString(g->name))); + } +slReverse(&pairList); +return pairList; +} + +struct slPair *hGetDbOptionsForGenome(char *genome) +/* Return a list of slPairs, each containing db menu value and menu label, + * useful for constructing an assembly menu for the given genome. */ +{ +struct slPair *pairList = NULL; +if (isHubTrack(genome)) + { + char *clade = trackHubAssemblyClade(genome); + struct dbDb *hubDbDbList = trackHubGetDbDbs(clade), *dbDb; + for (dbDb = hubDbDbList; dbDb != NULL; dbDb = dbDb->next) + { + char *db = dbDb->name; + if (isEmpty(db)) + db = dbDb->genome; + slAddHead(&pairList, slPairNew(db, cloneString(db))); + } + slReverse(&pairList); + } +else + { + struct dyString *dy = sqlDyStringCreate("select name,description from dbDb " + "where genome = '%s' order by orderKey", genome); + struct sqlConnection *conn = hConnectCentral(); + pairList = sqlQuickPairList(conn, dy->string); + hDisconnectCentral(&conn); + dyStringFree(&dy); + } +return pairList; +} + struct slName *hLiftOverFromDbs() /* Return a list of names of the DBs in the * fromDb column of the liftOverChain.*/ { struct slName *names = NULL; struct liftOverChain *chainList = liftOverChainListFiltered(), *chain; for (chain = chainList; chain != NULL; chain = chain->next) slNameStore(&names, chain->fromDb); liftOverChainFreeList(&chainList); return names; } struct slName *hLiftOverToDbs(char *fromDb) /* Return a list of names of the DBs in the * toDb column of the liftOverChain.