void cJoinX(char *j1, char *j2, char *j3) /* cJoinX - Experiment in C joining.. */ { struct joiner *joiner = joinerRead("../../makeDb/schema/all.joiner"); struct joinerDtf *a = joinerDtfFromDottedTriple(j1); struct joinerDtf *b = joinerDtfFromDottedTriple(j2); struct joinerDtf *c = joinerDtfFromDottedTriple(j3); struct joinerPair *jpList = NULL, *jp; struct joinerDtf *fieldList = NULL; struct hash *visitedHash = hashNew(0); slAddTail(&fieldList, a); slAddTail(&fieldList, b); slAddTail(&fieldList, c); if (joinerDtfAllSameTable(fieldList)) printf("All in same table, easy enough!\n"); else { jpList = joinerFindRouteThroughAll(joiner, fieldList); for (jp = jpList; jp != NULL; jp = jp->next) { printf("%s.%s.%s -> %s.%s.%s\n", jp->a->database, jp->a->table, jp->a->field, jp->b->database, jp->b->table, jp->b->field); } } }
void joinerCheck(char *fileName) /* joinerCheck - Parse and check joiner file. */ { struct joiner *joiner = joinerRead(fileName); /* verify specified database is in all.joiner */ if (database) { if (hashLookup(joiner->databasesIgnored, database)) errAbort("specified database '%s' is on list of databasesIgnored", database); if (!hashLookup(joiner->databasesChecked, database)) errAbort("specified database '%s' is not listed in all.joiner", database); } if (dbCoverage) joinerCheckDbCoverage(joiner); if (tableCoverage) joinerCheckTableCoverage(joiner, database); if (checkTimes) joinerCheckDependencies(joiner, database); if (checkFields) { struct hash *fieldHash; fieldHash = processFieldHash(joiner, fieldListIn, fieldListOut); joinerValidateFields(joiner, fieldHash, identifier); } if (foreignKeys) joinerValidateKeys(joiner, identifier, database); }
struct slName *cartTrackDbTablesForTrack(char *db, struct trackDb *track, boolean useJoiner) /* Return list of all tables associated with track. If useJoiner, the result can include * non-positional tables that are related to track by all.joiner. */ { static struct joiner *allJoiner = NULL; struct hash *uniqHash = newHash(8); struct slName *name, *nameList = NULL; char *trackTable = track->table; hashAdd(uniqHash, trackTable, NULL); if (useJoiner) { if (allJoiner == NULL) allJoiner = joinerRead("all.joiner"); struct joinerPair *jpList, *jp; jpList = joinerRelate(allJoiner, db, trackTable); for (jp = jpList; jp != NULL; jp = jp->next) { struct joinerDtf *dtf = jp->b; if (cartTrackDbIsAccessDenied(dtf->database, dtf->table)) continue; char buf[256]; char *s; if (sameString(dtf->database, db)) s = dtf->table; else { safef(buf, sizeof(buf), "%s.%s", dtf->database, dtf->table); s = buf; } if (!hashLookup(uniqHash, s)) { hashAdd(uniqHash, s, NULL); name = slNameNew(s); slAddHead(&nameList, name); } } slNameSort(&nameList); } /* suppress for parent tracks -- only the subtracks have tables */ if (track->subtracks == NULL) { name = slNameNew(trackTable); slAddHead(&nameList, name); } addTablesAccordingToTrackType(db, &nameList, uniqHash, track); hashFree(&uniqHash); return nameList; }