8fd79be98e212f1723a7ac497e8c35b9b087d7df tdreszer Mon Feb 28 16:07:29 2011 -0800 Cleaned up a little code to make track search not dependent upon var=tableName being set. diff --git src/hg/lib/mdb.c src/hg/lib/mdb.c index ffdaca0..ed54543 100644 --- src/hg/lib/mdb.c +++ src/hg/lib/mdb.c @@ -2152,31 +2152,31 @@ return mdbObjsMatch; } *pMdbObjs = mdbObjsMatch; return mdbObjsNoMatch; } struct mdbObj *mdbObjsFilterTablesOrFiles(struct mdbObj **pMdbObjs,boolean tables, boolean files) // Filters mdb objects to only those that have associated tables or files. Returns removed non-table/file objects // Note: Since table/file objects overlap, there are 3 possibilites: tables, files, table && files { assert(tables || files); // Cant exclude both struct mdbObj *mdbObjs = *pMdbObjs; struct mdbObj *mdbObjsDropped = NULL; if (tables) - mdbObjsDropped = mdbObjsFilter(&mdbObjs,"tableName",NULL,FALSE); + mdbObjsDropped = mdbObjsFilter(&mdbObjs,"objType","table",FALSE); if (files) { struct mdbObj *mdbObjsNoFileName = mdbObjsDropped = mdbObjsFilter(&mdbObjs,"fileName",NULL,FALSE); if (mdbObjsNoFileName) { struct mdbObj *mdbObjsNoFileIndex = mdbObjsFilter(&mdbObjsNoFileName,"fileIndex",NULL,FALSE); if (mdbObjsNoFileIndex) { mdbObjs = slCat(mdbObjs,mdbObjsNoFileName); mdbObjsDropped = slCat(mdbObjsDropped,mdbObjsNoFileIndex); } } } slSort(&mdbObjs, &mdbObjCmp); // Need to be returned to obj order @@ -2925,40 +2925,41 @@ // Build list of terms as "var1=val1 var2=val2a,val2b,val2c var3=%val3%" for(onePair = varValPairs; onePair != NULL; onePair = onePair->next) { enum mdbCvSearchable searchBy = mdbCvSearchMethod(onePair->name); if (searchBy == cvsSearchBySingleSelect || searchBy == cvsSearchByMultiSelect) // multiSelect val will be filled with a comma delimited list dyStringPrintf(dyTerms,"%s=%s ",onePair->name,(char *)onePair->val); else if (searchBy == cvsSearchByFreeText) // If select is by free text then like dyStringPrintf(dyTerms,"%s=%%%s%% ",onePair->name,(char *)onePair->val); else if (searchBy == cvsSearchByDateRange || searchBy == cvsSearchByIntegerRange) { // TO BE IMPLEMENTED // Requires new mdbObjSearch API and more than one (char *)onePair->val warn("mdb search by date is not yet implemented."); } } -// Be sure to include table of file in selections +// Be sure to include table or file in selections if (tables) - dyStringAppend(dyTerms,"tableName=? "); + dyStringAppend(dyTerms,"objType=table "); if (files) dyStringAppend(dyTerms,"fileName=? "); // Build the mdbByVals struct and then select all mdbObjs in one query struct mdbByVar *mdbByVars = mdbByVarsLineParse(dyStringContents(dyTerms)); dyStringClear(dyTerms); -struct mdbObj *mdbObjs = mdbObjsQueryByVars(conn,NULL,mdbByVars); // Uses master table metaDb not sandbox versions +char *tableName = mdbTableName(conn,TRUE); // Look for sandBox name first +struct mdbObj *mdbObjs = mdbObjsQueryByVars(conn,tableName,mdbByVars); return mdbObjs; } struct slName *mdbObjNameSearch(struct sqlConnection *conn, char *var, char *val, char *op, int limit, boolean tables, boolean files) // Search the metaDb table for objs by var and val. Can restrict by op "is", "like", "in" and accept (non-zero) limited string size // Search is via mysql, so it's case-insensitive. Return is sorted on obj. { // Note: This proves faster than getting mdbObjs then converting to slNames struct mdbObj *mdbObjs = mdbObjSearch(conn,var,val,op,limit); // May only be interested in tables or files: if (tables || files) { struct mdbObj *mdbObjsDropped = mdbObjsFilterTablesOrFiles(&mdbObjs,tables,files); mdbObjsFree(&mdbObjsDropped); @@ -2987,31 +2988,31 @@ dyStringPrintf(dyQuery,"select distinct val"); dyStringPrintf(dyQuery," from %s l1 where l1.var='%s' ",tableName,var); if (!tables || !files) dyStringPrintf(dyQuery,"and exists (select l2.obj from %s l2 where l2.obj = l1.obj and l2.var='objType' and l2.val='%s')", tableName,tables?"table":"file"); dyStringAppend(dyQuery," order by val"); retVal = sqlQuickList(conn, dyStringCannibalize(&dyQuery)); slNameSortCase(&retVal); return retVal; } // TODO: decide to make this public or hide it away inside the one function so far that uses it. -static struct hash *cvHash = NULL; +//static struct hash *cvHash = NULL; static char *cv_file() // return default location of cv.ra { static char filePath[PATH_LEN]; char *root = hCgiRoot(); if (root == NULL || *root == 0) root = "/usr/local/apache/cgi-bin/"; // Make this check out sandboxes? // root = "/cluster/home/tdreszer/kent/src/hg/makeDb/trackDb/cv/alpha/"; // Make this check out sandboxes? safef(filePath, sizeof(filePath), "%s/encode/cv.ra", root); if(!fileExists(filePath)) errAbort("Error: can't locate cv.ra; %s doesn't exist\n", filePath); return filePath; } struct slPair *mdbValLabelSearch(struct sqlConnection *conn, char *var, int limit, boolean tables, boolean files) @@ -3026,55 +3027,53 @@ struct dyString *dyQuery = dyStringNew(512); if (limit > 0) dyStringPrintf(dyQuery,"select distinct LEFT(val,%d)",limit); else dyStringPrintf(dyQuery,"select distinct val"); dyStringPrintf(dyQuery," from %s l1 where l1.var='%s' ",tableName,var); if (!tables || !files) dyStringPrintf(dyQuery,"and exists (select l2.obj from %s l2 where l2.obj = l1.obj and l2.var='objType' and l2.val='%s')", tableName,tables?"table":"file"); dyStringAppend(dyQuery," order by val"); // Establish cv hash -if (cvHash == NULL) - cvHash = raReadAll(cgiUsualString("ra", cv_file()), "term"); +struct hash *varHash = mdbCvTermHash(var); struct slPair *pairs = NULL, *pair; struct sqlResult *sr = sqlGetResult(conn, dyStringContents(dyQuery)); dyStringFree(&dyQuery); char **row; -struct hash *ra = NULL; while ((row = sqlNextRow(sr)) != NULL) { AllocVar(pair); char *name = cloneString(row[0]); pair = slPairNew(name,name); // defaults the label to the metaDb.val - ra = hashFindVal(cvHash,name); - if (ra == NULL && sameString(var,"lab")) // FIXME: ugly special case to be removed when metaDb is cleaned up! + struct hash *valHash = hashFindVal(varHash,name); + if (valHash == NULL && sameString(var,"lab")) // FIXME: ugly special case to be removed when metaDb is cleaned up! { char *val = cloneString(name); - ra = hashFindVal(cvHash,strUpper(val)); - if (ra == NULL) - ra = hashFindVal(cvHash,strLower(val)); + valHash = hashFindVal(varHash,strUpper(val)); + if (valHash == NULL) + valHash = hashFindVal(varHash,strLower(val)); freeMem(val); } - if (ra != NULL) + if (valHash != NULL) { - char *label = hashFindVal(ra,"label"); + char *label = hashFindVal(valHash,"label"); if (label != NULL) { freeMem(pair->name); // Allocated when pair was created pair->name = strSwapChar(cloneString(label),'_',' '); // vestigial _ meaning space if (limit > 0 && strlen(pair->name) > limit) pair->name[limit] = '\0'; } } slAddHead(&pairs, pair); } sqlFreeResult(&sr); slPairSortCase(&pairs); return pairs; }