c1c83e7ac7fd8d4d7cb7fc0ef18850b7265ec669
larrym
  Thu Mar 15 20:13:10 2012 -0700
support yearFilter in t2gLoadItems
diff --git src/hg/hgTracks/simpleTracks.c src/hg/hgTracks/simpleTracks.c
index 1e93f34..5264393 100644
--- src/hg/hgTracks/simpleTracks.c
+++ src/hg/hgTracks/simpleTracks.c
@@ -12168,47 +12168,74 @@
  * or the default value: <trackName>Article */
 {
 char *articleTable = trackDbSetting(tg->tdb, "t2gArticleTable");
 if (articleTable == NULL)
     {
     char buf[256];
     safef(buf, sizeof(buf), "%sArticle", tg->track);
     articleTable = cloneString(buf);
     }
 return articleTable;
 }
 
 static void t2gLoadItems(struct track *tg)
 /* apply filter to t2g items */
 {
-loadGappedBed(tg);
-struct linkedFeatures *lf, *next, *newList = NULL;
 struct sqlConnection *conn = hAllocConn(database);
-
-char *articleTable = t2gArticleTable(tg);
 char *keyWords = cartOptionalString(cart, "t2gKeywords");
+char *yearFilter = cartOptionalString(cart, "t2gYear");
+char *articleTable = t2gArticleTable(tg);
+
+if(isEmpty(yearFilter))
+    loadGappedBed(tg);
+else
+    {
+    // code based on loadGappedBed
+    char extra[256];
+    char **row;
+    int rowOffset;
+    struct linkedFeatures *lfList = NULL;
+    struct trackDb *tdb = tg->tdb;
+    int scoreMin = atoi(trackDbSettingClosestToHomeOrDefault(tdb, "scoreMin", "0"));
+    int scoreMax = atoi(trackDbSettingClosestToHomeOrDefault(tdb, "scoreMax", "1000"));
+    boolean useItemRgb = bedItemRgb(tdb);
+    safef(extra, sizeof(extra), "name in (select displayId from %s where %s.year >= '%s')", articleTable, articleTable, sqlEscapeString(yearFilter));
+    struct sqlResult *sr = hExtendedRangeQuery(conn, tg->table, chromName, winStart, winEnd, extra,
+                                               FALSE, NULL, &rowOffset);
+    while ((row = sqlNextRow(sr)) != NULL)
+	{
+        struct bed *bed = bedLoad12(row+rowOffset);
+        slAddHead(&lfList, bedMungToLinkedFeatures(&bed, tdb, 12, scoreMin, scoreMax, useItemRgb));
+        }
+    sqlFreeResult(&sr);
+    slReverse(&lfList);
+    slSort(&lfList, linkedFeaturesCmp);
+    tg->items = lfList;
+    }
 
 if(isNotEmpty(keyWords))
     {
+    struct linkedFeatures *lf, *next, *newList = NULL;
     for( lf = tg->items; lf != NULL; lf = next)
         {
         char query[512];
         struct sqlResult *sr;
         char **row;
         next = lf->next;
         lf->next = NULL;
 
+        // we should consider doing this more efficiently using a FULLTEXT based search in above item loading code.
         safef(query, sizeof(query), "select authors, title, citation, abstract from %s where displayId = '%s'", articleTable, lf->name);
         sr = sqlGetResult(conn, query);
         if ((row = sqlNextRow(sr)) != NULL)
             {
             struct hash *hash = newHash(0);
             boolean pass = TRUE;
             struct kxTok *kx;
 
             tokenizeAndAddToHash(hash, row[0]);
             tokenizeAndAddToHash(hash, row[1]);
             tokenizeAndAddToHash(hash, row[2]);
             tokenizeAndAddToHash(hash, row[3]);
 
             // we pass articles where keywords is a subset of words in article metadata.
             kx = kxTokenize(keyWords, FALSE);