f003629f68153a2913857d282fe1ebf9614d1791
tdreszer
  Thu Apr 7 13:22:40 2011 -0700
Make fileIndex an implied mdb var as far as file search is concerned.
diff --git src/hg/lib/fileUi.c src/hg/lib/fileUi.c
index e7c46e3..9ca8db7 100644
--- src/hg/lib/fileUi.c
+++ src/hg/lib/fileUi.c
@@ -831,71 +831,79 @@
 if (slCount(mdbList) == 0)
     {
     printf("<DIV id='filesFound'><BR>No files found.<BR></DIV><BR>\n");
     return 0;
     }
 
 // Now sort mdbObjs so that composites will stay together and lookup of files will be most efficient
 mdbObjsSortOnVars(&mdbList, MDB_VAR_COMPOSITE);
 mdbObjRemoveHiddenVars(mdbList);
 
 #define FOUND_FILE_LIMIT 1000
 int fileCount = 0;
 // Verify file existance and make fileList of those found
 struct fileDb *fileList = NULL, *oneFile = NULL; // Will contain found files
 struct mdbObj *mdbFiles = NULL; // Will caontain a list of mdbs for the found files
-while(mdbList && fileCount < FOUND_FILE_LIMIT)
+while(mdbList && fileCount < FOUND_FILE_LIMIT)    // TODO: collapse this and the hgFileUi version into a single function.
     {
+    char buf[512];
     boolean found = FALSE;
     struct mdbObj *mdbFile = slPopHead(&mdbList);
     char *composite = mdbObjFindValue(mdbFile,MDB_VAR_COMPOSITE);
     if (composite != NULL)
         {
         // First for FileName
         char *fileName = mdbObjFindValue(mdbFile,MDB_VAR_FILENAME);
         if (fileName != NULL)
             {
             oneFile = fileDbGet(db, ENCODE_DCC_DOWNLOADS, composite, fileName);
             if (oneFile)
                 {
                 //warn("%s == %s",fileType,oneFile->fileType);
                 if (isEmpty(fileType) || sameWord(fileType,"Any")
                 || (oneFile->fileType && sameWord(fileType,oneFile->fileType)))
                     {
                     slAddHead(&fileList,oneFile);
                     oneFile->mdb = mdbFile;
                     slAddHead(&mdbFiles,oneFile->mdb);
                     fileCount++;
                     found = TRUE;
                     if (fileCount == FOUND_FILE_LIMIT)
                         break;
                     }
                 }
                 else
                     fileDbFree(&oneFile);
             }
         // Now for FileIndexes
+        if (fileName && endsWith(fileName,".bam")) // Special to fill in missing .bam.bai's
+            {
+            safef(buf,sizeof(buf),"%s.bai",fileName);
+            fileName = buf;
+            }
+        else
         fileName = mdbObjFindValue(mdbFile,MDB_VAR_FILEINDEX);
         if (fileName != NULL)
             {
            // Verify existance first
             oneFile = fileDbGet(db, ENCODE_DCC_DOWNLOADS, composite, fileName);
             if (oneFile)
                 {
                 //warn("%s == %s",fileType,oneFile->fileType);
                 if (isEmpty(fileType) || sameWord(fileType,"Any")
-                || (oneFile->fileType && sameWord(fileType,oneFile->fileType)))
+                || (oneFile->fileType && sameWord(fileType,oneFile->fileType))
+                || (oneFile->fileType && sameWord(fileType,"bam") && sameWord("bam.bai",oneFile->fileType))) // TODO: put fileType matching into search.c lib code to segregate index logic.
                    {
                     slAddHead(&fileList,oneFile);
                     if (found) // if already found then need two mdbObjs (assertable but then this is metadata)
                         oneFile->mdb = mdbObjClone(mdbFile);  // Do we really need to clone this?
                     else
                         oneFile->mdb = mdbFile;
                     slAddHead(&mdbFiles,oneFile->mdb);
                     fileCount++;
                     found = TRUE;
                     continue;
                     }
                 else
                     fileDbFree(&oneFile);
                 }
             }