void userSettingsLoadForm(struct userSettings *us) /* Put up controls that let user name and save the current * set. */ { struct hashEl *list = cartFindPrefix(us->cart, us->savePrefix); /* Start form/save session/print title. */ hPrintf("<FORM ACTION=\"../cgi-bin/hgNear\" NAME=\"usForm\" METHOD=GET>\n"); cartSaveSession(us->cart); hPrintf("<H2>Load %s</H2>\n", us->formTitle); hPrintf("<TABLE><TR><TD>\n"); hPrintf("<SELECT NAME=\"%s\" SIZE=%d>", us->nameVar, slCount(list)); printLabelList(us, list); hPrintf("</SELECT>"); hPrintf("</TD><TD>"); cgiMakeButton(us->formVar, "load"); hPrintf(" "); cgiMakeButton(us->formVar, "cancel"); hPrintf("</TD></TR></TABLE>"); /* Cleanup. */ hPrintf("</FORM>\n"); slFreeList(&list); }
static unsigned getLabelTypes(struct track *tg) /* get set of labels to use */ { unsigned labelSet = 0; // label setting are on parent track char prefix[128]; safef(prefix, sizeof(prefix), "%s.label", tg->tdb->track); struct hashEl *labels = cartFindPrefix(cart, prefix); if (labels == NULL) { // default to common name+accession and save this in cart so it makes sense in trackUi labelSet = useAcc; char setting[64]; safef(setting, sizeof(setting), "%s.label.gene", tg->tdb->track); cartSetBoolean(cart, setting, TRUE); } struct hashEl *label; for (label = labels; label != NULL; label = label->next) { if (endsWith(label->name, ".orgCommon") && differentString(label->val, "0")) labelSet |= useOrgCommon; else if (endsWith(label->name, ".orgAbbrv") && differentString(label->val, "0")) labelSet |= useOrgAbbrv; else if (endsWith(label->name, ".db") && differentString(label->val, "0")) labelSet |= useOrgDb; else if (endsWith(label->name, ".gene") && differentString(label->val, "0")) labelSet |= useGene; else if (endsWith(label->name, ".acc") && differentString(label->val, "0")) labelSet |= useAcc; } return labelSet; }
void doPrintSelectedFields() /* Actually produce selected field output as text stream. */ { char *db = cartString(cart, hgtaDatabase); char *table = cartString(cart, hgtaTable); char *varPrefix = checkVarPrefix(); int varPrefixSize = strlen(varPrefix); struct hashEl *varList = NULL, *var; struct slName *fieldList = NULL, *field; textOpen(); /* Gather together field list for primary and linked tables from cart. */ varList = cartFindPrefix(cart, varPrefix); for (var = varList; var != NULL; var = var->next) { if (!sameString(var->val, "0")) { field = slNameNew(var->name + varPrefixSize); if (primaryOrLinked(field->name)) slAddHead(&fieldList, field); } } if (fieldList == NULL) errAbort("Please go back and select at least one field"); slReverse(&fieldList); /* Do output. */ tabOutSelectedFields(db, table, NULL, fieldList); /* Clean up. */ slFreeList(&fieldList); hashElFreeList(&varList); }
boolean userSettingsAnySaved(struct userSettings *us) /* Return TRUE if any user settings are saved. */ { struct hashEl *list = cartFindPrefix(us->cart, us->savePrefix); boolean any = (list != NULL); slFreeList(&list); return any; }
static void setCheckVarsForTable(char *dbTable, char *val) /* Return list of check variables for this table. */ { char prefix[128]; struct hashEl *varList, *var; safef(prefix, sizeof(prefix), "%s%s.", checkVarPrefix(), dbTable); varList = cartFindPrefix(cart, prefix); for (var = varList; var != NULL; var = var->next) cartSetString(cart, var->name, val); hashElFreeList(&varList); }
void userSettingsCapturePrefix(struct userSettings *us, char *prefix) /* Capture all variables that start with prefix. */ { struct hashEl *el, *list = cartFindPrefix(us->cart, prefix); for (el = list; el != NULL; el = el->next) { struct slName *n = slNameNew(el->name); slAddHead(&us->saveList, n); } slFreeList(&list); }
void userSettingsDropDown(struct userSettings *us) /* Display list of available saved settings . */ { struct hashEl *list = cartFindPrefix(us->cart, us->savePrefix); if (list != NULL) { hPrintf("<SELECT NAME=\"%s\">\n", us->nameVar); slSort(&list, hashElCmp); printLabelList(us, list); slFreeList(&list); hPrintf("</SELECT>"); } }
static struct dbTable *extraTableList(char *prefix) /* Get list of tables (other than the primary table) * where we are displaying fields. */ { struct hashEl *varList = NULL, *var; int prefixSize = strlen(prefix); struct dbTable *dtList = NULL, *dt; /* Build up list of tables to show by looking at * variables with right prefix in cart. */ varList = cartFindPrefix(cart, prefix); for (var = varList; var != NULL; var = var->next) { if (cartBoolean(cart, var->name)) { /* From variable name parse out database and table. */ char *dbTab = cloneString(var->name + prefixSize); char *db = dbTab; char *table = strchr(db, '.'); if (table == NULL) internalErr(); *table++ = 0; dt = dbTableNew(db, table); slAddHead(&dtList, dt); freez(&dbTab); } } if (varList == NULL && curTrack != NULL) { char *defaultLinkedTables = trackDbSetting(curTrack, "defaultLinkedTables"); if (defaultLinkedTables != NULL) { struct slName *t, *tables = slNameListFromString(defaultLinkedTables, ','); for (t = tables; t != NULL; t = t->next) { char varName[1024]; safef(varName, sizeof(varName), "%s%s.%s", prefix, database, t->name); cartSetBoolean(cart, varName, TRUE); dt = dbTableNew(database, t->name); slAddHead(&dtList, dt); } } } slSort(&dtList, dbTableCmp); return dtList; }
void userSettingsSaveForm(struct userSettings *us) /* Put up controls that let user name and save the current * set. */ { char buf[1024]; struct hashEl *list = cartFindPrefix(us->cart, us->savePrefix); safef(buf, sizeof(buf), "Save %s", us->formTitle); makeTitle(buf, NULL); /* Start form/save session/print title. */ hPrintf("<FORM ACTION=\"../cgi-bin/hgNear\" NAME=\"usForm\" METHOD=GET>\n"); cartSaveSession(us->cart); /* Put up controls that are always there. */ hPrintf("Please name this setup:\n"); cartMakeTextVar(us->cart, us->nameVar, "", 16); hPrintf(" "); cgiMakeButton(us->formVar, "save"); hPrintf(" "); cgiMakeButton(us->formVar, "cancel"); /* Put up additional controls if have saved settings already. */ if (list != NULL) { struct dyString *js = newDyString(0); htmlHorizontalLine(); slSort(&list, hashElCmp); hPrintf("Existing Setups:"); dyStringPrintf(js, "document.usForm.%s.value=", us->nameVar); dyStringPrintf(js, "document.usForm.%s.options", us->listDisplayVar); dyStringPrintf(js, "[document.usForm.%s.selectedIndex].value;", us->listDisplayVar); hPrintf("<SELECT NAME=\"%s\" SIZE=%d onchange=\"%s\">", us->listDisplayVar, slCount(list), js->string); printLabelList(us, list); hPrintf("</SELECT>\n"); cgiMakeButton(us->formVar, "delete existing setup"); } /* Cleanup. */ hPrintf("</FORM>\n"); slFreeList(&list); }
boolean checkWigDataFilter(char *db, char *table, char **constraint, double *ll, double *ul) /* check if filter exists, return its values, call with db="ct" for * custom tracks */ { char varPrefix[128]; struct hashEl *varList, *var; char *pat = NULL; char *cmp = NULL; if (constraint != NULL) *constraint = NULL; // Make sure return variable gets set to something at least. if (isCustomTrack(table)) db = "ct"; safef(varPrefix, sizeof(varPrefix), "%s%s.%s.", hgtaFilterVarPrefix, db, table); varList = cartFindPrefix(cart, varPrefix); if (varList == NULL) return FALSE; /* check varList, look for dataValue.pat and dataValue.cmp */ for (var = varList; var != NULL; var = var->next) { if (endsWith(var->name, ".pat")) { char *name; name = cloneString(var->name); tolowers(name); /* make sure we are actually looking at datavalue */ if (stringIn("datavalue", name) || stringIn("score", name)) { pat = cloneString(var->val); } freeMem(name); } if (endsWith(var->name, ".cmp")) { char *name; name = cloneString(var->name); tolowers(name); /* make sure we are actually looking at datavalue */ if (stringIn("datavalue", name) || stringIn("score", name)) { cmp = cloneString(var->val); tolowers(cmp); if (stringIn("ignored", cmp)) freez(&cmp); } freeMem(name); } } /* Must get them both for this to work */ if (cmp && pat) { int wordCount = 0; char *words[2]; char *dupe = cloneString(pat); wordCount = chopString(dupe, ", \t\n", words, ArraySize(words)); switch (wordCount) { case 2: if (ul) *ul = sqlDouble(words[1]); case 1: if (ll) *ll = sqlDouble(words[0]); break; default: warn("dataValue filter must be one or two numbers (two for 'in range'). " "Please click the filter edit button and either set the comparison to 'ignored' " "or set the dataValue threshold."); } if (sameWord(cmp,"in range") && (wordCount != 2)) errAbort("'in range' dataValue filter must have two numbers input\n"); if (constraint) *constraint = cmp; return TRUE; } else return FALSE; } /* static boolean checkWigDataFilter() */
char *filterClause(char *db, char *table, char *chrom, char *extraClause) /* Get filter clause (something to put after 'where') * for table */ { struct sqlConnection *conn = NULL; char varPrefix[128]; int varPrefixSize, fieldNameSize; struct hashEl *varList, *var; struct dyString *dy = NULL; boolean needAnd = FALSE; char oldDb[128]; char dbTableBuf[256]; char explicitDb[128]; char splitTable[256]; char explicitDbTable[512]; /* Return just extraClause (which may be NULL) if no filter on us. */ if (! (anyFilter() && filteredOrLinked(db, table))) return cloneString(extraClause); safef(oldDb, sizeof(oldDb), "%s", db); dbOverrideFromTable(dbTableBuf, &db, &table); if (!sameString(oldDb, db)) safef(explicitDb, sizeof(explicitDb), "%s.", db); else explicitDb[0] = 0; /* Cope with split table and/or custom tracks. */ if (isCustomTrack(table)) { conn = hAllocConn(CUSTOM_TRASH); struct customTrack *ct = ctLookupName(table); safef(explicitDbTable, sizeof(explicitDbTable), "%s", ct->dbTableName); } else { conn = hAllocConn(db); safef(splitTable, sizeof(splitTable), "%s_%s", chrom, table); if (!sqlTableExists(conn, splitTable)) safef(splitTable, sizeof(splitTable), "%s", table); safef(explicitDbTable, sizeof(explicitDbTable), "%s%s", explicitDb, splitTable); } /* Get list of filter variables for this table. */ safef(varPrefix, sizeof(varPrefix), "%s%s.%s.", hgtaFilterVarPrefix, db, table); varPrefixSize = strlen(varPrefix); varList = cartFindPrefix(cart, varPrefix); if (varList == NULL) { hFreeConn(&conn); return cloneString(extraClause); } /* Create filter clause string, stepping through vars. */ dy = dyStringNew(0); for (var = varList; var != NULL; var = var->next) { /* Parse variable name into field and type. */ char field[64], *s, *type; s = var->name + varPrefixSize; type = strchr(s, '.'); if (type == NULL) internalErr(); fieldNameSize = type - s; if (fieldNameSize >= sizeof(field)) internalErr(); memcpy(field, s, fieldNameSize); field[fieldNameSize] = 0; sqlCkId(field); type += 1; /* rawLogic and rawQuery are handled below; * filterMaxOutputVar is not really a filter variable and is handled * in wiggle.c. */ if (startsWith("raw", type) || sameString(filterMaxOutputVar, type)) continue; /* Any other variables that are missing a name: * <varPrefix>..<type> * are illegal */ if (fieldNameSize < 1) { warn("Missing name in cart variable: %s\n", var->name); continue; } if (sameString(type, filterDdVar)) { char *patVar = filterPatternVarName(db, table, field); struct slName *patList = cartOptionalSlNameList(cart, patVar); normalizePatList(&patList); if (slCount(patList) > 0) { char *ddVal = cartString(cart, var->name); boolean neg = sameString(ddVal, ddOpMenu[1]); char *fieldType = getSqlType(conn, explicitDbTable, field); boolean needOr = FALSE; if (needAnd) dyStringAppend(dy, " and "); needAnd = TRUE; if (neg) dyStringAppend(dy, "not "); boolean composite = (slCount(patList) > 1); if (composite || neg) dyStringAppendC(dy, '('); struct slName *pat; for (pat = patList; pat != NULL; pat = pat->next) { char *sqlPat = sqlLikeFromWild(pat->name); if (needOr) dyStringAppend(dy, " OR "); needOr = TRUE; if (isSqlSetType(fieldType)) { sqlDyStringPrintfFrag(dy, "FIND_IN_SET('%s', %s.%s)>0 ", sqlPat, explicitDbTable , field); } else { sqlDyStringPrintfFrag(dy, "%s.%s ", explicitDbTable, field); if (sqlWildcardIn(sqlPat)) dyStringAppend(dy, "like "); else dyStringAppend(dy, "= "); sqlDyStringPrintf(dy, "'%s'", sqlPat); } freez(&sqlPat); } if (composite || neg) dyStringAppendC(dy, ')'); } } else if (sameString(type, filterCmpVar)) { char *patVar = filterPatternVarName(db, table, field); char *pat = trimSpaces(cartOptionalString(cart, patVar)); char *cmpVal = cartString(cart, var->name); if (cmpReal(pat, cmpVal)) { if (needAnd) dyStringAppend(dy, " and "); needAnd = TRUE; if (sameString(cmpVal, "in range")) { char *words[2]; int wordCount; char *dupe = cloneString(pat); wordCount = chopString(dupe, ", \t\n", words, ArraySize(words)); if (wordCount < 2) /* Fake short input */ words[1] = "2000000000"; if (strchr(pat, '.')) /* Assume floating point */ { double a = atof(words[0]), b = atof(words[1]); sqlDyStringPrintfFrag(dy, "%s.%s >= %f && %s.%s <= %f", explicitDbTable, field, a, explicitDbTable, field, b); } else { int a = atoi(words[0]), b = atoi(words[1]); sqlDyStringPrintfFrag(dy, "%s.%s >= %d && %s.%s <= %d", explicitDbTable, field, a, explicitDbTable, field, b); } freez(&dupe); } else { // cmpVal has been checked already above in cmpReal for legal values. sqlDyStringPrintfFrag(dy, "%s.%s %-s ", explicitDbTable, field, cmpVal); if (strchr(pat, '.')) /* Assume floating point. */ dyStringPrintf(dy, "%f", atof(pat)); else dyStringPrintf(dy, "%d", atoi(pat)); } } } } /* Handle rawQuery if any */ { char *varName; char *logic, *query; varName = filterFieldVarName(db, table, "", filterRawLogicVar); logic = cartUsualString(cart, varName, logOpMenu[0]); varName = filterFieldVarName(db, table, "", filterRawQueryVar); query = trimSpaces(cartOptionalString(cart, varName)); if (query != NULL && query[0] != 0) { if (needAnd) dyStringPrintf(dy, " %s ", logic); sqlSanityCheckWhere(query, dy); } } /* Clean up and return */ hFreeConn(&conn); hashElFreeList(&varList); if (dy->stringSize == 0) { dyStringFree(&dy); return cloneString(extraClause); } else { if (isNotEmpty(extraClause)) dyStringPrintf(dy, " and %s", extraClause); return dyStringCannibalize(&dy); } }
struct joinerDtf *filteringTables() /* Get list of tables we're filtering on as joinerDtf list (with * the field entry NULL). */ { if (!anyFilter()) return NULL; else { struct joinerDtf *dtfList = NULL, *dtf; struct hashEl *varList, *var; struct hash *uniqHash = hashNew(0); int prefixSize = strlen(hgtaFilterVarPrefix); varList = cartFindPrefix(cart, hgtaFilterVarPrefix); for (var = varList; var != NULL; var = var->next) { char *dupe = cloneString(var->name + prefixSize); char *parts[5]; int partCount; char dbTable[256]; char *db, *table, *field, *type; partCount = chopByChar(dupe, '.', parts, ArraySize(parts)); if (partCount != 4) { warn("Part count != expected 4 line %d of %s", __LINE__, __FILE__); continue; } db = parts[0]; table = parts[1]; field = parts[2]; type = parts[3]; safef(dbTable, sizeof(dbTable), "%s.%s", db, table); if (! filteredOrLinked(db, table)) continue; if (!hashLookup(uniqHash, dbTable)) { boolean gotFilter = FALSE; if (sameString(type, filterPatternVar)) { char *pat = trimSpaces(var->val); gotFilter = wildReal(pat); } else if (sameString(type, filterCmpVar)) { char *patVar = filterPatternVarName(db, table, field); char *pat = trimSpaces(cartOptionalString(cart, patVar)); gotFilter = cmpReal(pat, var->val); } else if (sameString(type, filterRawQueryVar)) { char *pat = trimSpaces(var->val); gotFilter = (pat != NULL && pat[0] != 0); } if (gotFilter) { hashAdd(uniqHash, dbTable, NULL); AllocVar(dtf); dtf->database = cloneString(db); dtf->table = cloneString(table); slAddHead(&dtfList, dtf); } } freeMem(dupe); } hashFree(&uniqHash); return dtfList; } }