static struct genePos *xyzAdvFilter(struct column *col, struct sqlConnection *conn, struct genePos *list) /* Do advanced filter on xyz type column. */ { char *term = advFilterVal(col, "term"); if (term != NULL) { /* Construct a hash of all genes that pass filter. */ struct hash *passHash = newHash(17); char query[1000]; char **row; struct sqlResult *sr; sqlSafef(query, sizeof(query), "select %s from %s where %s='%s'", col->keyField, col->table, col->valField, term); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) hashAdd(passHash, row[0], NULL); sqlFreeResult(&sr); /* Remove non-passing genes. */ list = weedUnlessInHash(list, passHash); hashFree(&passHash); } return list; }
static struct genePos *wildAssociationFilter( struct slName *wildList, boolean orLogic, struct column *col, struct sqlConnection *conn, struct genePos *list) /* Handle relatively slow filtering when there is a wildcard present. */ { struct assocGroup *ag = assocGroupNew(16); struct genePos *gp; struct hash *passHash = newHash(16); /* Hash of items passing filter. */ int assocCount = 0; struct sqlResult *sr; char **row; /* Build up associations. */ sr = sqlGetResult(conn, col->queryFull); while ((row = sqlNextRow(sr)) != NULL) { ++assocCount; assocGroupAdd(ag, row[0],row[1]); } sqlFreeResult(&sr); /* Look for matching associations and put them on newList. */ for (gp = list; gp != NULL; gp = gp->next) { char *key = (col->protKey ? (kgVersion == KG_III ? lookupProtein(conn, gp->name) : gp->protein) : gp->name); struct assocList *al = hashFindVal(ag->listHash, key); if (al != NULL) { if (wildList == NULL || wildMatchRefs(wildList, al->list, orLogic)) hashAdd(passHash, gp->name, gp); } } list = weedUnlessInHash(list, passHash); hashFree(&passHash); assocGroupFree(&ag); return list; }
static struct genePos *pfamAdvFilter(struct column *col, struct sqlConnection *defaultConn, struct genePos *list) /* Do advanced filter on for pfam. */ { char *terms = advFilterVal(col, "terms"); if (terms != NULL) { struct sqlConnection *conn = sqlConnect(col->protDb); char query[256]; struct sqlResult *sr; struct dyString *dy = newDyString(1024); char **row; boolean orLogic = advFilterOrLogic(col, "logic", TRUE); struct slName *term, *termList = stringToSlNames(terms); struct hash *passHash = newHash(17); struct hash *prevHash = NULL; struct genePos *gp; /* Build up hash of all genes. */ struct hash *geneHash = newHash(18); for (gp = list; gp != NULL; gp = gp->next) hashAdd(geneHash, gp->name, gp); for (term = termList; term != NULL; term = term->next) { /* Build up a list of IDs of descriptions that match term. */ struct slName *idList = NULL, *id; if (isPfamId(term->name)) { idList = slNameNew(term->name); } else { char *sqlWild = sqlLikeFromWild(term->name); sqlSafef(query, sizeof(query), "select pfamAC from pfamDesc where description like '%s'", sqlWild); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { id = slNameNew(row[0]); slAddHead(&idList, id); } sqlFreeResult(&sr); } if (idList != NULL) { /* Build up query that includes all IDs. */ dyStringClear(dy); sqlDyStringPrintf(dy, "select name from %s where ", col->table); sqlDyStringPrintf(dy, "value='%s'", idList->name); for (id = idList->next; id != NULL; id = id->next) sqlDyStringPrintf(dy, "or value='%s'", id->name); /* Execute query and put matchers into hash. */ sr = sqlGetResult(defaultConn, dy->string); while ((row = sqlNextRow(sr)) != NULL) { gp = hashFindVal(geneHash, row[0]); if (gp != NULL) { char *name = gp->name; if (prevHash == NULL || hashLookup(prevHash, name) != NULL) hashStore(passHash, name); } } sqlFreeResult(&sr); slFreeList(&idList); } if (!orLogic) { hashFree(&prevHash); if (term->next != NULL) { prevHash = passHash; passHash = newHash(17); } } } list = weedUnlessInHash(list, passHash); hashFree(&prevHash); hashFree(&passHash); dyStringFree(&dy); sqlDisconnect(&conn); } return list; }
static struct genePos *tameAssociationFilter( struct slName *termList, boolean orLogic, struct column *col, struct sqlConnection *conn, struct genePos *list) /* Handle filtering when there are no wildcards present. */ { struct sqlResult *sr; char **row; struct slName *term; struct hash *passHash = newHash(17); struct hash *protHash = NULL; struct hash *prevHash = NULL; struct genePos *gp; int protCount = 0, termCount = 0, matchRow = 0, keyRow = 0; /* Make up protein-keyed hash if need be. */ if (col->protKey) { protHash = newHash(17); for (gp = list; gp != NULL; gp = gp->next) { hashAdd(protHash, gp->protein, gp->name); ++protCount; } } for (term = termList; term != NULL; term = term->next) { char query[1024]; safef(query, sizeof(query), col->invQueryOne, term->name); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { char *key = row[0]; ++matchRow; if (protHash != NULL) key = hashFindVal(protHash, key); if (key != NULL) { ++keyRow; if (prevHash == NULL || hashLookup(prevHash, key) != NULL) { hashStore(passHash, key); } } } if (!orLogic) { hashFree(&prevHash); if (term->next != NULL) { prevHash = passHash; passHash = newHash(17); } } sqlFreeResult(&sr); ++termCount; } list = weedUnlessInHash(list, passHash); hashFree(&prevHash); freeHash(&protHash); freeHash(&passHash); return list; }