287cb0c3c49f136e48a97b923ce48561f670bed9
tdreszer
  Mon Jan 31 10:36:08 2011 -0800
By Cricket's request, added -composite as an special case option for commonly queried var
diff --git src/hg/lib/mdb.c src/hg/lib/mdb.c
index cae4db3..0e3c418 100644
--- src/hg/lib/mdb.c
+++ src/hg/lib/mdb.c
@@ -726,30 +726,63 @@
     mdbByVar->var = cloneString(var);
     mdbByVar->varType = (varType==NULL?vtUnknown:mdbVarTypeStringToEnum(varType));
 
     if(val != NULL)
         {
         struct mdbLimbVal * limbVal;
         AllocVar(limbVal);
 
         limbVal->val    = cloneString(val);
         mdbByVar->vals = limbVal; // Only one
         }
 
 return mdbByVar;
 }
 
+boolean mdbByVarAppend(struct mdbByVar *mdbByVars,char *var, char *varType,char *val,boolean notEqual)
+/* Adds a another var to a list of mdbByVar pairs to be used in metadata queries. */
+{
+// Does var already exist in mdbByVars?
+enum mdbVarType newVarType = (varType==NULL?vtUnknown:mdbVarTypeStringToEnum(varType));
+struct mdbByVar *mdbByVar = mdbByVars;
+for(;mdbByVar!=NULL;mdbByVar=mdbByVar->next)
+    {
+    if (sameString(mdbByVar->var,var) && mdbByVar->varType == newVarType && mdbByVar->notEqual == notEqual)
+        {
+        struct mdbLimbVal * limbVal = mdbByVar->vals;
+        for(;limbVal!=NULL;limbVal=limbVal->next)
+            {
+            if (sameString(limbVal->val,val))
+                return FALSE; // Nothing to do as this var is already there.
+            }
+        struct mdbLimbVal * newLimbVal;
+        AllocVar(newLimbVal);
+
+        newLimbVal->val    = cloneString(val);
+        slAddTail(&(mdbByVar->vals),newLimbVal);
+        return TRUE;
+        }
+    }
+
+// Not found so add it
+struct mdbByVar *newVar = mdbByVarCreate(var, varType,val);
+newVar->notEqual = notEqual;
+slAddTail(&mdbByVars,newVar); // Add to tail to avoid changing passed in pointer
+
+return TRUE;
+}
+
 struct mdbObj *mdbObjCreate(char *obj,char *var, char *varType,char *val)
 /* Creates a singular mdbObj query object based on obj and all other optional params. */
 {
 struct mdbObj *mdbObj = NULL;
 
     if(obj == NULL)
         errAbort("Need obj to create mdbObj query object.\n");
 
     AllocVar(mdbObj);
     mdbObj->obj     = cloneString(obj);
 
     if(var != NULL)
         {
         struct mdbVar * mdbVar;
         AllocVar(mdbVar);