3f2a7e329617570143825bbe01153672cabf5723
tdreszer
  Fri Jan 14 14:54:02 2011 -0800
Added some support routines for file searching/sorting code
diff --git src/hg/lib/mdb.c src/hg/lib/mdb.c
index f23dc30..71e52d6 100644
--- src/hg/lib/mdb.c
+++ src/hg/lib/mdb.c
@@ -1632,30 +1632,68 @@
     return sameOk(foundVal,val);
     }
 struct mdbVar *mdbVar = NULL;
 for(mdbVar=mdbObj->vars;mdbVar!=NULL;mdbVar=mdbVar->next)
     {
     if(differentStringNullOk(var,mdbVar->var) != 0)
         continue;
     if(differentStringNullOk(val,mdbVar->val) != 0)
         continue;
     return TRUE;
     }
 
 return FALSE;
 }
 
+boolean mdbObjsContainAtleastOne(struct mdbObj *mdbObjs, char *var)
+// Returns TRUE if any object in set contains var
+{
+struct mdbObj *mdbObj = mdbObjs;
+for(;mdbObj!=NULL; mdbObj=mdbObj->next)
+    {
+    if(mdbObjContains(mdbObj, var, NULL))
+        return TRUE;
+    }
+return FALSE;
+}
+
+struct mdbObj *mdbObjsCommonVars(struct mdbObj *mdbObjs)
+// Returns a new mdbObj with all vars that are contained in every obj passed in.
+// Note that the returnd mdbObj has a meaningles obj name and vals.
+{
+if (mdbObjs == NULL || mdbObjs->vars == NULL)
+    return NULL;
+struct mdbObj *mdbObj = mdbObjs;
+struct mdbObj *commonVars = mdbObjClone(mdbObj); // Clone the first obj then prune it
+commonVars->next = NULL;
+struct mdbVar *mdbVar = mdbObj->vars;            // Will walk through the first obj's vars
+mdbObj=mdbObj->next;                             // No need to include first obj in search
+if (mdbObj != NULL)
+    {
+    struct dyString *dyPruneVars = dyStringNew(512);
+    for(; mdbVar != NULL; mdbVar = mdbVar->next )
+        {
+        if (mdbObjsContainAtleastOne(mdbObj, mdbVar->var) == FALSE)
+            dyStringPrintf(dyPruneVars,"%s ",mdbVar->var);  // var not found so add to prune list
+        }
+    if (dyStringLen(dyPruneVars) > 0)
+        mdbObjRemoveVars(commonVars,dyStringContents(dyPruneVars));
+    dyStringFree(&dyPruneVars);
+    }
+return commonVars;
+}
+
 boolean mdbByVarContains(struct mdbByVar *mdbByVar, char *val, char *obj)
 // Returns TRUE if var contains val, obj or both
 {
 if (mdbByVar != NULL)
     {
     struct mdbLimbVal *limbVal = NULL;
     struct mdbLeafObj *leafObj = NULL;
     if(mdbByVar->valHash != NULL && val != NULL)
         {
         limbVal = hashFindVal(mdbByVar->valHash,val);
         if(limbVal == NULL || limbVal->val == NULL)
             return FALSE;
         if(limbVal->objHash != NULL && obj != NULL)
             {
             leafObj = hashFindVal(limbVal->objHash,obj);
@@ -2512,15 +2550,29 @@
 if (termHash != NULL)
     {
     char *searchable = hashFindVal(termHash,"searchable");
     if (searchable != NULL)
         {
         if (sameWord(searchable,"select"))
             return cvsSearchBySingleSelect;
         if (sameWord(searchable,"freeText"))
             return cvsSearchByFreeText;
         }
     }
 return cvsNotSearchable;
 }
 #endif///ndef CV_SEARCH_SUPPORTS_FREETEXT
 
+const char *cvLabel(char *term)
+// returns cv label if term found or else just term
+{
+// Get the list of term types from thew cv
+struct hash *termTypeHash = mdbCvTermTypeHash();
+struct hash *termHash = hashFindVal(termTypeHash,term);
+if (termHash != NULL)
+    {
+    char *label = hashFindVal(termHash,"label");
+    if (label != NULL)
+        return label;
+    }
+return term;
+}