83f07ccc670df11816b9c0acffb3bb35b8a89e04
angie
  Fri Sep 18 16:22:38 2015 -0700
Use annoStreamDb with config to add kgXref.geneSymbol to knownGene columns instead of annoStreamDbKnownGene.

diff --git src/hg/hgVai/hgVai.c src/hg/hgVai/hgVai.c
index f21c85f..38d9b64 100644
--- src/hg/hgVai/hgVai.c
+++ src/hg/hgVai/hgVai.c
@@ -2140,30 +2140,55 @@
  * (main page will be displayed) */
 {
 struct trackDb *varTdb = tdbForTrack(database, variantTrack, &fullTrackList);
 if (varTdb == NULL)
     {
     if (isHubTrack(variantTrack))
 	warn("Can't find hub track '%s'", variantTrack);
     else
 	warn("Can't find tdb for variant track '%s'", variantTrack);
     }
 else
     checkVariantTrack(varTdb);
 return varTdb;
 }
 
+static struct jsonElement *configForStreamer(char *db, struct trackDb *tdb)
+/* Add VAI-specific config options, if applicable. */
+{
+struct jsonElement *config = NULL;
+char *track = tdb->track;
+// If track is sql-based knownGene and we have kgXref, then add kgXref.geneSymbol after
+// the columns of knownGene.
+if (sameString(track, "knownGene") && !isCustomTrack(track) && !isHubTrack(track) &&
+    !trackDbSetting(tdb, "bigDataUrl"))
+    {
+    struct sqlConnection *conn = hAllocConn(db);
+    if (sqlTableExists(conn, "kgXref"))
+        {
+        char jsonStr[PATH_LEN];
+        safef(jsonStr, sizeof(jsonStr),
+              "{ \"relatedTables\":"
+              "    [ { \"table\": \"%s.kgXref\", \"fields\": [\"geneSymbol\"] } ] }",
+              db);
+        config = jsonParse(jsonStr);
+        }
+    hFreeConn(&conn);
+    }
+return config;
+}
+
 static void adjustGpVarOverlapRule(struct annoGrator *gpVarGrator, boolean haveRegulatory)
 /* If we're able to detect regulatory elements, and want to keep those annotations, loosen up
  * gpVarGrator's overlap rule from the default (must overlap). */
 {
 if (haveRegulatory && cartUsualBoolean(cart, "hgva_include_regulatory", TRUE))
     gpVarGrator->setOverlapRule(gpVarGrator, agoNoConstraint);
 }
 
 void doQuery()
 /* Translate simple form inputs into anno* components and execute query. */
 {
 dyInfo = dyStringNew(0);
 char *chrom = NULL;
 uint start = 0, end = 0;
 if (sameString(regionType, hgvaRegionTypeRange))
@@ -2201,33 +2226,34 @@
     primaryLongLabel = hgvaVariantIdsLabel;
     }
 else
     {
     struct trackDb *varTdb = getVariantTrackDb(variantTrack);
     if (varTdb == NULL)
 	{
 	doUi();
 	return;
 	}
     primary = hAnnoStreamerFromTrackDb(assembly, varTdb->table, varTdb, chrom, maxVarRows, NULL);
     primaryLongLabel = varTdb->longLabel;
     }
 
 enum annoGratorOverlap geneOverlapRule = agoMustOverlap;
+struct jsonElement *gpConfig = configForStreamer(database, geneTdb);
 struct annoGrator *gpVarGrator = hAnnoGratorFromTrackDb(assembly, geneTdb->table, geneTdb, chrom,
                                                         ANNO_NO_LIMIT, primary->asObj,
-                                                        geneOverlapRule, NULL);
+                                                        geneOverlapRule, gpConfig);
 setGpVarFuncFilter(gpVarGrator);
 
 // Some grators may be used as both filters and output values. To avoid making
 // multiple grators for the same source, hash them by trackName:
 struct hash *gratorsByName = hashNew(8);
 
 struct annoGrator *snpGrator = NULL;
 char *snpDesc = NULL;
 if (cartUsualBoolean(cart, "hgva_rsId", FALSE))
     snpGrator = gratorForSnpBed4(gratorsByName, "", assembly, chrom, agoNoConstraint, &snpDesc);
 
 // Now construct gratorList in the order in which annoFormatVep wants to see them,
 // i.e. first the gpVar, then the snpNNN, then whatever else:
 struct annoGrator *gratorList = NULL;
 slAddHead(&gratorList, gpVarGrator);