5c9ad606d5b486c3e1360250907cae2c13869d90 braney Sun Mar 29 12:52:58 2026 -0700 Factor out common quickLift SQL load pattern into shared functions Add quickLiftResolveTable() and quickLiftSqlLoadBeds() to eliminate duplicated custom-track resolution and SQL-based quickLift loading code across bedTrack.c, simpleTracks.c, gvfTrack.c, and hgc.c. No redmine Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> diff --git src/hg/hgTracks/bedTrack.c src/hg/hgTracks/bedTrack.c index 8a443b7f6ec..465d76fdfe6 100644 --- src/hg/hgTracks/bedTrack.c +++ src/hg/hgTracks/bedTrack.c @@ -134,45 +134,32 @@ if (filtered) labelTrackAsFilteredNumber(tg, filtered); lmCleanup(&lm); } else { char *table = tg->table; struct customTrack *ct = tg->customPt; struct sqlConnection *conn = NULL; char *liftDb = cloneString(trackDbSetting(tg->tdb, "quickLiftDb")); char *scoreFilterClause = getScoreFilterClause(cart, tg->tdb,NULL); if (liftDb != NULL) { - char *table; - if (isCustomTrack(tg->table)) - { - liftDb = CUSTOM_TRASH; - table = trackDbSetting(tg->tdb, "dbTableName"); - } - else - table = tg->table; - struct hash *chainHash = newHash(8); - struct sqlConnection *conn = hAllocConn(liftDb); - char *quickLiftFile = cloneString(trackDbSetting(tg->tdb, "quickLiftUrl")); - bed = (struct bed *)quickLiftSql(conn, quickLiftFile, table, chromName, winStart, winEnd, NULL, scoreFilterClause, (ItemLoader2)loader, 0, chainHash); - - list = quickLiftBeds(bed, chainHash, FALSE); - hFreeConn(&conn); + list = quickLiftSqlLoadBeds(tg->tdb, tg->table, liftDb, chromName, winStart, winEnd, + scoreFilterClause, (ItemLoader2)loader, 0, FALSE); } else { if (ct == NULL) conn = hAllocConnTrack(database, tg->tdb); else { conn = hAllocConn(CUSTOM_TRASH); table = ct->dbTableName; } struct sqlResult *sr = NULL; /* limit to items above a specified score */ if (doScoreCtFilter && (topTable != NULL) && hTableExists(database, topTable)) { sqlSafef(query, sizeof(query),"select * from %s order by score desc limit %d", @@ -314,55 +301,42 @@ sr = hRangeQuery(conn, tg->table, chromName, winStart, winEnd, NULL, &rowOffset); } while ((row = sqlNextRow(sr)) != NULL) { bed = bedLoadN(row+rowOffset, 9); lf = bedMungToLinkedFeatures(&bed, tdb, 9, scoreMin, scoreMax, useItemRgb); slAddHead(&lfList, lf); } sqlFreeResult(&sr); hFreeConn(&conn); } else { - char *table; - if (isCustomTrack(tg->table)) - { - liftDb = CUSTOM_TRASH; - table = trackDbSetting(tg->tdb, "dbTableName"); - } - else - table = tg->table; - struct hash *chainHash = newHash(8); - struct sqlConnection *conn = hAllocConn(liftDb); - char *quickLiftFile = cloneString(trackDbSetting(tg->tdb, "quickLiftUrl")); - bed = (struct bed *)quickLiftSql(conn, quickLiftFile, table, chromName, winStart, winEnd, NULL, scoreFilterClause, (ItemLoader2)bedLoadN, 9, chainHash); - - struct bed *liftedBeds = quickLiftBeds(bed, chainHash, FALSE); + struct bed *liftedBeds = quickLiftSqlLoadBeds(tg->tdb, tg->table, liftDb, chromName, + winStart, winEnd, scoreFilterClause, (ItemLoader2)bedLoadN, 9, FALSE); for(bed = liftedBeds; bed; bed = bed->next) { lf = lfFromBedExtra(bed, scoreMin, scoreMax); if (useItemRgb) { lf->useItemRgb = TRUE; lf->filterColor=bed->itemRgb; } slAddHead(&lfList, lf); } - hFreeConn(&conn); } } slReverse(&lfList); slSort(&lfList, linkedFeaturesCmp); tg->items = lfList; } void loadBed8(struct track *tg) /* Convert bed 8 info in window to linked feature. */ { struct bed *bed; struct linkedFeatures *lfList = NULL, *lf; struct trackDb *tdb = tg->tdb; int scoreMin = atoi(trackDbSettingClosestToHomeOrDefault(tdb, "scoreMin", "0")); @@ -399,55 +373,42 @@ sr = hRangeQuery(conn, tg->table, chromName, winStart, winEnd, NULL, &rowOffset); } while ((row = sqlNextRow(sr)) != NULL) { bed = bedLoadN(row+rowOffset, 8); lf = bedMungToLinkedFeatures(&bed, tdb, 8, scoreMin, scoreMax, useItemRgb); slAddHead(&lfList, lf); } sqlFreeResult(&sr); hFreeConn(&conn); } else { - char *table; - if (isCustomTrack(tg->table)) - { - liftDb = CUSTOM_TRASH; - table = trackDbSetting(tg->tdb, "dbTableName"); - } - else - table = tg->table; - struct hash *chainHash = newHash(8); - struct sqlConnection *conn = hAllocConn(liftDb); - char *quickLiftFile = cloneString(trackDbSetting(tg->tdb, "quickLiftUrl")); - bed = (struct bed *)quickLiftSql(conn, quickLiftFile, table, chromName, winStart, winEnd, NULL, scoreFilterClause, (ItemLoader2)bedLoadN, 8, chainHash); - - struct bed *liftedBeds = quickLiftBeds(bed, chainHash, TRUE); + struct bed *liftedBeds = quickLiftSqlLoadBeds(tg->tdb, tg->table, liftDb, chromName, + winStart, winEnd, scoreFilterClause, (ItemLoader2)bedLoadN, 8, TRUE); for(bed = liftedBeds; bed; bed = bed->next) { lf = lfFromBedExtra(bed, scoreMin, scoreMax); if (useItemRgb) { lf->useItemRgb = TRUE; lf->filterColor=bed->itemRgb; } slAddHead(&lfList, lf); } - hFreeConn(&conn); } } slReverse(&lfList); slSort(&lfList, linkedFeaturesCmp); tg->items = lfList; } static void filterBed(struct track *tg, struct linkedFeatures **pLfList) /* Apply filters if any to mRNA linked features. */ { struct linkedFeatures *lf, *next, *newList = NULL, *oldList = NULL; struct mrnaUiData *mud = tg->extraUiData; struct mrnaFilter *fil; char *type; boolean anyFilter = FALSE; @@ -636,55 +597,42 @@ adjustBedScoreGrayLevel(tdb, bed, scoreMin, scoreMax); lf = lfFromBedExtra(bed, scoreMin, scoreMax); if (useItemRgb) { lf->useItemRgb = TRUE; lf->filterColor=bed->itemRgb; } slAddHead(&lfList, lf); bedFree(&bed); } sqlFreeResult(&sr); hFreeConn(&conn); } else { - char *table; - if (isCustomTrack(tg->table)) - { - liftDb = CUSTOM_TRASH; - table = trackDbSetting(tg->tdb, "dbTableName"); - } - else - table = tg->table; - struct hash *chainHash = newHash(8); - struct sqlConnection *conn = hAllocConn(liftDb); - char *quickLiftFile = cloneString(trackDbSetting(tg->tdb, "quickLiftUrl")); - bed = (struct bed *)quickLiftSql(conn, quickLiftFile, table, chromName, winStart, winEnd, NULL, scoreFilterClause, (ItemLoader2)bedLoad12, 0, chainHash); - - struct bed *liftedBeds = quickLiftBeds(bed, chainHash, TRUE); + struct bed *liftedBeds = quickLiftSqlLoadBeds(tg->tdb, tg->table, liftDb, chromName, + winStart, winEnd, scoreFilterClause, (ItemLoader2)bedLoad12, 0, TRUE); for(bed = liftedBeds; bed; bed = bed->next) { lf = lfFromBedExtra(bed, scoreMin, scoreMax); if (useItemRgb) { lf->useItemRgb = TRUE; lf->filterColor=bed->itemRgb; } slAddHead(&lfList, lf); } - hFreeConn(&conn); } } slReverse(&lfList); if(tg->extraUiData) filterBed(tg, &lfList); slSort(&lfList, linkedFeaturesCmp); tg->items = lfList; filterItemsOnNames(tg); maybeLoadSnake(tg); // if we're in snake mode, change the methods } Color colorFromCart(struct track *tg, Color color) /* Return the RGB color from the cart setting 'colorOverride' or just return color */ {