9fd1c6fa1c7581d60eacdc0eb14c5afda0d35e9b kent Mon Sep 2 11:41:17 2019 -0700 Generating organ table if need be. diff --git src/hca/hcat/hcatTabUpdate/hcatTabUpdate.c src/hca/hcat/hcatTabUpdate/hcatTabUpdate.c index a608945..666da90 100644 --- src/hca/hcat/hcatTabUpdate/hcatTabUpdate.c +++ src/hca/hcat/hcatTabUpdate/hcatTabUpdate.c @@ -335,65 +335,104 @@ else safef(labName, sizeof(labName), "%s", short_name); labName[50] = 0; // not too long char *outFields[4] = {"?short_name", "institution", "@contact_id@hcat_contributor@name@id", "@@contributors@id@hcat_lab_contributors@lab_id@contributor_id@hcat_contributor@name@id"}; struct fieldedTable *labTable = fieldedTableNew("lab", outFields, ArraySize(outFields)); char *outRow[4] = {labName, institute, contact, contributors}; fieldedTableAdd(labTable, outRow, ArraySize(outRow), 1); return labTable; } else return NULL; } +struct fieldedTable *makeOrgan(struct fieldedTable *inProject) +/* If there's and organ field we make an organ table. */ +{ +uglyf("Trying to make organs for %s\n", inProject->name); + +/* See if it's even in the inProject table, and return quickly with a NULL if not. */ +int organIx = fieldedTableFindFieldIx(inProject, "organ"); +uglyf("organsIx %d\n", organIx); +if (organIx < 0) + return NULL; + +/* Make up our little generic table */ +char *outFields[] = {"?short_name", "description",}; +struct fieldedTable *organTable = fieldedTableNew("organ", outFields, ArraySize(outFields)); + +/* Fetch the input value, which is a comma separated list. Then go through + * the list and make a table entry for each item. */ +char **inRow = inProject->rowList->row; +char *organTsv = inRow[organIx]; +struct dyString *csvScratch = dyStringNew(0); +char *organName; +while ((organName = csvParseNext(&organTsv, csvScratch)) != NULL) + { + char *outRow[2] = {organName, "NEEDS DESCRIPTION"}; + fieldedTableAdd(organTable, outRow, ArraySize(outRow), 0); + } + +/* Clean up and go home. */ +dyStringFree(&csvScratch); +return organTable; +} + void hcatTabUpdate(char *inDir, char *outDir) /* hcatTabUpdate - Update the hcat database given a tab seperated input and output dir. */ { // We are actually just looking for specific files in inDir. */ /* Load up input projects table */ char *projectFile = "hcat_project.tsv"; char inPath[PATH_LEN]; safef(inPath, sizeof(inPath), "%s/%s", inDir, projectFile); char *projectRequired[] = {"short_name", "contact_name", "contributors"}; struct fieldedTable *inProject = fieldedTableFromTabFile(inPath, inPath, projectRequired, ArraySize(projectRequired)); /* Load up samples table */ char *sampleFile = "hcat_sample.tsv"; safef(inPath, sizeof(inPath), "%s/%s", inDir, sampleFile); char *sampleRequired[] = {"short_name",}; struct fieldedTable *inSample = fieldedTableFromTabFile(inPath, inPath, sampleRequired, ArraySize(sampleRequired)); /* Make sure inProject table makes sense by having exactly one row */ if (inProject->rowCount != 1) errAbort("Expected one row in %s, got %d\n", projectFile, inProject->rowCount); struct fieldedTable *outContributor = makeContributors(inProject); struct fieldedTable *outProject = makeProject(inProject, inSample); struct fieldedTable *outLab = makeLab(inProject); +struct fieldedTable *outOrgan = makeOrgan(inProject); /* Write output from lowest level to highest level tables. */ makeDirsOnPath(outDir); char outPath[PATH_LEN]; safef(outPath, sizeof(outPath), "%s/hcat_%s", outDir, "contributor.tsv"); fieldedTableToTabFile(outContributor, outPath); +if (outOrgan != NULL) + { + safef(outPath, sizeof(outPath), "%s/hcat_%s", outDir, "organ.tsv"); + fieldedTableToTabFile(outOrgan, outPath); + } + if (outLab != NULL) { safef(outPath, sizeof(outPath), "%s/hcat_%s", outDir, "lab.tsv"); fieldedTableToTabFile(outLab, outPath); } safef(outPath, sizeof(outPath), "%s/hcat_%s", outDir, "project.tsv"); fieldedTableToTabFile(outProject, outPath); } int main(int argc, char *argv[]) /* Process command line. */ { optionInit(&argc, argv, options); if (argc != 3)