b2b58edce8b1d75567737b05e21ba9103073c69d chmalee Mon May 4 12:11:37 2026 -0700 Fix myVariants tracks to load via a hardcoded query rather than hRangeQuery because the tableName is already qualified with the database. Remove dead code after refactor. Fix table browser output for myVariants tracks for various options, refs #33808 diff --git src/hg/hgTracks/myVariantsTrack.c src/hg/hgTracks/myVariantsTrack.c index f668f784a1e..bc73e082bba 100644 --- src/hg/hgTracks/myVariantsTrack.c +++ src/hg/hgTracks/myVariantsTrack.c @@ -397,33 +397,38 @@ cartSetString(cart, ctVar, ctFile); freeMem(ctFile); } } } } } static struct linkedFeatures *loadMyVariantsItems(struct sqlConnection *conn, char *tableName, struct trackDb *tdb, char *whereExtra) /* Query tableName for myVariants items in the current window matching the * whereExtra clause (e.g. "db='hg38' and project='test'") and return them * as a linkedFeatures list. */ { struct linkedFeatures *lf, *lfList = NULL; -int rowOffset; -struct sqlResult *sr = hRangeQuery(conn, tableName, chromName, winStart, winEnd, - whereExtra, &rowOffset); +struct dyString *query = sqlDyStringCreate("select * from %s where ", tableName); +hAddBinToQueryGeneral("bin", winStart, winEnd, query); +sqlDyStringPrintf(query, " chrom='%s' and chromStart < %d and chromEnd > %d", + chromName, winEnd, winStart); +if (isNotEmpty(whereExtra)) + sqlDyStringPrintf(query, " and (%-s)", whereExtra); +struct sqlResult *sr = sqlGetResult(conn, query->string); +dyStringFree(&query); char **row; struct dyString *mouseover = dyStringNew(0); while ((row = sqlNextRow(sr)) != NULL) { struct myVariants *item = myVariantsLoad(row); struct bed *bed; AllocVar(bed); char buf[64]; safef(buf, sizeof(buf), "%u %s", item->id, item->name); bed->chrom = item->chrom; bed->chromStart = item->chromStart; bed->chromEnd = item->chromEnd; bed->name = cloneString(buf); bed->score = item->score; bed->strand[0] = item->strand[0]; @@ -553,55 +558,30 @@ myVariantsExtraHeight(track); return track->height; } void myVariantsMethods(struct track *track) /* Set up special methods for myVariants type tracks. */ { linkedFeaturesMethods(track); track->totalHeight = myVariantsTotalHeight; track->drawLeftLabels = myVariantsDrawLeftLabels; track->loadItems = myVariantsLoadItems; track->itemName = myVariantsName; track->nextItemButtonable = TRUE; } -struct trackDb *myVariantsFakeTdb() -/* Construct a trackDb record for myVariants track. */ -{ -char *userName = getUserName(); -struct trackDb *tdb = customTrackTdbDefault(); -char *tableName = myVariantsCreateTable(userName); -if (!tableName) - errAbort("Error creating myVariants table for user '%s'", userName); -tdb->track = "myVariants"; -tdb->table = cloneString(tableName); -tdb->type = "myVariants"; -trackDbAddSetting(tdb, "mouseOverField", "description"); -return tdb; -} - -struct track *myVariantsTg() -/* Make track that will ultimately have the data from: - * CUSTOM_TRASH.myVariants_userName table */ -{ -struct trackDb *tdb = myVariantsFakeTdb(); -struct track *tg = trackFromTrackDb(tdb); -myVariantsMethods(tg); -return tg; -} - static void apiSuccess(struct jsonWrite *jw) /* Send 200 JSON response and exit. */ { printf("Content-Type: application/json\n\n"); puts(jw->dy->string); jsonWriteFree(&jw); exit(0); } static void apiError(int httpStatus, char *message) /* Send error JSON response with given HTTP status and exit. */ { printf("Status: %d\n", httpStatus); printf("Content-Type: application/json\n\n"); struct jsonWrite *jw = jsonWriteNew();