27aa980683134b5ff14cbaf5bdcbe563eb4af207 tdreszer Wed Apr 6 08:19:34 2011 -0700 Moved common name and description matching code into search lib and removed it from hgFileSearch and hgTracks/searchTracks.c diff --git src/hg/hgFileSearch/hgFileSearch.c src/hg/hgFileSearch/hgFileSearch.c index 1f6ef5e..121e48a 100644 --- src/hg/hgFileSearch/hgFileSearch.c +++ src/hg/hgFileSearch/hgFileSearch.c @@ -24,107 +24,56 @@ #define FILE_SEARCH "hgfs_Search" #define FILE_SEARCH_FORM "fileSearch" #define FILE_SEARCH_CURRENT_TAB "fsCurTab" #define FILE_SEARCH_ON_FILETYPE "fsFileType" // These are common with trackSearch. Should they be? #define TRACK_SEARCH_SIMPLE "tsSimple" #define TRACK_SEARCH_ON_NAME "tsName" #define TRACK_SEARCH_ON_GROUP "tsGroup" #define TRACK_SEARCH_ON_DESCR "tsDescr" #define TRACK_SEARCH_SORT "tsSort" //#define USE_TABS -static boolean matchToken(char *string, char *token) -{ -// do this with regex ? Would require all sorts of careful parsing for ()., etc. -if (string == NULL) - return (token == NULL); -if (token == NULL) - return TRUE; - -if (!strchr(token,'*') && !strchr(token,'?')) - return (strcasestr(string,token) != NULL); - -char wordWild[1024]; -safef(wordWild,sizeof wordWild,"*%s*",token); -return wildMatch(wordWild, string); - -} - -static boolean doesNameMatch(struct trackDb *tdb, struct slName *wordList) -// We parse str and look for every word at the start of any word in track description (i.e. google style). -{ -if (tdb->shortLabel == NULL || tdb->longLabel == NULL) - return (wordList != NULL); - -struct slName *word = wordList; -for(; word != NULL; word = word->next) - { - if (!matchToken(tdb->shortLabel,word->name) - && !matchToken(tdb->longLabel, word->name)) - return FALSE; - } -return TRUE; -} - -static boolean doesDescriptionMatch(struct trackDb *tdb, struct slName *wordList) -// We parse str and look for every word at the start of any word in track description (i.e. google style). -{ -if (tdb->html == NULL) - return (wordList != NULL); - -if (strchr(tdb->html,'\n')) - strSwapChar(tdb->html,'\n',' '); // DANGER: don't own memory. However, this CGI will use html for no other purpose - -struct slName *word = wordList; -for(; word != NULL; word = word->next) - { - if (!matchToken(tdb->html,word->name)) - return FALSE; - } -return TRUE; -} - static struct trackDb *tdbFilterBy(struct trackDb **pTdbList, char *name, char *description, char *group) // returns tdbs that match supplied criterion, leaving unmatched in list passed in { // Set the word lists up once struct slName *nameList = NULL; if (name) nameList = slNameListOfUniqueWords(cloneString(name),TRUE); // TRUE means respect quotes struct slName *descList = NULL; if (description) descList = slNameListOfUniqueWords(cloneString(description),TRUE); struct trackDb *tdbList = *pTdbList; struct trackDb *tdbRejects = NULL; struct trackDb *tdbMatched = NULL; while (tdbList != NULL) { struct trackDb *tdb = slPopHead(&tdbList); if (!tdbIsComposite(tdb)) slAddHead(&tdbRejects,tdb); else if (group && differentString(tdb->grp,group)) slAddHead(&tdbRejects,tdb); - else if (name && !doesNameMatch(tdb, nameList)) + else if (name && !searchNameMatches(tdb, nameList)) slAddHead(&tdbRejects,tdb); - else if (description && !doesDescriptionMatch(tdb, descList)) + else if (description && !searchDescriptionMatches(tdb, descList)) slAddHead(&tdbRejects,tdb); else slAddHead(&tdbMatched,tdb); } *pTdbList = tdbRejects; //warn("matched %d tracks",slCount(tdbMatched)); return tdbMatched; } static boolean mdbSelectsAddFoundComposites(struct slPair **pMdbSelects,struct trackDb *tdbsFound) // Adds a composite mdbSelect (if found in tdbsFound) to the head of the pairs list. // If tdbsFound is NULL, then add dummy composite search criteria { // create comma separated list of composites