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);